本ブログは、オラクル・クラウドの個人ブログの1つです。
初めに
OCI Functionsを呼び出すのは、以下の様々な方法があります。
- Fn Project CLI
- OCI CLI
- OCI SDK
- HTTPリクエスト
- その他のOCIサービス (Event, Notification, Streamingなど)
今回は、API Gatewayを経由し、OCI Functionsを呼び出す方法を紹介します。
STEP
1. 事前準備
2. OCI Functionの作成
3. 動的グループとポリシーの作成
4. API GWからの呼出し
1. 事前準備
OCI上に、以下のリソースを作成しておきます。
分類 | リソース | 名前 | コメント |
---|---|---|---|
IAM | Compartment | PoC | root/PoC (作業用) |
User | 任意 | IDCSユーザか、OCIユーザかどちらでもよい。 | |
Auth Token | 作成後、Tokenをメモしておく(コンソールに再度表示しない)。 (作成方法は、ドキュメントをご参照。) |
||
ネットワーク関連 | VCN | VCN1 | |
Subnet | Public Subnet1 | パブリック | |
Internet GW | IGW1 | 外部からのHTTPリクエストは必要のため | |
Route Table | Route Table for Public Subnet1 | IGW1を追加 | |
Security List | Security List for Public Subnet1 | Ingress Rule: TCP 443を許可 Egress Rule: All <region> services In Oracle Services Network, TCP All |
情報収集
取得項目 | 内容 | コメント |
---|---|---|
Region Key | nrt | 確認方法は、一覧表をご参照ください。 |
Region ID | ap-tokyo-1 | 確認方法は同上 |
Compartment OCID | この例は、root/PoCのOCIDです。 | MENU->Identity->Compartments から取得 |
Tenancy Namespace | 以下の画面で、ご確認ください。 | Tenancy名ではないので、ご注意ください。 |
コンソールの右上のプロファイルから、Tenancyをクリックし、情報詳細画面に進んでください。
"Object Storage Namespace"の内容となります。Namespaceは、Tenancy名と異なることがあります。
作業ターミナル
OCI Cloud Shellに、Docker,Fn Projectなどのツールは既に実装済で、今回の例はCloud Shellを利用します。
liu_wei@cloudshell:~ (ap-tokyo-1)$ docker -v
Docker version 19.03.11-ol, build f0aae77
liu_wei@cloudshell:~ (ap-tokyo-1)$ fn version
Client version: 0.6.1 is not latest: 0.6.5
Server version: ?
liu_wei@cloudshell:~ (ap-tokyo-1)$
2. OCI Functionの作成
OCI Registoryにログイン
コマンド:docker login <region-key>.ocir.io
コマンド実施後、ユーザ名とパスワードの入力が要求されます。
ユーザ名: <tenancy-namespace>/<user-name>
<tenancy-namespace>は、上記の情報収集画面で確認します。
<user-name>は、IDCSユーザかOCIユーザの名前です。(Cloud Shellに表示されるユーザ名ではありません。)
IDCSユーザの場合、"oracleidentitycloudservice/xxxxxx"という形式で入力してください。
パスワード: 事前に作成したAuth Tokenの値です。
Functionの設定
Contextの一覧を確認します。
コマンド:fn list context
liu_wei@cloudshell:~ (ap-tokyo-1)$ fn list context
CURRENT NAME PROVIDER API URL REGISTRY
* ap-tokyo-1 oracle-cs https://functions.ap-tokyo-1.oraclecloud.com
default oracle-cs
liu_wei@cloudshell:~ (ap-tokyo-1)$
利用中のRegionを指定していない場合、以下のコマンドで指定します。
コマンド例:fn use context ap-tokyo-1
Compartmentを設定します。
コマンド:fn update context oracle.compartment-id <Compartment-OCID>
liu_wei@cloudshell:~ (ap-tokyo-1)$ fn update context oracle.compartment-id ocid1.compartment.oc1.<略>
Current context updated oracle.compartment-id with ocid1.compartment.oc1.<略>
liu_wei@cloudshell:~ (ap-tokyo-1)$
Registry URLを設定します。
コマンド:fn update context registry <region-key>.ocir.io/<tenancy-namespace>/<registry-project-name>
liu_wei@cloudshell:~ (ap-tokyo-1)$ fn update context registry nrt.ocir.io/tenancy-namespace/my-func-prj
Current context updated registry with nrt.ocir.io/tenancy-namespace/my-func-prj
liu_wei@cloudshell:~ (ap-tokyo-1)$ fn list context
CURRENT NAME PROVIDER API URL REGISTRY
* ap-tokyo-1 oracle-cs https://functions.ap-tokyo-1.oraclecloud.com nrt.ocir.io/tenancy-namespace/my-func-prj
default oracle-cs
liu_wei@cloudshell:~ (ap-tokyo-1)$
~/.fn/contextsの下に、設定ファイルが作成されました。
liu_wei@cloudshell:contexts (ap-tokyo-1)$ pwd
/home/liu_wei/.fn/contexts
liu_wei@cloudshell:contexts (ap-tokyo-1)$ ll
total 8
-rw-r--r--. 1 liu_wei oci 228 Apr 20 08:21 ap-tokyo-1.yaml
-rw-r--r--. 1 liu_wei oci 33 Oct 13 2020 default.yaml
liu_wei@cloudshell:contexts (ap-tokyo-1)$ cat ap-tokyo-1.yaml
api-url: https://functions.ap-tokyo-1.oraclecloud.com
oracle.compartment-id: ocid1.compartment.oc1.略
provider: oracle-cs
registry: nrt.ocir.io/tenancy-namespace/my-func-prj
liu_wei@cloudshell:contexts (ap-tokyo-1)$
アプリケーションの作成
MENU->Developer Services->Functions
Functionの作成
言語はJAVA,Python,NodeのどちらでもOKです。この例は、Pythonを利用します。
作業用ディレクトリを作成します。
liu_wei@cloudshell:~ (ap-tokyo-1)$ pwd
/home/liu_wei
liu_wei@cloudshell:~ (ap-tokyo-1)$ mkdir my-app
liu_wei@cloudshell:~ (ap-tokyo-1)$ cd my-app
liu_wei@cloudshell:my-app (ap-tokyo-1)$
Python Functionの作成
コマンド:fn init --runtime python <Function Name>
liu_wei@cloudshell:my-app (ap-tokyo-1)$ fn init --runtime python my-func-helloworld
Creating function at: ./my-func-helloworld
Function boilerplate generated.
func.yaml created.
liu_wei@cloudshell:my-app (ap-tokyo-1)$ ll
total 0
drwxr-xr-x. 2 liu_wei oci 62 Apr 20 09:03 my-func-helloworld
liu_wei@cloudshell:my-app (ap-tokyo-1)$ ll my-func-helloworld/
total 12
-rw-r--r--. 1 liu_wei oci 576 Apr 20 09:03 func.py
-rw-r--r--. 1 liu_wei oci 147 Apr 20 09:03 func.yaml
-rw-r--r--. 1 liu_wei oci 3 Apr 20 09:03 requirements.txt
liu_wei@cloudshell:my-app (ap-tokyo-1)$
Deploy Function
コマンド:fn -v deploy --app <Application Name>
Function格納用ディレクトリに移動してから、コマンドを実施します。
liu_wei@cloudshell:my-app (ap-tokyo-1)$ pwd
/home/liu_wei/my-app
liu_wei@cloudshell:my-app (ap-tokyo-1)$ cd my-func-helloworld/
liu_wei@cloudshell:my-func-helloworld (ap-tokyo-1)$ fn -v deploy --app HelloWorld
Deploying my-func-helloworld to app: HelloWorld
<略>
Functionの呼び出し
コマンド:fn invoke <Application Name> <Function Name>
初回目は、少し時間がかかりますけど、二回目よりすぐ終わります。
liu_wei@cloudshell:my-func-helloworld (ap-tokyo-1)$ fn invoke HelloWorld my-func-helloworld
{"message": "Hello World"}
liu_wei@cloudshell:my-func-helloworld (ap-tokyo-1)$
パラメータで呼び出し
liu_wei@cloudshell:my-func-helloworld (ap-tokyo-1)$ echo -n '{"name":"Wei"}' | fn invoke HelloWorld my-func-helloworld
{"message": "Hello Wei"}
liu_wei@cloudshell:my-func-helloworld (ap-tokyo-1)$
Endpointの確認
コマンド:fn inspect function <Application Name> <Function Name>
OCIコンソールでも確認できます。
EndpointのURLをクリックしたら、以下の画面が表示されます。これは想定内の動作です。
ここまで、Function自体の作成は完了です。これから、API GWでの呼び出しを設定します。
3. 動的グループとポリシーの作成
グループ名:API-GW-DG
ルール: ALL {resource.type = 'ApiGateway', resource.compartment.id = 'ocid1.compartment.<your-compartment-OCID>'}
ポリシー名:API-GW-Policy
ステートメント:
Allow dynamic-group <Dynamic Group Name> to use functions-family in compartment <your-compartment-name>
4. API GWからの呼出し
API Gatewayの作成
MENU->Developer Services->API Management->Gateways
API GW作成後、Deploymentの作成に進んでください。
API Request Polices: デフォルトのまま
次のページは、確認画面です。確認完了後、作成を開始します。
作成終了後、Endpointをコピーします。
WEBブラウザを開き、Endpointを入力したら、今回は"Hello World"が正しく表示されます。
URLの例:https://<OCID>.apigateway.ap-tokyo-1.oci.customer-oci.com
/v1/helloworld
もし、正しく表示されなかったら、以下のことをチェックしてください。
- Ingress Ruleには、TCP 443ポートを許可していますか?
- URLの入力間違いがありませんか?"/v1"の後ろ、"/helloworld"を忘れないでください。
CURLでAPI Endpointを経由し、Functionを呼び出します。
コマンド:curl <Endpoint_URL>
liu_wei@cloudshell:~ (ap-tokyo-1)$ curl https://xxxxxxxx.apigateway.ap-tokyo-1.oci.customer-oci.com/v1/helloworld
{"message": "Hello World"}liu_wei@cloudshell:~ (ap-tokyo-1)$
注意:もしSTEP-3のポリシー作成を漏れたら、上記CURLコマンドを実施すると、以下のエラーが発生されます。
{"code":500,"message":"Internal Server Error"}
最後
この例は、Cloud ShellでOCI Functionの作成を実施しました。もちろん、ローカルの端末か、クラウド上のVMでも実施するのは可能です。その場合、OCI CLI、DockerとFn Projectのインストールと設定作業は必要です。なお、管理者以外のユーザの場合、ポリシーの追加も必要です。
自分が、"Cloud Shell"とクラウド上のVMの両方で実施したことがあります。比較的に、"Cloud Shell"のほうは、やり易くて、お勧めです。
以上
関連記事
オラクル・クラウドの個人ブログ一覧
OCI Functionで郵便番号から住所を検索する
参考ドキュメント
Functions: APIゲートウェイを使用したファンクションのコール
クラウド・シェルでのファンクションのクイックスタート
OCI Functionsのトラブルシューティング