ノート:

Oracle Cloud Infrastructure Container InstancesとOracle Cloud Infrastructure Events Serviceを統合します

イントロダクション

Oracle Cloud Infrastructure (OCI) Events Serviceは、リソースの状態変更に基づいて自動化を作成します。たとえば、新しいファイルがObject Storageバケットにアップロードされると、このイベントに対するレスポンスとしてサーバーレス・ファンクションが自動的に作成されます。サーバーレス関数は、実行時間が制限された軽量リソースです。特定のユース・ケースでは、十分なコンピュート能力とストレージがない可能性があり、イベントに完全に応答するための5分の実行時間制限にも制限されています。ただし、コンピュートおよびストレージ・リソースがはるかに高く、実行時間が無制限のサーバーレス・コンテナ・インスタンスを作成できます。

目標

OCIイベントを使用して、サーバーレスのOCIコンテナ・インスタンスを作成します。

アーキテクチャ

この例では、新しいメディア・ファイルがOCI Object Storageバケットにアップロードされたときに、OCIコンテナ・インスタンスを自動的に作成する方法を示します。発行されたイベントはサーバーレス・ファンクションを実行します。この関数は、トランスコーディング・コンテナを開始するサーバーレス・コンテナ・インスタンスを作成します。トランスコーディング・コンテナは、FFmpegオープン・ソース・ソフトウェアを使用して、メディア・ファイルを複数の解像度および異なるビット・レートにトランスコードします。HLSとDASHの両方のストリーミング・プロトコルをサポートします。完了すると、様々な解像度とビット・レートのプレイリストが作成され、マスター・マニフェスト・ファイルとサムネイルが作成され、すべてのファイルが宛先バケットにアップロードされます。完全なデータ・フローを次の図に示します。

Image1

大規模なメディア・ファイルのトランスコーディングには時間がかかり、OCIファンクションのサポートよりも多くのディスク領域が必要になる場合があります。したがって、関数の役割は、トランスコーディング・ジョブを効率的に実行できるサーバーレス・コンテナ・インスタンスを作成することです。

前提条件

OCIファンクションとコンテナ・インスタンス・サービスの両方でAIMリソース・プリンシパルを使用して、OCIリソースを認証およびアクセスします。特定のコンパートメントのOCIファンクションおよびコンテナ・インスタンス・リソース・タイプに一致する動的グループを作成します。次の照合ルールを使用します。

All{resource.compartment.id = 'compartment-id', Any{resource.type = 'fnfunc', resource.type ='computecontainerinstance'}}

ここで、compartment-idはコンパートメントのOCIDです。アイデンティティおよびセキュリティからOCIコンソールでコンパートメントOCIDを取得できます。「アイデンティティ」で、「コンパートメント」をクリックします。テナンシのコンパートメント階層が表示されます。コンパートメントを検索し、そのOCIDをコピーします。

動的グループを作成したら、動的グループで使用できるOCIサービスに対して特定のOracle Cloud Infrastructure Identity and Access Management (OCI IAMポリシー)を設定する必要があります。

少なくとも、次のポリシーが必要です。

Allow dynamic-group <dynamic group name> to manage object-family in compartment id <compartment OCID>
Allow dynamic-group <dynamic group name> to manage compute-container-family in compartment id <compartment OCID>
Allow dynamic-group <dynamic group name> to use virtual-network-family in compartment id <compartment OCID>
Allow dynamic-group <dynamic group name> to read repos in tenancy

タスク1: OCIレジストリでのコンテナ・イメージの作成

  1. spinup-container-instance-on-event.zipファイルをダウンロードし、Dockerを実行しているクライアント・マシンに解凍します。

  2. ターミナル・ウィンドウで、spinup-container-instance-on-event/containerディレクトリに移動し、次を実行してローカル・コンテナ・イメージを作成します:

    docker build -t transcoder . --no-cache
    
  3. コンテナ・イメージがローカル・マシンに作成されたことを確認します。

    docker images
    

    このコマンドの出力には、「transcoder:latest」イメージがリストされています。

  4. 認証トークンを作成し、レコードに保存します。その後、コンテナ・イメージが格納されるOCIレジストリにリポジトリを作成します。

    ノート: OCIレジストリはテナンシ・ルート・コンパートメントに存在する必要があり、認証トークンに関連付けられているユーザー・アカウントには、リポジトリに関連する権限が必要です。

  5. Oracle Cloud Infrastructure Registryにログインします。

    docker login <region-key>.ocir.io
    

    ここで、<region-key>は、使用するOracle Cloud Infrastructure Registryリージョンのキーです。OCIレジストリ・ドキュメントのリージョン別可用性を参照してください。

    ユーザー名のプロンプトが表示されたら、<tenancy-namespace>/<username>の形式でユーザー名を入力します。テナントがOracle Identity Cloud Serviceと統合されている場合は、<tenancy-namespace>/oracleidentitycloudservice/<username>の書式を使用します。

    パスワードを求められたら、前にコピーした認証トークンをパスワードとして入力します。

  6. OCIレジストリにプッシュするイメージへのタグを作成します。

    docker tag transcoder:latest <region-key>.ocir.io/<tenancy-namespace>/<repo-name>/transcoder:latest
    
  7. コンテナ・イメージをOCIレジストリにプッシュします。

    docker push <region-key>.ocir.io/<tenancy-namespace>/<repo-name>/transcoder:latest
    

    詳細は、Docker CLIを使用したイメージのプッシュを参照してください

