LoginSignup
4
3

API GWでOCI Functionsの呼び出し

Last updated at Posted at 2021-04-21

初めに

OCI Functionsを呼び出すのは、以下の様々な方法があります。

  • Fn Project CLI
  • OCI CLI
  • OCI SDK
  • HTTPリクエスト
  • その他のOCIサービス (Event, Notification, Streamingなど)

今回は、API Gatewayを経由し、OCI Functionsを呼び出す方法を紹介します。
oracle-funcs-api-gtw-diagram.png

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
(or NSG)
Security List for Public Subnet1 Ingress Rule: TCP 443を許可

情報収集

取得項目 内容 コメント
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名と異なることがあります。
image.png
Namepace.JPG

作業ターミナル
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
image.png

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.JPG

EndpointのURLをクリックしたら、以下の画面が表示されます。これは想定内の動作です。
Browser.JPG
ここまで、Function自体の作成は完了です。これから、API GWでの呼び出しを設定します。

3. 動的グループとポリシーの作成

グループ名:API-GW-DG
ルール: ALL {resource.type = 'ApiGateway', resource.compartment.id = 'ocid1.compartment.<your-compartment-OCID>'}
DG.JPG

ポリシー名:API-GW-Policy
ステートメント:
Allow dynamic-group <Dynamic Group Name> to use functions-family in compartment <your-compartment-name>
image.png

4. API GWからの呼出し

API Gatewayの作成
MENU->Developer Services->API Management->Gateways

API Deploymentの作成
API-GW.JPG

API GW作成後、Deploymentの作成に進んでください。
API Request Polices: デフォルトのまま

次のページ:

次のページは、確認画面です。確認完了後、作成を開始します。
作成終了後、Endpointをコピーします。
API-Deployment.JPG

WEBブラウザを開き、Endpointを入力したら、今回は"Hello World"が正しく表示されます。
URLの例:https://<OCID>.apigateway.ap-tokyo-1.oci.customer-oci.com/v1/helloworld
もし、正しく表示されなかったら、以下のことをチェックしてください。

  1. Ingress Ruleには、TCP 443ポートを許可していますか?
  2. 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"のほうは、やり易くて、お勧めです。

以上

関連記事
オラクル・クラウド関連の個人ブログ


参考ドキュメント
Functions: APIゲートウェイを使用したファンクションのコール

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3