原文はこちら。
https://blogs.oracle.com/developers/oracle-functions%3a-serverless-on-oracle-cloud-developers-guide-to-getting-started-quickly
12月にクラウドネイティブサービスについての大規模な
大規模なアナウンスをしましたが、
その一部としてOracle Functionsという新しいサービスも発表しました。Oracle Functionsは、Functions as a Service(FaaS)、あるいはDockerコンテナを利用して実行されるホストされたサーバーレスだと考えればよいでしょう。サービスのベースとなっているオープンソースである
Fn Project自体は新しいものではありませn。しかし、Oracleのクラウド経由でサーバーレスファンクションを迅速にデプロイし、起動することができるようになったことで、以前よりも実装がとても容易になりました。このサービスは現時点ではLimited Availabilityです(トライしてみたい方は
こちらから登録ください)が、開発者のみなさんが簡単にOracle Cloudでサーバーレスを始められるように、情報をまとめてみようと思います。このポストでは、テナンシーを設定し、Oracle Functionsであなたの最初のアプリケーションやファンクションをデプロイし起動するために必要なステップを一通り見ていきます。
まず始める前に、Oracle Cloudテナンシーの設定を行っておく必要があります。Oracle Functionsは現時点ではPhoenixリージョンのみで利用可能となっているため、Limited Availabilityトライアルを行う場合、あなたのテナンシーがPhoenixリージョンに登録してあることを確認しましょう。リージョンのチェック、登録方法は以下のGIFを見てください。
また、OCI CLIをインストールしていない場合、インストールしておきましょう。というかなんでインストールしてないんですか?コンソールにログインせずにテナンシーに関することはほとんどなんでもできるので、すごく便利ですよ!
残っている設定作業はステップが多く時間もかかるものです。誰だって設定作業に時間を取られるのは嫌だし、そんなことするよりも早くコードを書いてファンクションをデプロイしたいですよね……なのでテナンシーでOracle Functionsを使うために必要なステップを全部まとめてシェルスクリプトにしておきました。
ただし、スクリプトに一通り目を通し、何をやっているのかをしっかり理解してからスクリプトを実行するようにしてください。このスクリプトでは、あなたのクラウドテナンシーに以下の変更/追加を加えます:
- FaaS専用のコンパートメントを作成
- FaaSユーザー用のIAMグループを作成
- FaaSユーザーを作成
- 後でDockerログインに使うためのユーザー認証トークンを作成
- FaaSユーザーをFaaSグループに追加
- グループIAMポリシーを作成
- VCNを作成
- VCN内に3つのサブネットを作成
- VCNにインターネットゲートウェイを作成
- VCNのルートテーブルをインターネットゲートウェイへのトラフィックを許可するよう更新
- VCNのデフォルトトラフィックセキュリティリストを80番ポートのトラフィックを許可するよう更新
- 作成した全ての認証情報のサマリを表示
これらのとても多くの作業を通常、コンソールUIから行わなくてはならなくてはなりません。しかしOCI CLIからこのスクリプトを使用することで、30秒で完了することができるのです。スクリプトへのリンクを貼る前に念押ししますが、スクリプトに目を通し、何をしているのか理解してから使ってください。まず最初に、1~20行目に含まれている、作成するオブジェクトの名前と値のところを修正(あるいは少なくとも確認)する必要があります。
ここまでで必要な警告とディスクレイマーは済ませました。
スクリプトはここにあります。ダウンロードしたら実行可能かチェックして、実行しましょう。コンパートメントを作成してから他のオブジェクトに利用可能になるまでにはやや時間がかかる関係で、もしかするとVCNを作成するところでいくつか失敗が発生するかもしれません。これは想定されており、そのあたりに自動リトライ処理を入れてあるので問題ないです。スクリプトによってテナンシーでOracle Functionsを使う準備が整い、次のステップに進むことができるようになるでしょう。以下はスクリプトを実行した結果の出力の例です。
| Created compartment faas-compartment with ID ocid1.compartment.oc1..[redacted]na |
| Created group faas-group with ID ocid1.group.oc1..[redacted]vq |
| Created user faas-user with ID ocid1.user.oc1..[redacted]va |
| Created Auth Token. Remember this token, it can not be retrieved in the future: ew[redacted]et |
| Added user faas-user to group faas-group |
| Action completed. Waiting until the resource has entered state: ACTIVE |
| Created policy faas-demo-policy. Use the command: 'oci iam policy get --policy-id ocid1.policy.oc1..[redacted]sa' if you want to view the policy. |
| Creating VCN. This may take a few seconds... |
| ServiceError: |
| { |
| "code": "NotAuthorizedOrNotFound", |
| "message": "Authorization failed or requested resource not found.", |
| "opc-request-id": "[redacted]", |
| "status": 404 |
| } |
| [create failed, trying again in 10 seconds...] |
| Created VCN faas-demo-vcn with ID ocid1.vcn.oc1.phx.[redacted]ma |
| Created subnets: faas-subnet-1, faas-subnet-2, faas-subnet-3 |
| Created internet gateway faas-internet-gateway with ID ocid1.internetgateway.oc1.phx.[redacted]kq |
| Updated default route table for VCN to allow traffic to internet gateway |
| Updated default security list to open port 80 for all subnets in VCN |
| |
| Remember to save the generated auth token: |
| |
| ew[redacted]et |
| |
| This token is used for Docker login, with the username [redacted]/faas-user. |
| Your new compartment ID is ocid1.compartment.oc1..[redacted]na |
| Your subnet IDs are: |
| |
| faas-subnet-1: ocid1.subnet.oc1.phx.[redacted]2q |
| faas-subnet-2: ocid1.subnet.oc1.phx.[redacted]hq |
| faas-subnet-3:ocid1.subnet.oc1.phx.[redacted]na |
| |
| Use these subnets for your Fn applications. |
| Your user ID is: ocid1.user.oc1..[redacted]va |
| You can use the following profile section to modify your OCI CLI config for use with Fn (you'll need to generate a key and populate the necessary key related items): |
| [faas] |
| user=ocid1.user.oc1..[redacted]va |
| fingerprint=<public-key-fingerprint> |
| key_file=<private-key-pem-file> |
| tenancy=[redacted] |
| region=us-phoenix-1 |
| pass_phrase=<passphrase> |
次に、署名鍵を作成しましょう。クイックスタートガイドから引用します:
ここまできてコンソールUIを使うのが面倒だという場合は、以下のようにOCI CLIを使って鍵をアップロードすることもできます:
1
|
oci iam user api-key upload --user- id ocid1.user.oc1..[redacted]ra --key- file <path-to-key- file > --region <home-region>
|
次に、OCI CLIの設定ファイル(~/.oci/config)をテキストエディタで開き、上記のスクリプトで生成されたprofileセクションを貼り付け、新しい署名鍵の値で上書きしておきましょう。
ここで、Dockerがあなたのローカル環境にインストール済であることを確認してください。たぶん大丈夫だと思いますが、そうでもなかったら
Docker docsを見て自分のプラットフォームに合ったものをインストールしてください。インストールされているかは以下のコマンドで確認しましょう:
では、上記のスクリプトで生成しておいた認証情報でDockerにログインしてみましょう:
ユーザー名をスクリプトの出力(<tenency>/<username> の形式)からコピーして使い、生成された認証トークンはDockerログインパスワードとして使用されます。
それではFn CLIをインストールしましょう。
GitHubのFn projectに行くとプラットフォームごとのインストール手順が説明されています。うまくいったかどうか確認するには、以下を実行しましょう:
いよいよFnの設定の仕上げにかかりましょう。またFnクイックスタートを参考にします:
Function開発者ユーザーで開発環境にログインして:
以下を入力して新規Fn Project CLIコンテクストを作成します:
1
|
fn create context <my-context> --provider oracle
|
以下を入力してFn Project CLIが新しいコンテクストを使用するように指定します:
1
|
fn use context <my-context>
|
新しく作ったコンテクストにFunctionsをデプロイしたいコンパートメントのOCIDを設定しましょう:
1
|
fn update context oracle.compartment- id <compartment-ocid>
|
新しく作ったコンテクストにFn Project APIを呼ぶ際に使用するapi-urlエンドポイントを設定しましょう:
1
|
fn update context api-url <api-endpoint>
|
以下は例です:
1
|
fn update context api-url https: //functions .us-phoenix-1.oraclecloud.com
|
新しく作ったコンテクストに、DockerレジストリとOracle Functionsと使いたいリポジトリのアドレスを指定しましょう:
1
|
fn update context registry <region-code>.ocir.io/<tenancy-name>/<repo-name>
|
以下は例です:
1
|
fn update context registry phx.ocir.io /acme-dev/acme-repo
|
新っく作ったコンテクストに、Oracle Functionsを使うために作成しておいたプロファイルを設定しましょう:
1
|
fn update context oracle.profile <profile-name>
|
さて、ここまででアプリケーションを作成する準備ができました。Oracle Functionsでは、アプリケーションというのは、共通の設定値のコンテクストを共有しているサーバーレスファンクションのグループのことです。クイックスタートではコンソールUIを使ってアプリケーションを作成する方法が説明されていますが、ここでは引き続きコマンドラインを使って素早く行っていきましょう。以下を実行してアプリケーションを作成します:
1
|
fn create app faas-demo --annotation oracle.com /oci/subnetIds = '["ocid1.subnet.oc1.phx.[redacted]ma"]'
|
先ほど作成したサブネットIDのうち、少なくともひとつをここのJSON配列に含める必要があります。複数のサブネットを含めておくことで可用性を高められます。アプリケーションを表示するには、以下を実行します:
以下を実行してひとつめのファンクションを作成しましょう:
1
|
fn init --runtime node faas-demo-func-1
|
この例ではNodeJSを使用していますが、様々なランタイムがサポートされていることは知っておいてください。現時点ではランタイムはGo、Java 8、Java 9、Node、Python 3.6、Python 3.7、Ruby、Kotlinから選ぶことができます。ファンクションが生成されると、以下のような出力が表示されます:
1
2
3
|
Creating function at: /faas-demo-func-1
Function boilerplate generated.
func.yaml created.
|
では、新規作成されたディレクトリに行き、生成されたファイルを見てみましょう。func.yamlファイルはFnがプロジェクトやトリガーなどのメタデータ定義のために使用するファイルです。いったんこのYAMLは置いといて、func.jsをテキストエディタで開いてみましょう。以下のようになっているはずです:
1
2
3
4
5
6
7
8
9
|
const fdk=require( '@fnproject/fdk' );
fdk.handle( function (input){
let name = 'World' ;
if (input.name) {
name = input.name;
}
return { 'message' : 'Hello ' + name}
})
|
シンプルなHello Worldです。しかしあなたは必要に応じてファンクションをパワフルにすることができます。Oracle Cloudの同一サブネット内のDBと接続したりとか、オブジェクトストレージを使用したりとか、様々なことができます。ここではこのファンクションをデプロイして、起動してみましょう。ファンクションのルートディレクトリ(さっきのYAMLファイルがあったところです)で以下のコマンドを実行するとデプロイできます。以下のような出力が表示されるでしょう:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
fn deploy --app faas-demo
Deploying faas-demo-func-1 to app: faas-demo
Bumped to version 0.0.2
Building image phx.ocir.io/[redacted] /faas-repo/faas-demo-func-1 :0.0.2 .
Parts: [phx.ocir.io [redacted] faas-repo faas-demo-func-1:0.0.2]
Pushing phx.ocir.io/[redacted] /faas-repo/faas-demo-func-1 :0.0.2 to docker registry...The push refers to repository [phx.ocir.io/[redacted] /faas-repo/faas-demo-func-1 ]
1bf689553076: Pushed
9703c7ab5d87: Pushed
0adc398bfc34: Pushed
0b3e54ee2e85: Pushed
ad77849d4540: Pushed
5bef08742407: Pushed
0.0.2: digest: sha256:94d9590065a319a4bda68e7389b8bab2e8d2eba72bfcbc572baa7ab4bbd858ae size: 1571
Updating function faas-demo-func-1 using image phx.ocir.io/[redacted] /faas-repo/faas-demo-func-1 :0.0.2...
Successfully created function : faas-demo-func-1 with phx.ocir.io/[redacted] /faas-repo/faas-demo-func-1 :0.0.2
|
FnによってファンクションがDockerコンテナにコンパイルされ、DockerコンテナがOracle Dockerレジストリにプッシュされ、こうしてファンクションを起動する準備が整いました。では次のコマンドで起動してみましょう(一つ目の引数はアプリケーション名、二つ目はファンクション名です):
1
2
|
fn invoke faas-demo faas-demo-func-1
{ "message" : "Hello World" }%
|
初回の起動はちょっと時間がかかります。というのも、FnがDockerコンテナをpullして立ち上げなければならないからです。なので次からは速くなりますよ。この方法がファンクションを起動する唯一の方法というわけではありません。HTTPエンドポイントに署名を付けてリクエストするなどの方法はありますが、その話題は別のポストにとっておきましょう。
では、アプリケーションの設定変数を追加してみましょう:
1
|
fn update app faas-demo --config defaultName=Person
|
前述の通り、設定はアプリケーション内の全てのファンクションで共有されています。あるファンクションから設定変数にアクセスするには、環境変数から取得してきます。例として使っているNodeファンクションを設定変数を使用するように更新し、デプロイして起動してみましょう:
1
2
3
4
5
6
7
8
9
|
const fdk=require( '@fnproject/fdk' );
fdk.handle( function (input){
let name = process.env.defaultName || 'World' ;
if (input.name) {
name = input.name;
}
return { 'message' : 'Hello ' + name}
})
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
$ fn deploy --app faas-demo
Deploying faas-demo-func-1 to app: faas-demo
Bumped to version 0.0.3
Building image phx.ocir.io/[redacted] /faas-repo/faas-demo-func-1 :0.0.3 .
Parts: [phx.ocir.io [redacted] faas-repo faas-demo-func-1:0.0.3]
Pushing phx.ocir.io/[redacted] /faas-repo/faas-demo-func-1 :0.0.3 to docker registry...The push refers to repository [phx.ocir.io/[redacted] /faas-repo/faas-demo-func-1 ]
7762ea1ed77f: Pushed
1b0d385392d8: Pushed
0adc398bfc34: Layer already exists
0b3e54ee2e85: Layer already exists
ad77849d4540: Layer already exists
5bef08742407: Layer already exists
0.0.3: digest: sha256:c6537183b5b9a7bc2df8a0898fd18e5f73914be115984ea8e102474ccb4126da size: 1571
Updating function faas-demo-func-1 using image phx.ocir.io/[redacted] /faas-repo/faas-demo-func-1 :0.0.3...
$ fn invoke faas-demo faas-demo-func-1
{ "message" : "Hello Person" }%
|
以上がOracle Functionsでのサーバーレスファンクション開発のスタートガイドの基本的な部分でした。Fnプロジェクトはもっと沢山のガイドを提供しているので、そちらもぜひ読んでみることをおすすめします。もっと深く知りたいという方は、
Limited Availabilityプログラムに登録するのも忘れずに。