タスク2: OCIファンクションおよびコンテナ・インスタンスのネットワーク・インフラストラクチャの作成

OCIファンクションおよびコンテナ・インスタンス・サービスで使用されるサブネットを含むVCNを作成します。パブリック・サブネットにはVCN内のインターネット・ゲートウェイが必要であり、プライベート・サブネットにはVCN内のサービス・ゲートウェイが必要です。詳細については、次を参照してください。

タスク3: OCIファンクション・アプリケーションの作成

  1. OCIファンクションおよびコンテナ・インスタンス・サービスが使用するサブネットにアタッチされたOCI fnアプリケーションを作成します。このチュートリアルでは、アプリケーションに"process-new-file"という名前を付けました。

  2. クライアント・マシンのターミナル・ウィンドウで、fn project CLIをインストールします。

  3. spinup-container-instance-on-event/functionディレクトリに移動し、func.yamlファイルを編集します。環境変数の値を設定します。

    AVAILABILITY_DOMAIN: <name of the availability domain>
    COMPARTMENT_ID: <compartment OCID>
    SHAPE: <container instance shape, currently supported shapes are CI.Standard.E4.Flex and CI.Standard.E3.Flex>
    CONFIG_SHAPE_MEMORY: <amount of memory (GB)>
    CONFIG_SHAPE_OCPUS: <number of OCPUs>
    IMAGE_URL: <URL of the container image in OCI registry>
    OUTPUT_BUCKET: <name of the output Object Storage bucket where the transcoded files will be stored>
    STREAMING_PROTOCOL: <HLS or DASH>
    SUBNET_ID: <subnet OCID>
    
  4. ファイルを保存し、create-container-instanceファンクションをデプロイします。

    fn deploy --app process-new-file
    

タスク4: OCIイベント・ルールの作成

OCIコンソールで、新しいファイルがオブジェクト・ストレージ・バケットにアップロードされたときに起動するイベント・ルールを作成します。イベント・ルールの例を次に示します。

Image2

入力バケットは、入力メディア・ファイルがアップロードされる既存のオブジェクト・ストレージ・バケットである必要があります。

タスク5: フローのテスト

新しいファイルを入力バケットにアップロードします。その後すぐ、OCIイベントnew-file-uploadが発行されます。OCIイベント・メトリックのスクリーンショットを次に示します。

Image3

OCIファンクション・メトリックで表示できるcreate-container-instanceファンクションの実行がトリガーされます:

Image4

このファンクションは、構成済のコンテナ・インスタンス・シェイプを使用して、新しい"transcode"コンテナ・インスタンスを作成します:

Image5

開始されたコンテナは、メディア・ファイルをObject Storageバケットからダウンロードし、3つの異なる解像度およびビットレートに変換します。

これにより、入力ファイルの名前を使用して出力オブジェクト・ストレージ・バケットに新しいフォルダが作成され、各ストリーム(解決およびビットレート)の再生リスト・ファイルがこのフォルダにアップロードされます。次に例を示します:

Image6

最後に、メディア・コンテンツのサムネイルを作成し、それを出力バケットのthumbnailsフォルダにアップロードします。

ノート: この例ではH.264コーデックを使用していますが、FFmpegでサポートされている他のコーデックで使用できます。コンテナ・イメージを構築する前に、spinup-container-instance-on-event/container/transcode.shファイルでコーデック・ライブラリを設定できます(タスク1を参照)。

トラブルシューティングのために、OCI fnアプリケーションでのロギングをオンにできます。コンテナ・インスタンスが作成されると、コンテナの実行中にトランスコーディング・コンテナのログを表示できます。

謝辞

作成者 - Michael Prestin(マスター・プリンシパル・クラウド・アーキテクト)

その他の学習リソース

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

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