シナリオ: Autonomous Databaseへのログ・データの送信

ファンクション(ファンクション・サービス)を使用して、ログ・データをロギングからAutonomous Databaseに送信します。

このシナリオでは、ファンクションを作成してから、コネクタ(コネクタ・ハブ)でそのファンクションを参照して、ログ・データを処理してロギングからAutonomous Databaseに移します。

必要なIAMポリシー

管理者グループのメンバーであれば、このシナリオを実行するために必要なアクセス権をすでに持っています。それ以外の場合は、ファンクションへのアクセス権が必要です。

コネクタを作成するワークフローには、ターゲット・サービスへの書込み権限を提供するために必要なデフォルト・ポリシーが含まれます。ポリシーを初めて使用する場合は、ポリシーの開始および共通ポリシーを参照してください。

このシナリオの設定

このシナリオでは、コネクタ(コネクタ・ハブ)を作成して、ログ・データをロギングからAutonomous Database (JSON)に送信します。

コネクタを作成する前に、ログ・データを受け取るAutonomous JSON Databaseを設定し、そのログ・データをコピーするファンクションを設定する必要があります。

Autonomous JSON Databaseの設定の詳細:

  • Autonomous Databaseのプロビジョニング
  • ブラウザ・タブを複製します。
  • 「複製」タブで、ORDSベースURLをコピーします: Autonomous Databaseの詳細ページから、「サービス・コンソール」「開発」「RESTfulサービスおよびSODA」の下の「コピー」の順に選択します。
  • ファンクションおよびコネクタによって移動されるログ・データを格納するログ・コレクションを作成します。
    1. Autonomous Databaseの詳細ページ(最初のブラウザ・タブ)に戻ります。

    2. 「データベース・アクション」を選択します。

    3. adminユーザーとして、データベース作成時に設定したパスワードを使用してログインします。

      「データベース・アクション | 起動パッド」ウィンドウが表示されます。

    4. 「SQL」を選択します。

      「データベース・アクション | SQL」ウィンドウが表示されます。

    5. 次のコマンドを入力します。

      soda create logs
    6. 文の実行 (「文の実行」)を選択します。

    コネクタがログ・データをコピーした後でコレクション内のドキュメントを問合せするには、次のコマンドを入力します:

    soda get logs -f {}

ファンクションの設定の詳細:

データベースおよびファンクションを設定したら、コネクタを作成できます。コネクタの作成は、コンソールで行います。または、Oracle Cloud Infrastructure CLIまたはAPIを使用して、各操作を自分で実行できます。

ファンクションのコード・サンプル

次のコード・サンプルは、ロギング・サービスからAutonomous Databaseにログ・データを送信するファンクションのものです。ファンクションを作成およびデプロイする手順は、ファンクションの作成およびデプロイを参照してください。

ノート

次のコード・サンプルは、本番ワークロード向けではありません。本番環境用には更新してください。
import io
import json
import logging
import requests

from fdk import response

# soda_insert uses the Autonomous Database REST API to insert JSON documents
def soda_insert(ordsbaseurl, dbschema, dbuser, dbpwd, collection, logentries):
    auth=(dbuser, dbpwd)
    sodaurl = ordsbaseurl + dbschema + '/soda/latest/'
    bulkinserturl = sodaurl + 'custom-actions/insert/' + collection + "/"
    headers = {'Content-Type': 'application/json'}
    resp = requests.post(bulkinserturl, auth=auth, headers=headers, data=json.dumps(logentries))
    return resp.json()

def handler(ctx, data: io.BytesIO=None):
    logger = logging.getLogger()
    logger.info("function start")

    # Retrieving the Function configuration values
    try:
        cfg = dict(ctx.Config())
        ordsbaseurl = cfg["ordsbaseurl"]
        dbschema = cfg["dbschema"]
        dbuser = cfg["dbuser"]
        dbpwd = cfg["dbpwd"]
        collection = cfg["collection"]
    except:
        logger.error('Missing configuration keys: ordsbaseurl, dbschema, dbuser, dbpwd and collection')
        raise
    
    # Retrieving the log entries from Connector Hub as part of the Function payload
    try:
        logentries = json.loads(data.getvalue())
        if not isinstance(logentries, list):
            raise ValueError
    except:
        logger.error('Invalid payload')
        raise
    
    # The log entries are in a list of dictionaries. We can iterate over the the list of entries and process them.
    # For example, we are going to put the Id of the log entries in the function execution log
    logger.info("Processing the following LogIds:")
    for logentry in logentries:
        logger.info(logentry["oracle"]["logid"])

    # Now, we are inserting the log entries in the JSON Database
    resp = soda_insert(ordsbaseurl, dbschema, dbuser, dbpwd, collection, logentries)
    logger.info(resp)
    if "items" in resp:
        logger.info("Logs are successfully inserted")
        logger.info(json.dumps(resp))
    else:
        raise Exception("Error while inserting logs into the database: " + json.dumps(resp))

    # The function is done. Return empty response.
    logger.info("function end")
    return response.Response(
        ctx, 
        response_data="",
        headers={"Content-Type": "application/json"}
    )

