Functions: APIゲートウェイを使用したファンクションのコール

このチュートリアルでは、Oracle Functionsを使用して、Oracle API Gatewayから渡されるデータを処理します。ランタイム・コンテキストを使用してリクエストで渡されたHTTP情報を抽出するPythonファンクションを作成します。

主なタスクは:

  • 必要な情報を収集します。
  • ファンクションのアプリケーションを作成します。
  • 「Hello World!」ファンクションを作成します。
  • ランタイム・コンテキスト・データを処理するように、ファンクションを変換します。
  • ファンクションをデプロイおよびテストします。
  • ファンクションのAPIゲートウェイを作成します
  • APIゲートウェイを使用して、インターネットからファンクションをコールします。
この図は、Oracleファンクションの実行に使用されるOCIコンポーネントを示しています。

その他の情報については、次のWebサイトを参照してください。

開始する前に

このチュートリアルを正常に実行するには、次が必要です:

OCIアカウントの要件
ソフトウェアの要件

Oracle CLI

Oracle Cloud Shell

  • クラウド・シェルを使用する場合、前述のソフトウェアのリストはすでにインストールされています。

1. 必要な情報の収集

チュートリアルを完了するために必要なすべての情報を収集します。次の情報をメモ帳にコピーします。

コンパートメント情報の取得

コンパートメントを作成するには、コンパートメントの作成を参照してください。コンパートメントを作成したら、コンパートメントOCIDとコンパートメント名を保存します。

既存のコンパートメントからコンパートメントOCIDを取得するには:

  1. ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします。「アイデンティティ」で、「コンパートメント」をクリックします。
  2. コンパートメントを選択します。
  3. 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. 必要な構成の実行

チュートリアルに必要な構成をすべて実行します。

Functionsアプリケーションの作成

アプリケーションを作成するには、次のステップに従います。

  1. ナビゲーション・メニューを開き、「開発者サービス」をクリックします。「ファンクション」で、「アプリケーション」をクリックします。
  2. 「コンパートメント」ドロップダウンからコンパートメントを選択します。
  3. 「アプリケーションの作成」をクリックします。
  4. フォーム・データを入力します。
    • 名前: <your-app-name>
    • VCN: <your-vcn-name>
    • サブネット: <Public-Subnet-your-vcn-name>
  5. 「作成」をクリックします。

アプリケーションが作成されます。

HTTPSのイングレス・ルールの設定
  1. ナビゲーション・メニューを開いて「ネットワーキング」をクリックし、「仮想クラウド・ネットワーク」をクリックします。
  2. Oracle Functionsアプリケーションに使用したVCNの名前をクリックします。
  3. 新しいVCNが表示された状態で、「パブリック」サブネット・リンクをクリックします。

    パブリック・サブネット情報は、ページの下部にあるセキュリティ・リストとともに表示されます。

  4. 「デフォルト・セキュリティ・リスト」リンクまたは適切なセキュリティ・リスト・リンクをクリックします。

    VCNのデフォルトのイングレス・ルールが表示されます。

  5. 「イングレス・ルールの追加」をクリックします。

    「イングレス・ルールの追加」ダイアログが表示されます。

  6. イングレス・ルールに次の情報を入力します。すべてのデータを入力したら、「イングレス・ルールの追加」をクリックします

    イングレス・ルールを次のように入力します:

    • ステートレス: 選択
    • ソース・タイプ: CIDR
    • ソースCIDR: 0.0.0.0/0
    • IPプロトコル: TCP
    • ソース・ポート範囲: (空白のまま)
    • 宛先ポート範囲: 443
    • 説明: アプリケーションのVCN

    「イングレス・ルールの追加」をクリックすると、パブリック・サブネットへのHTTPS接続が許可されます。

FunctionsへのAPIゲートウェイ・アクセスのポリシーの設定

次に、APIゲートウェイによるファンクションの呼出しを許可するポリシーを設定します。

最初に、APIゲートウェイの動的グループを作成します。

  1. ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします。「アイデンティティ」で、「動的グループ」をクリックします。
  2. 「動的グループの作成」をクリックします。
  3. 次の情報を入力して、動的グループを定義します。
    • 名前: <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>'}を使用します
  4. 「作成」をクリックします。

ここで、APIゲートウェイのポリシーを作成します。

  1. ナビゲーション・メニューを開き、「アイデンティティとセキュリティ」をクリックします。「アイデンティティ」で、「ポリシー」をクリックします。
  2. 「ポリシーの作成」をクリックします。
  3. ポリシーを定義するには、次の情報を入力します。
    • 名前: <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ではなく、コンパートメントです。
  4. 「作成」をクリックします。

APIゲートウェイによるFunctionsの使用を許可するポリシーが作成されました。

「Hello World」Pythonファンクションの作成
  1. ターミナルを開きます。
  2. ファンクションを格納するディレクトリを作成し、そのディレクトリに移動します。
    mkdir my-dir-name
    cd my-dir-name                        
                         
  3. Fnを使用してPythonの「Hello World」ファンクションを作成します。
    fn init --runtime python my-func-name

    このコマンドは、ファンクションおよび構成ファイルを含むmy-func-nameという名前のディレクトリを作成します。

  4. そのディレクトリに移動します。
  5. ファンクションをデプロイします。
    fn -v deploy --app your-app-name

    Dockerイメージが作成され、OCIRにプッシュされ、最終的にOracle Functionsにデプロイされると、様々なメッセージが表示されます。

  6. ファンクションを呼び出します。
    fn invoke your-app-name my-func-name

    戻り値: {"message": "Hello World"}

  7. パラメータを指定してファンクションを呼び出します。
    echo -n '{"name":"Bob"}' | fn invoke your-app-name my-func-name

    戻り値: {"message": "Hello Bob"}

