Functions: APIゲートウェイを使用したファンクションのコール
このチュートリアルでは、Oracle Functionsを使用して、Oracle API Gatewayから渡されるデータを処理します。ランタイム・コンテキストを使用してリクエストで渡されたHTTP情報を抽出するPythonファンクションを作成します。
主なタスクは:
- 必要な情報を収集します。
- ファンクションのアプリケーションを作成します。
- 「Hello World!」ファンクションを作成します。
- ランタイム・コンテキスト・データを処理するように、ファンクションを変換します。
- ファンクションをデプロイおよびテストします。
- ファンクションのAPIゲートウェイを作成します
- APIゲートウェイを使用して、インターネットからファンクションをコールします。
その他の情報については、次のWebサイトを参照してください。
開始する前に
このチュートリアルを正常に実行するには、次が必要です:
- 有料Oracle Cloud Infrastructureアカウント。Oracle Cloud Infrastructureへのサインアップを参照してください。
- Oracle Functions開発をサポートするように構成されたOCIアカウント。クラウド・シェルでのOracle Functionsのクイックスタートを参照してください。
- Oracle Functionsの2つの概要チュートリアルのいずれかを完了します。
- 2つのチュートリアルのいずれかを完了すると、次のようになります:
- Oracle Functionsは、アプリケーションを作成してファンクションをデプロイするために設定および構成されます。
- Oracle Registryは、ファンクション・イメージを格納するように設定されます。
- DockerはOracle Registryにログインしています。
- Oracle Functionsに必要なVCNおよび必要なリソース。
- APIキー・ペアおよび認証トークン。
Oracle CLI
- Python 3.6以上およびpip3。
- Dockerエンジン: LinuxコンピュータまたはLinux VM。サポートされているバージョンおよびディストリビューションについては、Dockerエンジンの要件を参照してください。
- Dockerデスクトップ: MacOSまたはWindows 10で使用可能です。
- Windows 10: WSL 2およびUbuntuまたはその他のディストリビューションがインストールされたWindows 10 update 2004。
ノート
Dockerには、Windows 10 update 2004でのWSL 2に対する特別なLinuxサポートが含まれています。 - MacOS: MacOS用Dockerデスクトップのインストールを参照してください。
- Windows 10: WSL 2およびUbuntuまたはその他のディストリビューションがインストールされたWindows 10 update 2004。
Oracle Cloud Shell
- クラウド・シェルを使用する場合、前述のソフトウェアのリストはすでにインストールされています。
1. 必要な情報の収集
チュートリアルを完了するために必要なすべての情報を収集します。次の情報をメモ帳にコピーします。
コンパートメントを作成するには、コンパートメントの作成を参照してください。コンパートメントを作成したら、コンパートメントOCIDとコンパートメント名を保存します。
既存のコンパートメントからコンパートメントOCIDを取得するには:
- ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします。「アイデンティティ」で、「コンパートメント」をクリックします。
- コンパートメントを選択します。
- OCIDフィールドの「コピー」リンクをクリックします。
コンパートメントOCIDとコンパートメント名を保存します。
チュートリアル用に次の情報を書き留めていることを確認してください。
-
コンパートメント名:
<your-compartment-name>
例:
my-compartment
-
コンパートメントID: <
<your-compartment-OCID>
例:
ocid1.compartment.oc1.aaaaaaa...
-
VCN名:
<your-vcn-name>
例:
my-vcn
ナビゲーション・メニューを開いて「ネットワーキング」をクリックし、「仮想クラウド・ネットワーク」をクリックします。ネットワークのリストから、ご使用のVCNを選択します。
-
VCNパブリック・サブネット名:
<Public-Subnet-your-vcn-name>
例:
Public-Subnet-my-vcn
ナビゲーション・メニューを開いて「ネットワーキング」をクリックし、「仮想クラウド・ネットワーク」をクリックします。ネットワークのリストから、ご使用のVCNを選択します。
2. 必要な構成の実行
チュートリアルに必要な構成をすべて実行します。
アプリケーションを作成するには、次のステップに従います。
- ナビゲーション・メニューを開き、「開発者サービス」をクリックします。「ファンクション」で、「アプリケーション」をクリックします。
- 「コンパートメント」ドロップダウンからコンパートメントを選択します。
- 「アプリケーションの作成」をクリックします。
- フォーム・データを入力します。
- 名前:
<your-app-name>
- VCN:
<your-vcn-name>
- サブネット:
<Public-Subnet-your-vcn-name>
- 名前:
- 「作成」をクリックします。
アプリケーションが作成されます。
- ナビゲーション・メニューを開いて「ネットワーキング」をクリックし、「仮想クラウド・ネットワーク」をクリックします。
- Oracle Functionsアプリケーションに使用したVCNの名前をクリックします。
- 新しいVCNが表示された状態で、「パブリック」サブネット・リンクをクリックします。
パブリック・サブネット情報は、ページの下部にあるセキュリティ・リストとともに表示されます。
- 「デフォルト・セキュリティ・リスト」リンクまたは適切なセキュリティ・リスト・リンクをクリックします。
VCNのデフォルトのイングレス・ルールが表示されます。
- 「イングレス・ルールの追加」をクリックします。
「イングレス・ルールの追加」ダイアログが表示されます。
- イングレス・ルールに次の情報を入力します。すべてのデータを入力したら、「イングレス・ルールの追加」をクリックします
イングレス・ルールを次のように入力します:
- ステートレス: 選択
- ソース・タイプ: CIDR
- ソースCIDR: 0.0.0.0/0
- IPプロトコル: TCP
- ソース・ポート範囲: (空白のまま)
- 宛先ポート範囲: 443
- 説明: アプリケーションのVCN
「イングレス・ルールの追加」をクリックすると、パブリック・サブネットへのHTTPS接続が許可されます。
次に、APIゲートウェイによるファンクションの呼出しを許可するポリシーを設定します。
最初に、APIゲートウェイの動的グループを作成します。
- ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします。「アイデンティティ」で、「動的グループ」をクリックします。
- 「動的グループの作成」をクリックします。
- 次の情報を入力して、動的グループを定義します。
- 名前:
<name-for-your-dynamic-group>
- 「一致ルール」で、ルール1:
<the-rule-text>
を使用します
次に、サンプル名と、入力する必要があるルールを示します。
<your-compartment-OCID>
をその値に置き換えます。- 名前: api-gtw-func-dynamic-group
- 「一致ルール」で、ルール1:
ALL {resource.type = 'ApiGateway', resource.compartment.id = '<your-compartment-OCID>'}
を使用します
- 名前:
- 「作成」をクリックします。
ここで、APIゲートウェイのポリシーを作成します。
- ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします。「アイデンティティ」で、「ポリシー」をクリックします。
- 「ポリシーの作成」をクリックします。
- ポリシーを定義するには、次の情報を入力します。
- 名前:
<name-for-your-policy>
- 説明:
<description-for policy>
- コンパートメント:
<name-of-functions-compartment>
「ポリシー・ビルダー」セクションで:
- 「手動エディタの表示」をクリックします。
- テキスト・ボックスにポリシーを入力します。次に例を示します:
Allow dynamic-group api-gtw-func-dynamic-group to use functions-family in compartment <your-compartment-name>
ノート
最後のパラメータは、コンパートメントOCIDではなく、コンパートメント名です。
- 名前:
- 「作成」をクリックします。
APIゲートウェイによるFunctionsの使用を許可するポリシーが作成されました。
- ターミナルを開きます。
- ファンクションを格納するディレクトリを作成し、そのディレクトリに移動します。
mkdir my-dir-name cd my-dir-name
- Fnを使用してPythonの「Hello World」ファンクションを作成します。
fn init --runtime python my-func-name
このコマンドは、ファンクションおよび構成ファイルを含む
my-func-name
という名前のディレクトリを作成します。 - そのディレクトリに移動します。
- ファンクションをデプロイします。
fn -v deploy --app your-app-name
Dockerイメージが作成され、OCIRにプッシュされ、最終的にOracle Functionsにデプロイされると、様々なメッセージが表示されます。
- ファンクションを呼び出します。
fn invoke your-app-name my-func-name
戻り値:
{"message": "Hello World"}
- パラメータを指定してファンクションを呼び出します。
echo -n '{"name":"Bob"}' | fn invoke your-app-name my-func-name
戻り値:
{"message": "Hello Bob"}
3. APIゲートウェイの作成
ファンクションをコールするには、APIゲートウェイを作成します。
APIゲートウェイを作成するには:
- ナビゲーション・メニューを開き、「開発者サービス」をクリックします。「API管理」で、「ゲートウェイ」をクリックします。
- 「コンパートメント」ドロップダウンからコンパートメントを選択します。
- 「ゲートウェイの作成」をクリックします
- 次の情報を入力して、APIゲートウェイを定義します。
- 名前:
<your-gateway-name>
- タイプ:
<Public>
- コンパートメント:
<your-compartment-name>
- <your-vcn-name>の仮想クラウド・ネットワーク:
<select-your-vcn>
- <your-compartment-nameのサブネット:
<your-public-subnet-name>
- 名前:
- 「作成」をクリックします。APIゲートウェイが作成されるまで数分間待ちます。
次に、APIゲートウェイのデプロイメントを作成します。
- 画面左側の「リソース」セクションで、「デプロイメント」をクリックします。
- 「デプロイメントの作成」をクリックします。
- デプロイメント・タイプに「最初から」が選択されていることを確認します。
- デプロイメントを定義するには、「基本情報」セクションに入力します。
- 名前:
<your-deployment-name>
- パス接頭辞(例):
/v1
- コンパートメント:
<your-compartment-name>
- APIリクエスト・ポリシー: デフォルト値を使用します
- APIロギング・ポリシー: 「情報」のデフォルト値を使用します
- 名前:
- 「次」をクリックします。「ルート1」が選択された状態で「ルート」ダイアログが表示されます。
- ルートを定義するには、「ルート1」セクションに入力します。
- パス:
<your-route-path>
例:
/http-info
- メソッド:
GET POST
- タイプ: Oracle Functions
<your-compartment-name>
のアプリケーション 作成したFunctionsアプリケーションを選択します。- ファンクション名: 構成セクションで作成したファンクションを選択します。
- パス:
- 「次」をクリックします。選択内容をまとめた「確認」ダイアログが表示されます。
- 「作成」をクリックします。デプロイメントが作成されます。
- ゲートウェイの「デプロイメント」リンクをクリックします。作成したデプロイメントのベース・エンドポイントをコピーします。
例:
https://aaaaa.apigateway.us-ashburn-X.oci.customer-oic.com/v1
APIゲートウェイおよびデプロイメントを作成すると、インストールをテストできます。curl
コマンドの単純なスクリプトを作成します。curl
のURLを作成するには、エンドポイントにデプロイメント・パスを追加します。
- スクリプト・ファイル
touch gtw01.sh && chmod 755 gtw01.sh
を作成します - スクリプト・ファイルにcurlコマンドを追加します:
#!/bin/bash curl <your-api-gateway-endpoint>/http-info
- コマンドの戻り値:
{"message":"Hello World"}
APIゲートウェイがボイラー・プレートPythonファンクションに接続されました。次に、HTTPリクエストで渡された情報を表示するようにPythonファンクションを更新します。
4. HTTPおよびファンクション・データにアクセスするためのファンクションの更新
次に、ランタイム・コンテキストにアクセスしてHTTP情報を表示するように、ボイラー・プレートPythonファンクションを変更します。
ボイラー・プレート・ファンクションを見ると、Pythonファンクションは次のようになります。
import io
import json
import logging
from fdk import response
def handler(ctx, data: io.BytesIO = None):
name = "World"
try:
body = json.loads(data.getvalue())
name = body.get("name")
except (Exception, ValueError) as ex:
logging.getLogger().info('error parsing json payload: ' + str(ex))
logging.getLogger().info("Inside Python Hello World function")
return response.Response(
ctx, response_data=json.dumps(
{"message": "Hello {0}".format(name)}),
headers={"Content-Type": "application/json"}
)
このコードを開始点として使用して、後続の項では、ファンクションを、HTTPおよび構成データを返すPythonファンクションに変換します。
まず、必要なパッケージのファンクションを更新します。
oci
パッケージのrequirements.txt
ファイルを更新します。fdk oci
- HTTP機能に必要なパッケージについて、
func.py
のimport
文を更新します:import io import json import oci import logging from urllib.parse import urlparse, parse_qs
一部のコンテキスト・リクエストには、
oci
パッケージが必要です。urlparse, parse_qs
パッケージは解析に使用されます。
まず、ファンクションの本体を削除します。進捗状況に応じて、response
メソッドおよび関連するコードが追加されます。
import io
import json
import oci
import logging
from urllib.parse import urlparse, parse_qs
from fdk import response
def handler(ctx, data: io.BytesIO = None):
次に、レスポンスにHTTP情報を表示するコードを追加します。コメント付きのコードを次に示します。
import io
import json
import oci
import logging
from urllib.parse import urlparse, parse_qs
from fdk import response
def handler(ctx, data: io.BytesIO = None):
logging.getLogger().info("HTTP function start")
resp = {}
# retrieving the request headers
headers = ctx.Headers()
logging.getLogger().info("Headers: " + json.dumps(headers))
resp["Headers"] = headers
# retrieving the request body, e.g. {"key1":"value"}
try:
requestbody_str = data.getvalue().decode('UTF-8')
if requestbody_str:
resp["Request body"] = json.loads(requestbody_str)
else:
resp["Request body"] = {}
except Exception as ex:
print('ERROR: The request body is not JSON', ex, flush=True)
raise
# retrieving the request URL, e.g. "/v1/http-info"
requesturl = ctx.RequestURL()
logging.getLogger().info("Request URL: " + json.dumps(requesturl))
resp["Request URL"] = requesturl
# retrieving query string from the request URL, e.g. {"param1":["value"]}
parsed_url = urlparse(requesturl)
resp["Query String"] = parse_qs(parsed_url.query)
logging.getLogger().info("Query string: " + json.dumps(resp["Query String"]))
# retrieving the request method, e.g. "POST", "GET"...
method = ctx.Method()
if method:
logging.getLogger().info("Request Method: " + method)
resp["Request Method"] = method
else:
logging.getLogger().info("No Request Method")
resp["Request Method"] = None
handler
ファンクションは、ctx
およびdata
パラメータを介して、現在のリクエストに関するシステム情報を受け取ります。- すべてのデータは、最終的にレスポンスで返される
resp
ディクショナリに追加されます。 - ファンクション・ランタイム・コンテキスト(
ctx
)には、ヘッダー、リクエストURL、メソッドなど、リクエストから渡されるHTTPデータの多くが含まれていることに注意してください。 data
パラメータは、リクエストの本文を返します。
次に、コンテキストからOracle Functions関連のデータを取得し、レスポンスを返します。コメントが続きます。
# retrieving the function configuration
resp["Configuration"] = dict(ctx.Config())
logging.getLogger().info("Configuration: " + json.dumps(resp["Configuration"]))
# retrieving the Application ID, e.g. "ocid1.fnapp.oc1.phx.aaaaxxxx"
appid = ctx.AppID()
logging.getLogger().info("AppID: " + appid)
resp["AppID"] = appid
# retrieving the Function ID, e.g. "ocid1.fnfunc.oc1.phx.aaaaxxxxx"
fnid = ctx.FnID()
logging.getLogger().info("FnID: " + fnid)
resp["FnID"] = fnid
# retrieving the Function call ID, e.g. "01E9FE6JBW1BT0C68ZJ003KR1Q"
callid = ctx.CallID()
logging.getLogger().info("CallID: " + callid)
resp["CallID"] = callid
# retrieving the Function format, e.g. "http-stream"
fnformat = ctx.Format()
logging.getLogger().info("Format: " + fnformat)
resp["Format"] = fnformat
# retrieving the Function deadline, e.g. "2020-05-29T05:24:46Z"
deadline = ctx.Deadline()
logging.getLogger().info("Deadline: " + deadline)
resp["Deadline"] = deadline
logging.getLogger().info("function handler end")
return response.Response(
ctx,
response_data=json.dumps(resp),
headers={"Content-Type": "application/json"}
)
Functions関連のデータはすべて、AppID
、FnID
およびFormat
などのctx
オブジェクトから取得されることに注意してください。
最終的なファンクション・コードを次に示します。
import io
import json
import oci
import logging
from urllib.parse import urlparse, parse_qs
from fdk import response
def handler(ctx, data: io.BytesIO = None):
logging.getLogger().info("HTTP function start")
resp = {}
# retrieving the request headers
headers = ctx.Headers()
logging.getLogger().info("Headers: " + json.dumps(headers))
resp["Headers"] = headers
# retrieving the request body, e.g. {"key1":"value"}
try:
requestbody_str = data.getvalue().decode('UTF-8')
if requestbody_str:
resp["Request body"] = json.loads(requestbody_str)
else:
resp["Request body"] = {}
except Exception as ex:
print('ERROR: The request body is not JSON', ex, flush=True)
raise
# retrieving the request URL, e.g. "/v1/http-info"
requesturl = ctx.RequestURL()
logging.getLogger().info("Request URL: " + json.dumps(requesturl))
resp["Request URL"] = requesturl
# retrieving query string from the request URL, e.g. {"param1":["value"]}
parsed_url = urlparse(requesturl)
resp["Query String"] = parse_qs(parsed_url.query)
logging.getLogger().info("Query string: " + json.dumps(resp["Query String"]))
# retrieving the request method, e.g. "POST", "GET"...
method = ctx.Method()
if method:
logging.getLogger().info("Request Method: " + method)
resp["Request Method"] = method
else:
logging.getLogger().info("No Request Method")
resp["Request Method"] = None
# retrieving the function configuration
resp["Configuration"] = dict(ctx.Config())
logging.getLogger().info("Configuration: " + json.dumps(resp["Configuration"]))
# retrieving the Application ID, e.g. "ocid1.fnapp.oc1.phx.aaaaxxxx"
appid = ctx.AppID()
logging.getLogger().info("AppID: " + appid)
resp["AppID"] = appid
# retrieving the Function ID, e.g. "ocid1.fnfunc.oc1.phx.aaaaxxxxx"
fnid = ctx.FnID()
logging.getLogger().info("FnID: " + fnid)
resp["FnID"] = fnid
# retrieving the Function call ID, e.g. "01E9FE6JBW1BT0C68ZJ003KR1Q"
callid = ctx.CallID()
logging.getLogger().info("CallID: " + callid)
resp["CallID"] = callid
# retrieving the Function format, e.g. "http-stream"
fnformat = ctx.Format()
logging.getLogger().info("Format: " + fnformat)
resp["Format"] = fnformat
# retrieving the Function deadline, e.g. "2020-05-29T05:24:46Z"
deadline = ctx.Deadline()
logging.getLogger().info("Deadline: " + deadline)
resp["Deadline"] = deadline
logging.getLogger().info("function handler end")
return response.Response(
ctx,
response_data=json.dumps(resp),
headers={"Content-Type": "application/json"}
)
これで、ファンクションを再テストして結果を確認する準備が整いました。
Oracle Functionsでは、リクエストで使用可能なコンテキストに構成データを格納できます。構成データは、アプリケーションまたはファンクションに格納できます。次のコマンドは、アプリケーション・コンテキストにデータベース情報を格納します。
fn config app <your-app-name> DB-NAME your-db-name
fn config app <your-app-name> DB-USER your-user-name
詳細は、Fn Projectのランタイム・コンテキストに関するチュートリアルを参照してください。
- 更新されたファンクションを再デプロイします。
- ファンクションを呼び出して、ファンクションが機能していることを確認します。
- スクリプトを再実行します。フォーマットされたJSON出力を取得するには、クラウド・シェルに含まれている
jq
ユーティリティを使用します。CLIを使用している場合は、ローカル・マシンにjq
をインストールします。gtw01.sh | jq
返されるデータは次のようになります:
{ "Headers": { "host": [ "localhost", "ctr6kqbjpza5tjnzafaqpqif5i.apigateway.us-phoenix-1.oci.customer-oci.com" ], "user-agent": [ "lua-resty-http/0.14 (Lua) ngx_lua/10015", "curl/7.64.1" ], "transfer-encoding": "chunked", "content-type": [ "application/octet-stream", "application/octet-stream" ], "date": "Thu, 10 Dec 2020 01:35:43 GMT", "fn-call-id": "01ES54MAKK1BT0H50ZJ00NGX00", "fn-deadline": "2020-12-10T01:36:13Z", "accept": "*/*", "cdn-loop": "iQPgvPk4HZ74L-PRJqYw7A", "forwarded": "for=73.34.74.159", "x-forwarded-for": "73.34.74.159", "x-real-ip": "73.34.74.159", "fn-http-method": "GET", "fn-http-request-url": "/v1/http-info", "fn-intent": "httprequest", "fn-invoke-type": "sync", "oci-subject-id": "ocid1.apigateway.oc1.phx.0000000000000000000000000000000000000000000000000000", "oci-subject-tenancy-id": "ocid1.tenancy.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "oci-subject-type": "resource", "opc-request-id": "/A79EAB4A240E93EB226366B190A494BC/01ES54MAK21BT0H50ZJ00NGWZZ", "x-content-sha256": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=", "accept-encoding": "gzip" }, "Configuration": { "PATH": "/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "HOSTNAME": "7747cc436a14", "FN_LISTENER": "unix:/tmp/iofs/lsnr.sock", "FN_CPUS": "125m", "FN_LOGFRAME_NAME": "01ES54E5RN00000000000001JF", "FN_LOGFRAME_HDR": "Opc-Request-Id", "FN_FORMAT": "http-stream", "DB-NAME": "your-db-name", "DB-USER": "your-user-name", "FN_APP_ID": "ocid1.fnapp.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "FN_FN_ID": "ocid1.fnfunc.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "FN_MEMORY": "256", "FN_TYPE": "sync", "OCI_RESOURCE_PRINCIPAL_RPST": "/.oci-credentials/rpst", "OCI_RESOURCE_PRINCIPAL_PRIVATE_PEM": "/.oci-credentials/private.pem", "OCI_RESOURCE_PRINCIPAL_VERSION": "2.2", "OCI_RESOURCE_PRINCIPAL_REGION": "us-phoenix-1", "OCI_REGION_METADATA": "{\"realmDomainComponent\":\"oraclecloud.com\",\"realmKey\":\"oc1\",\"regionIdentifier\":\"us-phoenix-1\",\"regionKey\":\"PHX\"}", "LANG": "C.UTF-8", "GPG_KEY": "E3FF2839C048B25C084DEBE9B26995E310250568", "PYTHON_VERSION": "3.8.5", "PYTHON_PIP_VERSION": "20.2.2", "PYTHON_GET_PIP_URL": "https://github.com/pypa/get-pip/raw/5578af97f8b2b466f4cdbebe18a3ba2d48ad1434/get-pip.py", "PYTHON_GET_PIP_SHA256": "d4d62a0850fe0c2e6325b2cc20d818c580563de5a2038f917e3cb0e25280b4d1", "PYTHONPATH": "/function:/python", "HOME": "/home/fn" }, "Request body": {}, "Request URL": "/v1/http-info", "Query String": {}, "Request Method": "GET", "AppID": "ocid1.fnapp.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "FnID": "ocid1.fnfunc.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "CallID": "01ES54MAKK1BT0H50ZJ00NGX00", "Format": "http-stream", "Deadline": "2020-12-10T01:36:13Z" }
AppID
、FnID
およびFormat
など、レスポンスの後半で返されるすべてのFunctionsデータに注意してください。また、Configuration
セクションには、FN_FORMAT
などのFunctions生成の環境変数、および構成変数(DB-NAME
およびDB-USER
)が表示されます。 - ヘッダーおよび
POST
データをスクリプトに渡すように、スクリプトを更新します。/bin/bash curl -X POST --header "X-MyHeader1: headerValue" -d '{"key1":"value"}' https://aaaaa.apigateway.us-ashburn-X.oci.customer-oic.com/v1/http-info
スクリプトからの出力は次のようになります:
{ "Headers": { "host": [ "localhost", "ctr6kqbjpza5tjnzafaqpqif5i.apigateway.us-phoenix-1.oci.customer-oci.com" ], "user-agent": [ "lua-resty-http/0.14 (Lua) ngx_lua/10015", "curl/7.64.1" ], "transfer-encoding": "chunked", "content-type": [ "application/x-www-form-urlencoded", "application/x-www-form-urlencoded" ], "date": "Thu, 10 Dec 2020 17:05:14 GMT", "fn-call-id": "000000000000000000000000000", "fn-deadline": "2020-12-10T17:05:44Z", "accept": "*/*", "cdn-loop": "iQPgvPk4HZ74L-PRJqYw7A", "content-length": "16", "forwarded": "for=73.34.74.159", "x-forwarded-for": "73.34.74.159", "x-myheader1": "headerValue", "x-real-ip": "73.34.74.159", "fn-http-method": "POST", "fn-http-request-url": "/v1/http-info", "fn-intent": "httprequest", "fn-invoke-type": "sync", "oci-subject-id": "ocid1.apigateway.oc1.phx.0000000000000000000000000000000000000000000000000000", "oci-subject-tenancy-id": "ocid1.tenancy.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "oci-subject-type": "resource", "opc-request-id": "/32DE93ED4A72B932E62460362A24DA40/01ES6STAH91BT0G48ZJ00J07ZT", "x-content-sha256": "xMAO2Qww/EVSr1CsSxtHsZu9VicSjb2EMvMmDMjZcVA=", "accept-encoding": "gzip" }, "Configuration": { "PATH": "/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "HOSTNAME": "1afb03686740", "FN_LISTENER": "unix:/tmp/iofs/lsnr.sock", "FN_CPUS": "125m", "FN_APP_ID": "ocid1.fnapp.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "FN_FN_ID": "ocid1.fnfunc.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "FN_MEMORY": "256", "FN_TYPE": "sync", "FN_FORMAT": "http-stream", "DB-NAME": "your-db-name", "DB-USER": "your-user-name", "FN_LOGFRAME_NAME": "01ES6SSJY600000000000000BF", "FN_LOGFRAME_HDR": "Opc-Request-Id", "OCI_RESOURCE_PRINCIPAL_RPST": "/.oci-credentials/rpst", "OCI_RESOURCE_PRINCIPAL_PRIVATE_PEM": "/.oci-credentials/private.pem", "OCI_RESOURCE_PRINCIPAL_VERSION": "2.2", "OCI_RESOURCE_PRINCIPAL_REGION": "us-phoenix-1", "OCI_REGION_METADATA": "{\"realmDomainComponent\":\"oraclecloud.com\",\"realmKey\":\"oc1\",\"regionIdentifier\":\"us-phoenix-1\",\"regionKey\":\"PHX\"}", "LANG": "C.UTF-8", "GPG_KEY": "E3FF2839C048B25C084DEBE9B26995E310250568", "PYTHON_VERSION": "3.8.5", "PYTHON_PIP_VERSION": "20.2.2", "PYTHON_GET_PIP_URL": "https://github.com/pypa/get-pip/raw/5578af97f8b2b466f4cdbebe18a3ba2d48ad1434/get-pip.py", "PYTHON_GET_PIP_SHA256": "d4d62a0850fe0c2e6325b2cc20d818c580563de5a2038f917e3cb0e25280b4d1", "PYTHONPATH": "/function:/python", "HOME": "/home/fn" }, "Request body": { "key1": "value" }, "Request URL": "/v1/http-info", "Query String": {}, "Request Method": "POST", "AppID": "ocid1.fnapp.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "FnID": "ocid1.fnfunc.oc1.phx.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "CallID": "000000000000000000000000000", "Format": "http-stream", "Deadline": "2020-12-10T17:05:44Z" }
ヘッダー・データとリクエスト本文データに注意してください。キー/値のJSONデータは、「Request Body」セクションの下にリストされます。Oracleファンクションのサンプル・サイトからファンクションの完全なソース・コードをダウンロードできます。
完了しました。ボイラー・プレートPythonファンクションが、HTTPおよびOracle Functionsデータを返す新しいファンクションに変換されました。このファンクションは、データをAPIゲートウェイに渡し、ファンクションで処理する方法を示します。
次の手順
APIゲートウェイが正常に作成され、そこからファンクションがコールされました。HTTPおよびOracle Functionsデータを表示するように、ファンクションが更新されました。
Oracle製品を使用した開発の詳細を確認するには、次のサイトを参照してください: