6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

目次

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 Namespace の取得
コンソール画面の右上にあるプロファイルメニューから「テナンシ」をクリックし、詳細情報画面に進んでください。
image.png

そこで「Object Storage Namespace(オブジェクト・ストレージ・ネームスペース)」の値を確認します。
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 の方が比較的手軽で、個人的にはおすすめです。

以上


関連記事
OCI Functionで郵便番号から住所を検索する

参考ドキュメント
Functions: APIゲートウェイを使用したファンクションのコール
クラウド・シェルでのファンクションのクイックスタート
OCI Functionsのトラブルシューティング

6
5
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
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?