3. APIゲートウェイの作成

ファンクションをコールするには、APIゲートウェイを作成します。

APIゲートウェイの作成

APIゲートウェイを作成するには:

  1. ナビゲーション・メニューを開き、「開発者サービス」をクリックします。「API管理」で、「ゲートウェイ」をクリックします。
  2. 「コンパートメント」ドロップダウンからコンパートメントを選択します。
  3. 「ゲートウェイの作成」をクリックします
  4. 次の情報を入力して、APIゲートウェイを定義します。
    • 名前: <your-gateway-name>
    • タイプ: <Public>
    • コンパートメント: <your-compartment-name>
    • <your-vcn-name>の仮想クラウド・ネットワーク: <select-your-vcn>
    • <your-compartment-nameのサブネット: <your-public-subnet-name>
  5. 「作成」をクリックします。APIゲートウェイが作成されるまで数分間待ちます。
ゲートウェイのAPIデプロイメントの作成

次に、APIゲートウェイのデプロイメントを作成します。

  1. 画面左側の「リソース」セクションで、「デプロイメント」をクリックします。
  2. 「デプロイメントの作成」をクリックします。
  3. デプロイメント・タイプに「最初から」が選択されていることを確認します。
  4. デプロイメントを定義するには、「基本情報」セクションに入力します。
    • 名前: <your-deployment-name>
    • パス接頭辞(例): /v1
    • コンパートメント: <your-compartment-name>
    • APIリクエスト・ポリシー: デフォルト値を使用します
    • APIロギング・ポリシー: 「情報」のデフォルト値を使用します
  5. 「次」をクリックします。「ルート1」が選択された状態で「ルート」ダイアログが表示されます。
  6. ルートを定義するには、「ルート1」セクションに入力します。
    • パス: <your-route-path>

      例: /http-info

    • メソッド: GET POST
    • タイプ: Oracle Functions
    • <your-compartment-name>のアプリケーション 作成したFunctionsアプリケーションを選択します。
    • ファンクション名: 構成セクションで作成したファンクションを選択します。
  7. 「次」をクリックします。選択内容をまとめた「確認」ダイアログが表示されます。
  8. 「作成」をクリックします。デプロイメントが作成されます。
  9. ゲートウェイの「デプロイメント」リンクをクリックします。作成したデプロイメントのベース・エンドポイントをコピーします。

    例: https://aaaaa.apigateway.us-ashburn-X.oci.customer-oic.com/v1

APIゲートウェイのテスト

APIゲートウェイおよびデプロイメントを作成すると、インストールをテストできます。curlコマンドの単純なスクリプトを作成します。curlのURLを作成するには、エンドポイントにデプロイメント・パスを追加します。

  1. スクリプト・ファイルtouch gtw01.sh && chmod 755 gtw01.shを作成します
  2. スクリプト・ファイルにcurlコマンドを追加します:
    #!/bin/bash
    curl <your-api-gateway-endpoint>/http-info
  3. コマンドの戻り値: {"message":"Hello World"}

APIゲートウェイがボイラー・プレートPythonファンクションに接続されました。次に、HTTPリクエストで渡された情報を表示するようにPythonファンクションを更新します。

4. HTTPおよびファンクション・データにアクセスするためのファンクションの更新

次に、ランタイム・コンテキストにアクセスしてHTTP情報を表示するように、ボイラー・プレートPythonファンクションを変更します。

開始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ファンクションに変換します。

必要なパッケージの更新

まず、必要なパッケージのファンクションを更新します。

  1. ociパッケージのrequirements.txtファイルを更新します。
    fdk
    oci                    
                    
  2. HTTP機能に必要なパッケージについて、func.pyimport文を更新します:
    import io
    import json
    import oci
    import logging
    from urllib.parse import urlparse, parse_qs                    
                    

    一部のコンテキスト・リクエストには、ociパッケージが必要です。urlparse, parse_qsパッケージは解析に使用されます。

HTTPリクエスト情報の追加

まず、ファンクションの本体を削除します。進捗状況に応じて、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関連のデータはすべて、AppIDFnIDおよび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"}
    )         
            

これで、ファンクションを再テストして結果を確認する準備が整いました。

Functions構成変数の作成

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のランタイム・コンテキストに関するチュートリアルを参照してください。

ファンクションのテスト
  1. 更新されたファンクションを再デプロイします。
  2. ファンクションを呼び出して、ファンクションが機能していることを確認します。
  3. スクリプトを再実行します。フォーマットされた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"
    }
                    
                

    AppIDFnIDおよびFormatなど、レスポンスの後半で返されるすべてのFunctionsデータに注意してください。また、Configurationセクションには、FN_FORMATなどのFunctions生成の環境変数、および構成変数(DB-NAMEおよびDB-USER)が表示されます。

  4. ヘッダーおよび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製品を使用した開発の詳細を確認するには、次のサイトを参照してください: