Oracle Cloudでサーバーレス

f:id:ts0818:20201004220133j:plain

並列分散処理(へいれつぶんさんしょり、parallel distributed processing , PDP)とは、認知科学における人間をコンピューターのような記号処理系とみなす指導原理の下、遅くて不正確なハードウェアである「脳」を持つ人間が無意識下で行っているとされる情報処理方式、特にそのモデル(PDPモデル)を言う

並列分散処理 - Wikipedia

人間の認知を解明する認知科学において、情報の並列分散処理を論ずることが心の働きを理解するに不可欠であるとするコネクショニズムの登場と共に提案されたパーセプトロンニューラルネットワークの推論モデルである。

並列分散処理 - Wikipedia

⇧ まぁ、確かに、あれこれ考えてしまうのが人間の性と言えなくもないですが、「並列」も「分散」もプログラミングだと実装が複雑になるって話で、人間っていうのは複雑なことをサラッと行っているんだな~、改めて思う今日この頃ですかね。

 

今回もどうでもいい話から入ってしまいましたが、 無料トライアルが終わるという時になって、

github.com

チュートリアルとかが見つかるという...

 

んで、Oracleの日本支部としては、PaaS(Platform as a Service)に力を入れたいのか分からんのだけれど、

oracle-japan.github.io

⇧ PassS(Platform as a Service)以外の○○ as a Service 的なドキュメントが見当たらないという...

まぁ、 

boxil.jp

⇧ 上記サイト様によりますと、 ○○ as a Service ってのは結構キリがないぐらい出てくるみたいなのですが...

 

というわけで、せっかくなんで、Oracle Cloudでサーバレスを試してみようかと。

結論から申し上げますと、エラーが出て途中で行き詰ってるので、お時間のある方のみご照覧ください。

レッツトライ~。

 

Oracle CloudではFaaS(Function as a Service)はPaaS(Platform as a Service)の一部らしい

Oracle Cloudでは、PaaS(Platform as a Service)のドキュメントにFaaS(Function as a Service)が記載されていることから、FaaS(Function as a Service)はPaaS(Platform as a Service)に含まれるということみたいね。

 

一般的には、

devops.stackexchange.com

⇧ 「PaaS(Platform as a Service)」と「SaaS(Software as a Service)」の間に位置するのが「FaaS(Function as a Service)」ということらしい。

 

ちなみに、

www.atmarkit.co.jp

つまり私が言いたいのは、『FaaS、PaaS、CaaSといった区別は人工的なものだ』ということだ。私がKnativeを気に入っている理由は、『そんな区別などすっかり忘れてしまえ、Knativeはこれこれの機能を提供する』と宣言できるからだ。Knativeを『FaaS』と呼ぶ人がいれば、『PaaS』と呼ぶ人もいるだろう。『シンプルに使えるKubernetes』と表現する人もいるかもしれない。どう呼ばれようが、私にとってはどうでもいい。『あなたのニーズに合っているなら使ってくれ』ということに尽きる」

https://www.atmarkit.co.jp/ait/articles/1909/20/news068.html

⇧ 「PaaS(Platform as a Service)」とか「FaaS(Function as a Service)」とか「CaaS(Container as a Service)」とかの区別を無くしちゃえってのが「Knative」ってことらしいんだけど、何故、現場を混乱させようとすることをするのか...

「Knative」の解釈の仕方が複数通りになってしまうと、各々で文脈が異なって認識齟齬を生み出す結果にしかならんのだと思うのだが...

 

「Knative」については、

cloud.google.com

最新のサーバーレス ワークロードをビルド、デプロイ、管理できる Kubernetes ベースのプラットフォーム

https://cloud.google.com/knative?hl=ja

⇧ 「サーバーレス」+「Kubernetes」ってことみたいね。

 

まぁ、脱線しましたが、ベンダー毎に独自解釈を定義されると、それだけ、デベロッパーにとっては負担になるので止めて欲しいんだけどな...

 

Oracle Cloud でサーバーレスを実施してみる