コンソールの使用

この項では、コンソールを使用してコネクタを作成する方法について説明します。ファンクションはデプロイする必要があります。

トラブルシューティングに関するヘルプは、コネクタのトラブルシューティングを参照してください。

コネクタの作成

この例では、コンソールを使用してコネクタを作成する方法を説明します。この例で、コネクタは、ファンクション・コード・サンプルを使用して作成したファンクションを使用して、ログ・データをロギングからAutonomous Databaseに移動します。

  1. ナビゲーション・メニューを開き、「アナリティクスとAI」をクリックします。「メッセージング」で、「コネクタ・ハブ」をクリックします。
  2. サービス・コネクタを作成するコンパートメントを選択します。
  3. 「コネクタの作成」を選択します。
  4. 「コネクタの作成」ページ:

    • 「コネクタ名」に「自分のAutonomous Databaseへのログ送信」などと入力します。機密情報を入力しないでください。
    • 新しいコネクタを格納するリソース・コンパートメントを選択します。
    • 「コネクタの構成」で、ログ・データをメトリックに移動するソース・サービスおよびターゲット・サービスを選択します:
      • ソース: ロギング
      • ターゲット: ファンクション
    • 「ソース接続の構成」で、「コンパートメント名」「ログ・グループ」および「ログ」を選択します。
    • 「ターゲット接続の構成」で、関数コード・サンプルを使用して作成した関数に対応する「関数アプリケーション」および「関数」を選択します。
  5. ポリシー(サービス・コネクタを作成または更新するためのアクセス権で必要)の作成を求められた場合は、「作成」を選択します。
  6. 「作成」を選択します。

CLIの使用

この項では、CLIを使用して、ログ・データを関数に移動するコネクタを作成する手順を説明します(その後、関数はデータをAutonomous Databaseに移動します)。

APIの使用およびリクエストの署名の詳細は、REST APIのドキュメントおよびセキュリティ資格証明を参照してください。SDKの詳細は、SDKおよびCLIを参照してください。

  • コネクタを作成します: コマンド・プロンプトを開き、oci sch service-connector createコマンドを実行します:

    oci sch service-connector create --display-name
    "<display_name>" --compartment-id <compartment_OCID> --source [<source_in_JSON>] --tasks [<tasks_in_JSON>] --target [<targets_in_JSON>]

トラブルシューティングに関するヘルプは、コネクタのトラブルシューティングを参照してください。

APIの使用

この項では、APIを使用してコネクタを作成する手順を説明します。

APIの使用およびリクエストの署名の詳細は、REST APIのドキュメントおよびセキュリティ資格証明を参照してください。SDKの詳細は、SDKおよびCLIを参照してください。

次の操作を使用します:

  • CreateServiceConnector: ログ・データを関数に移動するコネクタを作成します(その後、関数はデータをAutonomous Databaseに移動します)。

    CreateServiceConnectorリクエストの例
    POST /20200909/serviceConnectors
    Host: service-connector-hub.us-phoenix-1.oraclecloud.com
    <authorization and other headers>
    {
      "compartmentId": "<compartment_OCID>",
      "description": "My connector description",
      "displayName": "My Connector",
      "source": {
        "kind": "logging",
        "logSources": [
          {
            "compartmentId": "<compartment_OCID>",
            "logGroupId": "<log_group_OCID>",
            "logId": "<log_OCID>"
          }
        ]
      },
      "target": {
        "compartmentId": "<compartment_OCID>",
        "kind": "functions",
        "functionId": "<function_OCID>"
      },
      "tasks": []
      }
    }

トラブルシューティングに関するヘルプは、コネクタのトラブルシューティングを参照してください。