ノート:

OCI関数を使用したAmazon S3へのOracle Cloud Infrastructureログのプッシュ

イントロダクション

Oracle Cloud Infrastructure (OCI) Logging Serviceは、OCIサービスおよびリソースによって生成されたすべてのログ、およびユーザーが作成したカスタム・ログの統合ビューを提供します。

OCI Functionsは、開発者が軽量のイベント駆動型アプリケーションをクラウドで構築およびデプロイできるサーバーレス・コンピュート・プラットフォームです。

Amazon S3は、Amazonが提供するスケーラビリティと信頼性の高いクラウド・ストレージ・サービスであり、ユーザーは世界中のどこからでもデータを格納および取得できます。

高レベルのプロセスには、サービス・コネクタを使用してOCIロギング・サービスからログを収集し、ターゲット関数に送信してデータをAmazon S3にプッシュすることが含まれます。

アーキテクチャの図

目標

OCIファンクションを使用してOCIログをAmazon S3にプッシュする方法に関するステップバイステップ・ガイド。

前提条件

  1. Amazon Web Services (AWS)のユーザーは、バケットを作成し、バケット内のオブジェクトの読取りおよび書込みを実行するために必要なポリシーを持っている必要があります。バケット・ポリシーの詳細は、このページを参照してください。

  2. OCIのユーザーには、リソースを管理するためのファンクション、サービス・コネクタ・ハブおよびロギング・サービスに必要なポリシーが必要です。すべてのサービスのポリシー・リファレンスは、ここにあります。

タスク1: AWS設定の構成

  1. Amazon S3バケットを作成します。

    AWSバケットの作成

  2. IAMで、ユーザーのAWSアクセス・キーおよび秘密キーを作成します。

    1. IAM「ユーザー」「セキュリティ資格証明」「アクセス・キーの作成」「サードパーティ・サービス」にナビゲートします。

    2. 生成されたAWSアクセス・キーおよび秘密キーをノートパッド・ファイルにコピーします。

      AWSアクセスおよび秘密キーの作成

タスク2: Oracle Cloud Infrastructure設定の構成

OCI VaultにAWSアクセス・キーと秘密キーを格納

動的グループの作成

動的グループのポリシーの作成

Pythonまたはサポートされている言語でOCIファンクションを作成し、OCIログをAmazon S3に送信します

  1. Oracle Cloudコンソールのメニューで、「開発者サービス」にナビゲートし、「ファンクション」を選択します。

  2. 既存のアプリケーションを選択するか、「アプリケーションの作成」をクリックします。アプリケーション内にファンクションを作成します。

  3. このチュートリアルでは、OCI Cloud Shellを使用してファンクションを作成します。

    ノート: クラウド・シェルは、設定の前提条件を必要としないため、推奨されるオプションです。OCI Functionsを初めて使用する場合は、クラウド・シェルでのファンクションのクイック・スタートのセクションA、BおよびCに従います。

  4. 最初にサンプルPython関数を作成することをお薦めします。次のコマンドは、func.pyfunc.yamlおよびrequirements.txtの3つのファイルを含むフォルダociToawsを生成します。

    fn init --runtime python pushlogs
    
  5. 次のコードを使用してfunc.pyを変更します。コード内のsecret_key_idaccess_key_idを、前に作成したOCI VaultのそれぞれのシークレットOCIDに置き換えます。

    import io
    import json
    import logging
    import boto3
    import oci
    import base64
    import os
    from fdk import response
    
    # The below method receives the list of log entries from OCI as input in the form of bytestream and is defined in func.yaml
    def handler(ctx, data: io.BytesIO = None):
        funDataStr = data.read().decode('utf-8')
    
        # Convert the log data to json
        funData =  json.loads(funDataStr)
    
        # The Secret Retrieval API is used here to retrieve AWS access keys and secret key from vault. These keys are required to connect to Amazon S3.
        # Replace secret_key_id, access_key_id with respective secret ocids.
        secret_key_id = "<vault_secret_ocid>"
        access_key_id = "<vault_secret_ocid>"
    
        signer = oci.auth.signers.get_resource_principals_signer()
        secret_client = oci.secrets.SecretsClient({},signer=signer)
    
        def read_secret_value(secret_client, secret_id):
            response = secret_client.get_secret_bundle(secret_id)
            base64_Secret_content = response.data.secret_bundle_content.content
            base64_secret_bytes = base64_Secret_content.encode('ascii')
            base64_message_bytes = base64.b64decode(base64_secret_bytes)
            secret_content = base64_message_bytes.decode('ascii')
            return secret_content
    
    
        awsaccesskey = read_secret_value(secret_client, access_key_id)
        awssecretkey = read_secret_value(secret_client, secret_key_id)
    
        for i in range(0,len(funData)):
            filename = funData[i]['time']
            logging.getLogger().info(filename)
    
            # Send the log data to a temporary json file. /tmp is the supported writable directory for OCI Functions
            with open('/tmp/'+filename+".json", 'w', encoding='utf-8') as f:
                json.dump(funData[i], f, ensure_ascii=False, indent=4)
    
            # Send the log file to Amazon S3 target bucket
            session = boto3.Session(aws_access_key_id= awsaccesskey, aws_secret_access_key= awssecretkey)
            s3 = session.resource('s3')
            s3.meta.client.upload_file(Filename='/tmp/'+filename+'.json', Bucket='lasya-bucket', Key=filename+'.json')
    
            os.remove('/tmp/'+filename+'.json')
    
  6. 次のコードでfunc.yamlを更新します。

    schema_version: 20180708
    name: pushlogs
    version: 0.0.1
    runtime: python
    build_image: fnproject/python:3.9-dev
    run_image: fnproject/python:3.9
    entrypoint: /python/bin/fdk /function/func.py handler
    memory: 256
    
  7. 次のコードを使用してrequirements.txtを変更します。

    fdk>=0.1.56
    boto3
    oci
    
  8. 次のコマンドを使用してファンクションをデプロイします。

    fn -v deploy --app ociToaws
    

ログからファンクションにOCIログを送信するためのサービス・コネクタの作成

  1. 「Console」メニューで、「Analytics & AI、 Messaging、」→「Service Connector Hub」を選択します。

  2. サービス・コネクタを作成するコンパートメントを選択します。

  3. 「サービス・コネクタの作成」をクリックし、それぞれの値を指定します。「サービス・コネクタの構成」で、ソースとして「ストリーミング」を選択し、ターゲットとして「ログ・アナリティクス」を選択します。

  4. 「ソースの構成」で、ファンクションにプッシュするログを選択します

  5. 「Configure Destination」で、ステップ4で作成したファンクション・アプリケーションを選択します。

  6. 画面に表示されるデフォルト・ポリシーを作成し、「作成」をクリックします。

    サービス・コネクタの作成

    サービス・コネクタの作成

    サービス・コネクタの作成

タスク3: ログがAmazon S3にプッシュされるかどうかの確認

次のステップ

このチュートリアルでは、Service Connector HubとFunctionsを使用して、Oracle Cloud InfrastructureのログをAmazon S3にプッシュする方法を示した。OCIログ・データは、冗長性とコンプライアンスの複数のストレージ戦略に使用でき、AWS内の既存のコネクタの詳細な分析にも使用できます。

承認

著者 - Vishak Chittuvalapil (シニア・クラウド・エンジニア)、Lasya Vadavalli (クラウド・エンジニア-IaaS)

その他の学習リソース

docs.oracle.com/learnで他のラボをご覧いただくか、Oracle Learning YouTubeチャネルでより無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。

製品ドキュメントについては、Oracle Help Centerを参照してください。