もう、無料トライアルが終わってしまうので、せめて、1つぐらいOracle Cloudの機能を使ってみようということで、Oracle Cloudでサーバーレスを試してみようということで、

oracle-japan.github.io

oracle-japan.github.io

⇧ 上記の2つのチュートリアルを実施すれば、サーバーレスの入門(ビギナー向け)が完了しそうな模様。

 

そんでは、「Oracle Functionことはじめ」のほうから実施していってみます。

Oracle Cloudの管理画面のUIが変わったのか、ドキュメントの誤りなのか分からんけど、キャプチャ画像と説明が一致してないので、合ってるのかよく分からん...

⇧ 明らかに、説明文とキャプチャ画像の選択が乖離しているというね...

チュートリアルの意味あるのかね...

github.com

⇧ というわけで、Issue 上げてみました。

Issueの回答が来る前に、無料トライアルが終わりそうなんで、致し方ないけど、正解が分からん状態でチュートリアルを進めました。

2020年10月22日(木):追記 ↓ ここから

18日後の本日、修正対応の旨の連絡が届きました。

まぁ、某Microsoftさんみたいに対応するする詐欺をすることもなく、ちゃんと利用者の声を拾ってくれるみたいなんで、ホっとしましたが、ドキュメントが整備されるまでは、無料トライアルは時期尚早だったかしらね...

ちなみに、Microsoft さん10年経っても対応しないという暴挙に!流石に大企業ともなると違いますね!

social.microsoft.com

⇧ 10年経とうしてる時点で、コロナとか関係ない気がする。

Hi Is_mstn,

Yes, we can repro this issue on my side. And we have added it into our bug database.

Thank you for reporting it. I think it should be fixed soon. :)

Thanks again.

2009年12月16日 9:42

 

https://social.microsoft.com/Forums/SECURITY/ja-JP/e8c38fe1-df36-4dfc-8dd5-50613b1a7984/robocopys-mt-option-disables-np-option?forum=w7itprogeneral

⇧ 気軽に、期待感を持たせることは言わないが吉ということでしょうね。

2020年10月22日(木):追記 ↑ ここまで

 

■事前準備

・ポリシーの設定

Oracle CloudでFaaS(Function as a Service)を使うために必要なポリシーを作成・設定を行います。

Oracle Cloudのコンソールにログインし、「アイデンティティ」>「ポリシー」を選択。

f:id:ts0818:20201004102234p:plain

「ポリシーの作成」を選択。

f:id:ts0818:20201004102510j:plain

以下を設定して「作成」を押下。

設定項目 設定内容
 名前  適当でOK。
 説明  適当でOK。
 ポリシーのバージョニング  ポリシーを最新の状態に維持
 ポリシー・ビルダー
   ステートメント1
 Allow service FaaS to use virtual-network-family in tenancy
 ポリシー・ビルダー
   ステートメント2
 Allow service FaaS to read repos in tenancy

まさかの、「ステートメント」がリストとかで選択できないから、テキスト直書きというね、UIが残念過ぎるのだが... 

f:id:ts0818:20201004103329j:plain

「ポリシー」が作成されました。

f:id:ts0818:20201004104156p:plain

 

■コンピュートインスタンス・ネットワークの作成

・ネットワークの作成(VCN:Virtual Cloud NetWork)

まずは、ネットワークを作成します。

「ネットワーキング」>「仮想クラウド・ネットワーク」を選択。

f:id:ts0818:20201004104833p:plain

表示された画面左下の"スコープ"内の"コンパートメント"をクリックし、ルートコンパートメント(各々の環境に合わせてください)を選択します。

※ルートコンパートメントはOracle Cloudの登録時に設定した名称になります。

コンパートメントが選択できたら、「VCNウィザードの起動」。(ドキュメントのキャプチャ画像が旧いのか、画面のUIが変わってるので)

f:id:ts0818:20201004105417j:plain

