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

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

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

必要なIAMポリシー

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

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

このシナリオの設定

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

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

ファンクションはデプロイする必要があります。この例で、コネクタは、ファンクション・コード・サンプルを使用して作成したファンクションを使用して、ログ・データをロギングからAutonomous AI Databaseに移動します。

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

Autonomous AI JSON Databaseの設定の詳細:

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

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

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

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

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

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

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

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

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

    soda get logs -f {}

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

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

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

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

ノート

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

from fdk import response

# soda_insert uses the Autonomous AI 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"}
    )
  • ノート

    「コネクタの作成」ページのフィールドの詳細は、コネクタの作成を参照してください。

    「コネクタ」リスト・ページで、「コネクタの作成」を選択します。リスト・ページの検索に関するヘルプが必要な場合は、コネクタのリストを参照してください。

    1. 基本的なコネクタ情報

    識別情報の入力

    • コネクタ名: 新しいコネクタのわかりやすい名前とオプションの説明を入力します。機密情報を入力しないでください。例: 自律型AIデータベースへのログの送信
    • コンパートメントの選択: 新しいコネクタを格納するコンパートメントを選択します。

    「次へ」を選択します。

    2. コネクタ・ソースの構成

    • ソースの選択: 「ロギング」を選択します。
    • ソースの構成: コンパートメント、ログ・グループおよびログを選択します。
    • ポリシーの作成: 入力したソース構成に指定されたデフォルト・ポリシーを受け入れる場合に選択します

    「次へ」を選択します。

    3. コネクタ・タスクの構成

    「次へ」を選択します(このセクションはスキップします)。

    4. コネクタ・ターゲットの構成

    フィルタ処理したログ・データで使用するメトリック・ネームスペースおよびメトリック名を入力します。

    • ターゲット: 「ファンクション」を選択します。
    • ターゲットの構成: ファンクション・コード・サンプルを使用して作成したファンクション・アプリケーションおよびファンクションを選択します。
    • ポリシーの作成: 入力したターゲット構成に指定したデフォルト・ポリシーを受け入れる場合に選択します。

    「次へ」を選択します。

    コネクタ・プレビュー

    コネクタ構成を確認し、「作成」を選択します。

    作成プロセスが開始され、その進行状況が表示されます。完了すると、コネクタの詳細ページが開きます。

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

    次の操作を使用します:

    • CreateServiceConnector: ログ・データを関数に移動するコネクタを作成します(その後、ファンクションによってデータがAutonomous AI 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": []
        }
      }

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