ノート:
- このチュートリアルではOracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructure資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了する場合は、これらの値をクラウド環境に固有の値に置き換えてください。
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の両方のストリーミング・プロトコルをサポートします。完了すると、様々な解像度とビット・レートのプレイリストが作成され、マスター・マニフェスト・ファイルとサムネイルが作成され、すべてのファイルが宛先バケットにアップロードされます。完全なデータ・フローを次の図に示します。
大規模なメディア・ファイルのトランスコーディングには時間がかかり、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レジストリでのコンテナ・イメージの作成
-
spinup-container-instance-on-event.zipファイルをダウンロードし、Dockerを実行しているクライアント・マシンに解凍します。
-
ターミナル・ウィンドウで、
spinup-container-instance-on-event/container
ディレクトリに移動し、次を実行してローカル・コンテナ・イメージを作成します:docker build -t transcoder . --no-cache
-
コンテナ・イメージがローカル・マシンに作成されたことを確認します。
docker images
このコマンドの出力には、「transcoder:latest」イメージがリストされています。
-
認証トークンを作成し、レコードに保存します。その後、コンテナ・イメージが格納されるOCIレジストリにリポジトリを作成します。
ノート: OCIレジストリはテナンシ・ルート・コンパートメントに存在する必要があり、認証トークンに関連付けられているユーザー・アカウントには、リポジトリに関連する権限が必要です。
-
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>
の書式を使用します。パスワードを求められたら、前にコピーした認証トークンをパスワードとして入力します。
-
OCIレジストリにプッシュするイメージへのタグを作成します。
docker tag transcoder:latest <region-key>.ocir.io/<tenancy-namespace>/<repo-name>/transcoder:latest
-
コンテナ・イメージをOCIレジストリにプッシュします。
docker push <region-key>.ocir.io/<tenancy-namespace>/<repo-name>/transcoder:latest
詳細は、Docker CLIを使用したイメージのプッシュを参照してください
タスク2: OCIファンクションおよびコンテナ・インスタンスのネットワーク・インフラストラクチャの作成
OCIファンクションおよびコンテナ・インスタンス・サービスで使用されるサブネットを含むVCNを作成します。パブリック・サブネットにはVCN内のインターネット・ゲートウェイが必要であり、プライベート・サブネットにはVCN内のサービス・ゲートウェイが必要です。詳細については、次を参照してください。
タスク3: OCIファンクション・アプリケーションの作成
-
OCIファンクションおよびコンテナ・インスタンス・サービスが使用するサブネットにアタッチされたOCI fnアプリケーションを作成します。このチュートリアルでは、アプリケーションに"process-new-file"という名前を付けました。
-
クライアント・マシンのターミナル・ウィンドウで、fn project CLIをインストールします。
-
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>
-
ファイルを保存し、
create-container-instance
ファンクションをデプロイします。fn deploy --app process-new-file
タスク4: OCIイベント・ルールの作成
OCIコンソールで、新しいファイルがオブジェクト・ストレージ・バケットにアップロードされたときに起動するイベント・ルールを作成します。イベント・ルールの例を次に示します。
入力バケットは、入力メディア・ファイルがアップロードされる既存のオブジェクト・ストレージ・バケットである必要があります。
タスク5: フローのテスト
新しいファイルを入力バケットにアップロードします。その後すぐ、OCIイベントnew-file-upload
が発行されます。OCIイベント・メトリックのスクリーンショットを次に示します。
OCIファンクション・メトリックで表示できるcreate-container-instance
ファンクションの実行がトリガーされます:
このファンクションは、構成済のコンテナ・インスタンス・シェイプを使用して、新しい"transcode"コンテナ・インスタンスを作成します:
開始されたコンテナは、メディア・ファイルをObject Storageバケットからダウンロードし、3つの異なる解像度およびビットレートに変換します。
-
1080p 5Mビット/秒
-
720p 3Mビット/秒
-
360p 1Mビット/秒
これにより、入力ファイルの名前を使用して出力オブジェクト・ストレージ・バケットに新しいフォルダが作成され、各ストリーム(解決およびビットレート)の再生リスト・ファイルがこのフォルダにアップロードされます。次に例を示します:
最後に、メディア・コンテンツのサムネイルを作成し、それを出力バケットの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を参照してください。
Integrate Oracle Cloud Infrastructure Container Instances with Oracle Cloud Infrastructure Events Service
F86113-01
August 2023
Copyright © 2023, Oracle and/or its affiliates.