「インターネット接続性を持つVCN」を選択し、「VCNウィザードの起動」を押下。(ドキュメントだと『"VPN接続およびインターネット接続性を持つVCN"を選択し、"ワークフローの起動"』っていう説明になってけど)

f:id:ts0818:20201004112859p:plain

以下を設定し、「次」を押下。

設定項目 設定内容
 基本情報
   VCN名
 任意の名前(こだわりがなければ"Oracle Functions Handson")
 基本情報
   コンパートメント
 ルートコンパートメント。
 VCNとサブネット構成
   VCN CIDRブロック
 10.0.0.0/16
 VCNとサブネット構成
   パブリック・サブネット
   CIDRブロック
 10.0.0.0/24
 VCNとサブネット構成
   プライベート・サブネット
   CIDRブロック
 10.0.1.0/24

f:id:ts0818:20201004115648p:plain

「作成」を押下。

f:id:ts0818:20201004121006j:plain

「リソース」の作成ですべて「完了」となればOK(エラーとか出た場合は、「プロビジョニングの再試行」とかすればOK。)

「仮想クラウド・ネットワークの表示」を押下。

f:id:ts0818:20201004121205p:plain

ネットワークの作成(VCN:Virtual Cloud NetWork)が完了。

f:id:ts0818:20201004121605j:plain

 

・コンピュートインスタンスの作成

続いて、Oracle Cloud 上で仮想マシンを作成します。(Oracle Functionsを動作させるために利用するコンピュートインスタンスの作成ってことなんだけど、おそらく、Oracle Functions のプログラムを配置するサーバー用のマシンってことかと)

「コンピュート」>「インスタンス」を選択。

f:id:ts0818:20201004122341p:plain

「コンパートメント」が「ルートコンパートメント」に設定されてることを確認し、「インスタンスの作成」を押下。

f:id:ts0818:20201004122634j:plain

「イメージの変更」を押下。

f:id:ts0818:20201004122916j:plain

Oracleイメージ」タブを選択。

f:id:ts0818:20201004123509j:plain

Oracle Cloud Developer Image」にチェックを入れ、「イメージの選択」を押下。

f:id:ts0818:20201004123850j:plain

「シェイプ、ネットワークおよびストレージ・オプションの表示」のリンクをクリックし、「ネットワーキングの構成」が以下の設定になっていることを確認。

設定項目 設定内容
 仮想クラウド・ネットワーク・コンパートメント  ルートコンパートメント
 仮想クラウド・ネットワークの選択  「仮想クラウド・ネットワークの作成」で作成したネットワークを設定。
 サブネット・コンパートメント  ルートコンパートメント
 サブネット 「仮想クラウド・ネットワークの作成」で作成したパブリック・サブネットを設定。
 パブリックIPアドレスの割当て  チェックを入れる

f:id:ts0818:20201004124857j:plain


続いて、作成するインスタンスSSH接続するために、ローカル環境に配置している公開鍵を追加する。

デフォルトだと「SSHキー・ペアの生成」にチェックが付いていますが、既にSSHキー・ペアを作成している想定らしいのすが、SSHキー・ペアを作成していない場合は、「SSHキー・ペアの生成」を先に実施すれば良いかと。

今回は、「SSHキー・ペアの生成」で「秘密鍵」「公開鍵」を取得しておきます。

「秘密キーの保存」「公開キーの保存」で、ダウンロードできる模様。

f:id:ts0818:20201004125910p:plain

f:id:ts0818:20201004131351p:plain

⇧ 「秘密鍵」「公開鍵」がローカル環境にダウンロードされています。

適当な場所に移しておきます。(自分は「C:\Users\[ユーザー名]\.ssh\oracle-cloud\compute-instance」ってフォルダを作って、そこに配置しました。)

f:id:ts0818:20201004131637p:plain

 

そしたら、「公開鍵」を作成しようとするインスタンスにアップロードします。

「公開キー・ファイルの選択」にチェックをし、「または場所を参照します。」のリンクを押下。

f:id:ts0818:20201004130224j:plain

「公開鍵」を選択。(今回は、先ほど「SSHキー・ペアの生成」でダウンロードしておいた「公開鍵」を選択しました。)

f:id:ts0818:20201004131918p:plain


「作成」を押下で。(仮想マシンのイメージを選択してから30分以上経ってると、同意の有効期限が切れてえらーになるので、その場合は、「インスタンスの作成」押下からやり直しで。自分は時間切れになってエラー出たのでやり直しました。なので、「インスタンス」の「名前」の採番が「1277」から「1322」に変わってます、って言うか僅か30分足らずで自分以外のユーザーによって50個ぐらいインスタンスが作られたってことか...。)

f:id:ts0818:20201004132026p:plain

仮想マシンの作成が実施され、

f:id:ts0818:20201004132632j:plain

「状態」が「成功」になれば、「インスタンス」が作成されたということらしい。

f:id:ts0818:20201004132904p:plain

 

■Fn Project実行環境の構築

インスタンスへログイン

ちなみに、「Fn Project」を使用するには、

oracle-japan.github.io

Fn Projectを起動させるには、以下が必要です。

  • 環境
    • Docker 17.10 (or higher) がインストール済みの環境

今回は、"Oracle Cloud Developer Image"を使用しているので、既にDockerはインストールされています。

https://oracle-japan.github.io/paasdocs/documents/faas/oraclefunctions/handson/getting-started/

そのため、環境構築はFn Projectを動作させるために必要なFn CLIとFn Serverのインストールのみになります。

https://oracle-japan.github.io/paasdocs/documents/faas/oraclefunctions/handson/getting-started/

⇧ ってことみたい。

 

では、ログインですが、まずは、さきほど作成した「インスタンス」の「IPアドレス」を確認します。

f:id:ts0818:20201004134814j:plain

で、「ユーザー名」を「opc」として、「秘密鍵」を指定してSSH接続を試みるも、はい、エラー。(と言うか、インスタンスのデフォルトのユーザー名は「opc」って考えておけば良いのか、「Oracle Cloud Developer Image」を使って作成したインスタンスに限るのか説明を載せて欲しいな...)

ssh -i [秘密鍵のパス] [接続先マシンのユーザー名]@[接続先マシンのIPアドレス]

f:id:ts0818:20201004144057p:plain

⇧ って言うか「__PROGRAMDATA__\\ssh/ssh_config」ってどのフォルダのことを指してるのか分からんし...

 

「C:\ProgramData\ssh\ssh_config」ってことで良いのかしらね?

f:id:ts0818:20201004150954p:plain

f:id:ts0818:20201004151151p:plain

⇧ 上記の設定で怒られてるようなので、行ごと消します。

再度、接続を試みたところ、接続できました。

f:id:ts0818:20201004151720j:plain


・Fn CLIとFn Serverのインストール

インスタンスに「Fn」をインストールで。その前に、「opc」ユーザーで「Docker」を操作できるように権限を付与。

sudo usermod -aG docker opc    

f:id:ts0818:20201004152640p:plain

で、一旦、ログアウトし、再ログイン。

そしたら、「Fn」をインストール。

curl -LSs https://raw.githubusercontent.com/fnproject/cli/master/install | sh    

f:id:ts0818:20201004153125p:plain

「fn start」でサーバー側も初期化しときます。

f:id:ts0818:20201004183717p:plain

f:id:ts0818:20201004183805p:plain

⇧ 起動が確認できたら、「Ctrlキー」+「C」でサーバーを停止しときます。

 


Oracle Functions実行環境の構築
・OCI CLI初期設定

・OCI CLIのセットアップ

以下の記事で、CLIは使えるようにしているので、割愛できると思いきや、 

ts0818.hatenablog.com

何か、CLIを利用するマシンが異なると、設定が必要みたい...

  • ユーザーのOCID
  • テナンシのOCID

CLIの設定に必要に なってくるみたいなので、確認。

まずは「ユーザーのOCID」を確認。

f:id:ts0818:20201004170958j:plain

「OCID」を「コピー」でテキストエディタなどにコピペ。

f:id:ts0818:20201004171244j:plain

続いて、「テナンシのOCID」を確認。

f:id:ts0818:20201004171030j:plain

「OCID」を「コピー」でテキストエディタなどにコピペ。

f:id:ts0818:20201004171551j:plain

そしたらば、スーパーユーザーに切り替えて、以下を実施。

oci setup config    

f:id:ts0818:20201004172344p:plain

⇧ 何も入力せず「Enterキー」を押下。

f:id:ts0818:20201004172613j:plain

⇧ 「ユーザーのOCID」を設定して「Enterキー」を押下。

f:id:ts0818:20201004172854j:plain

⇧ 「テナンシのOCID」を設定して「Enterキー」を押下。

f:id:ts0818:20201004173055j:plain

⇧ 自分の利用している「リージョン」を設定して「Enterキー」を押下。

f:id:ts0818:20201004173318j:plain

⇧ 「Y」を設定し「Enterキー」を押下。

f:id:ts0818:20201004173523j:plain

⇧残りの質問は 何も入力せず「Enterキー」を押下。

以下のコマンドで、「公開鍵」を表示してテキストエディタなどにコピペしておきます。

cat /root/.oci/oci_api_key_public.pem    

f:id:ts0818:20201004173953j:plain

OCIコンソールで「公開鍵」を登録します。

f:id:ts0818:20201004174217j:plain

APIキー」を選択。

f:id:ts0818:20201004174405j:plain

「公開キーの追加」を押下。

f:id:ts0818:20201004174600j:plain

コピペしておいた「公開鍵」のテキストを張り付けて、「追加」を押下。

f:id:ts0818:20201004174910j:plain

追加されました。

f:id:ts0818:20201004175130j:plain

 

Oracle Functions CLI contextの作成と設定

アイデンティティ」>「コンパートメント」を選択。 

f:id:ts0818:20201004153959p:plain

「ルートコンパートメント」を選択。

f:id:ts0818:20201004154553j:plain

「OCID」を「コピー」で。テキストエディタなんかにコピペしときます。

f:id:ts0818:20201004154746j:plain


・認証tokenの作成 

OCIR(Oracle Functionsを管理するOracle提供のプライベートDockerレジストリ)にログインするための認証tokenを作成。

「ユーザー名」を押下。

f:id:ts0818:20201004155249j:plain

「認証トークン」を選択。

f:id:ts0818:20201004155534j:plain

トークンの生成」を押下。

f:id:ts0818:20201004155725j:plain

「説明」を適当に入力し、「トークンの生成」を押下。

f:id:ts0818:20201004155916j:plain

「コピー」を押下で、テキストエディタなどにコピペしておきます。

※再表示がされないようなので、確実に「コピー」してテキストエディタなどに保存しておきます。

f:id:ts0818:20201004160313j:plain


Oracle Functions開発環境の作成

・開発環境の作成
fn createコマンドを使用してcontext(開発環境)を作成。「my-context」部分は適当でOK。

fn create context [my-context] --provider oracle

f:id:ts0818:20201004160815p:plain


・開発環境への切り替え 

fn useコマンドを使用して、作成した環境に切り替えます。

fn use context [my-context]    

f:id:ts0818:20201004161130p:plain

 

・開発環境の設定

開発環境に以下を設定する。

  • コンパートメントID
  • APIエンドポイント
  • OCIR(Oracleが提供するプライベートDockerレジストリであり、Oracle Functionsの管理を行うサービス)

コンパートメントIDを設定。(「アイデンティティ」>「コンパートメント」>「コンパートメントの詳細」で確認できる「OCID」のこと。)

fn update context oracle.compartment-id [compartment-ocid]    

f:id:ts0818:20201004161942j:plain

Oracle Functionsを呼び出す際のAPIエンドポイントを設定します。(自分が利用している「リージョン」を選択する。)

fn update context api-url https://functions.[リージョン].oraclecloud.com

f:id:ts0818:20201004163545j:plain

OCIRを設定。(「tenancy-namespace」には、「管理」>「テナンシ詳細」で確認できる「オブジェクト・ストレージ・ネームスペース」の値を設定。「region-code」って言うのは、「CLI」のコマンドで確認できる「key」を小文字にしたものみたい。)

f:id:ts0818:20201004175412p:plain

⇧ 自分の場合は、「リージョン」が「us-ashburn-1」なので「region-code」は「iad」になるということらしい。「repo-name」は何でも良さ気?なのかな、特に指定がないみたいなので。

では、以下のコマンドを実施で、OCIRを設定。

fn update context registry [region-code].ocir.io/[tenancy-namespace]/[repo-name]

f:id:ts0818:20201004180029j:plain

Oracle Functionsで使用するprofile名を設定。

fn update context oracle.profile "DEFAULT"

f:id:ts0818:20201004180216j:plain

OCIRにログインできることを確認。「Username」と「Password」は以下を設定。

項目 設定内容
 Username  [tenancy-namespace]/[ユーザーのOCIDと同じページに表示される電子メールの値]
 Password  「認証tokenの作成」で作成し、コピペしておいたトーク
docker login [region-code].ocir.io

f:id:ts0818:20201004180741j:plain

 

Oracle Functionsのアプリケーション作成 

Oracle Functionsのアプリケーションの作成を行います。

「開発者サービス」>「ファンクション」を選択。

f:id:ts0818:20201004181958j:plain

「アプリケーションの作成」を押下。

f:id:ts0818:20201004182156j:plain

「名前」は適当でOK。ネットワークは、作成したネットワーク(VCN:Virtual Cloud NetWork)の内容を設定。「作成」を押下。

f:id:ts0818:20201004182506j:plain

作成されました。 

f:id:ts0818:20201004182702p:plain

 

■ファンクションの作成

・ファンクションプロジェクトの作成

ファンクションプロジェクトを作成します。今回は、Javaで。

fn init --runtime java helloworld-func

f:id:ts0818:20201004182949p:plain

 

・ファンクションのデプロイ

 作成したファンクションのデプロイを行います。その前に、コマンドプロンプトをもう1つ起ち上げて、「Fn」のサーバーを起動しておきます。

f:id:ts0818:20201004184002p:plain

で、デプロイしようとするも、

f:id:ts0818:20201004205214j:plain

「Fn: unable to find tenancyID in environment or configuration.」とか言われるし...

いや、だから「tenancyID」は、ちゃんと設定してるんだけどな...

f:id:ts0818:20201004204950j:plain

う~ん、手順通りアプリケーションも作成してるんだけどな...

f:id:ts0818:20201004193951j:plain

試しに、「インスタンス」を再起動してみるも、変わらず...

気になるのは、「tenancyID」と「compartmentID」が全く同じ値になってるというところなんですよね...

手順通りに実施したつもりなんだけどな...

リカバリーの情報が少なくて、どうすりゃ良いか分からんし、これでビギナー向けってのが...やる気が出なくなるな...

とりあえず、

docs.cloud.oracle.com

トラブルシューティングにも、それっぽい情報が無いしな...

う~ん、分からん...1日無駄に過ごしてしまったし、無料トライアルが終わっちまうし、踏んだり蹴ったりですな...

無料トライアルが終わっても実施できそうなら、再度、一からチュートリアルを実施してみますか。

 

その前に、Issueに出したんで、ドキュメント修正して欲しいけど...

今日も貴重な時間を無駄にしてしまった...こんなことなら小説を読んで過ごせば良かったな...

2020年10月5日(月)追記:↓ ここから

悲報...

無料トライアルが終わり、「ファンクション」は利用できないってよ

f:id:ts0818:20201005181027p:plain

まぁ、サーバレスは、「Fn Project」を使用してローカル環境で試していくしかなさそうね...

2020年10月5日(月)追記:↑ ここまで

今回はこのへんで。