Pre-Built Functionsを利用して、OCI Media Flowのメディアワークフロージョブを自動実行してみた

# はじめに

この記事では、先日リリースされた**Pre-Built Functions**（事前構築済ファンクション）を利用して、OCI Media Flowで開発したメディアワークフローを自動実行できることを確認します

Pre-Built Functionsのリリース情報はこちら（↓）

https://docs.oracle.com/en-us/iaas/releasenotes/changes/4fd4758d-7efc-4225-b3ba-83bcba36c95a/

# 今回実現すること

実現イメージは以下スライドの通りです。動画ファイルの登録〜動画のトランスコード処理の実行〜トランスコード済動画の出力の**メディア処理プロセスを自動化**です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/0689f9eb-ad74-4acf-a172-929a470b4d3d.png)


今回は、4つのPre-Built Functionsから**Media Workflow Job Spawner**を利用します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/b2a06faa-ae9d-9a4b-d2c2-85a32b08ceaf.png)

# 1. 事前準備

## 1.1 VCNの作成

Oracle Functionsが利用するVCN（仮想クラウドネットワーク）を作成します。以下のチュートリアルを参考に作成します

+ [2-3. Oracle Functionsが利用するVCNの作成（Oracle Functionsハンズオン）](https://oracle-japan.github.io/ocitutorials/cloud-native/functions-for-beginners/#2-3-oracle-functions%E3%81%8C%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8Bvcn%E3%81%AE%E4%BD%9C%E6%88%90)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/4fbe3264-fb7a-5e53-2dfe-1f5c69286856.png)

## 1.2 メディアワークフローの作成

OCI Media Flowを利用して、動画のトランスコード処理をジョブとして実行するメディアワークフローを作成します。以下のQiita記事を参考に作成します

https://qiita.com/nakasato310/items/bdf430947f516c48276a

作成したメディアワークフローの**OCID（Workflow ID）**と**Compartment ID**を記録します。メディアワークフローを開き、Media Workflow information内の**OCID（Workflow ID）**と**Compartment ID**コピーし、メモ帳などのテキストエディタに記録します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/bb4a4a92-ef73-d9f9-7e48-817a4c36450a.png)

また、メディアワークフロー作成時に入力先（Input）と出力先（Output）として指定した**バケット名**も記録します
- 入力先バケット（Input）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/95102e0c-2268-0fc0-cad1-0cd77e404766.png)
- 出力先バケット（Output）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/57b37c63-83d3-5f92-48ec-832326fac1e2.png)


# 2. ファンクションの作成

Pre-Built Functionsの**Media Workflow Job Spawner**を利用して、ファンクションを作成します

1. 左上のメニュー→開発者サービス→ファンクション→**事前構築済ファンクション**を開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/9c96b23d-5f5f-c865-f104-27d2394caafb.png)

1. **Media Workflow Job Spawner**をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/b2a06faa-ae9d-9a4b-d2c2-85a32b08ceaf.png)

1. **関数の作成**をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/62d7bfdc-1148-139d-f0c9-7b58ea86c2b8.png)

1. **名前**を入力し、**アプリケーション**を選択します。アプリケーションを新規作成する場合は、**新規アプリケーションの作成**をクリックし、アプリケーションを作成します。  
また、「IAMポリシーの作成」はデフォルトのままで作成します（「動的グループとIAMポリシーを作成しないでください」は**選択しません**）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/bc3d74dc-0a7d-8104-010c-3ccee6db41ef.png)

1. 「メモリー」「タイムアウト」はデフォルトのままとします。「プロビジョニングされた並行性の有効化」は選択しません。  
「構成」の**MEDIA_WORKFLOW_ID**、**DESTINATION_BUCKET**、**DESTINATION_COMPARTMENT_ID**に、1.2項で記録した値をそれぞれ入力し、最後に**作成**をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/bff910d9-79eb-c2ae-1fe4-fb96260bb083.png)

1. ファンクションが作成されます。左下のリソース→**構成**をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/fa5752b3-f5df-c57d-0f09-405cd1a25737.png)

1. **MEDIA_WORKFLOW_ID**、**DESTINATION_BUCKET**、**DESTINATION_COMPARTMENT_ID**に、ファンクション作成時に指定した値が設定されていることを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/6494dcee-ce2a-957f-988c-681d254805ba.png)

## 3. ルールの作成

入力先として指定したObject Storageのバケットに動画ファイルが登録（オブジェクトが作成）されたら、前の手順で作成したファンクションを起動する、というルールを作成します

1. 左上のメニュー→監視および管理→イベント・サービス→**ルール**を開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/c752ac80-670c-737a-0b50-19bf63ba20f8.png)

1. **ルールの作成**をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/0f7d8ba5-e188-26e8-8911-dd4d5237a851.png)

1. **表示名**を入力し、以下の条件でルール条件とアクションを入力し、**ルールの作成**をクリックします

    + ルール条件
      + 条件: **イベント・タイプ**
      + サービス名: **Object Storage**
      + イベント・タイプ: **Object - Create**
      + 別の条件
          + 条件: **属性**
          + 属性名: **bucketName**
          + 属性値: **(1.2項で記録した入力バケットの名前)**
    + アクション
      + アクション・タイプ: **ファンクション**
      + ファンクション・コンパートメント: **(ファンクションを作成したコンパートメント)**
      + ファンクション・アプリケーション: **(ファンクション作成時に指定したアプリケーション)**
      + ファンクション: **(Pre-Built Functionsで作成したファンクション)**
          ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/fc43789b-754d-1871-5fdf-abc98bba711a.png)

1. ルールが作成されます。左下のリソース→イベントの一致やアクションを開き、先ほど作成したルールとアクションが指定されていることを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/b7587abd-d8b6-0532-589a-941fe62df8c8.png)


# 4. 確認

1. 左上のメニュー→ストレージ→オブジェクト・ストレージとアーカイブ・ストレージから入力バケットを開き、オブジェクトの**アップロード**をクリックし、動画ファイルをアップロードします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/a71393ef-371d-4eef-c2ee-4372cd9bc43b.png)

1. しばらくするとメディアワークフロージョブが起動されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/346aaffb-6878-b3b8-65f5-fbb06702d69f.png)

    > **【TIPS】**  
    > 実行されるジョブの表示名は `PBF_<メディアワークフローの名前>_Job` となります

1. 実行されたジョブをクリックします。しばらく待つとジョブの実行が開始されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/e9219e86-7f05-35a1-0ff8-75bafd6d588c.png)

1. ジョブが完了します。動画のトランスコードが完了します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/27eab2cd-da8f-6062-dc7c-a479091de87d.png)

    > **【TIPS】**  
    > ジョブ実行により生成されたトランスコード済動画ファイルは `<出力先バケット名>/pbf/<Job output Prefix>/<動画ファイル名>/Transcode/` 配下に出力されます

1. 作成したルールを開き、メトリックを確認します。ファンクションが実行されていることを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/ad93517b-d4bd-fd82-c22c-4c727a55a0ef.png)

1. 出力先バケットに生成されたトランスコード済動画のプレイリストをOCI Media StreamsのDistribution Channelにプレイリストアセットとして取り込みます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/4b1f3898-c70b-94fe-1b30-b6c2f909b37b.png)

1. 取り込んだプレイリストアセットからプレビューURLを生成します。正しく動画再生できるか？を確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120110/035839cd-5af7-a73d-937f-4e751047ee61.png)

:::note info
動画の再生を確認するには、下記のサイトのようなhls.jsなどのJavaScriptライブラリを利用したHLSクライアントが必要です  
https://hlsjs.video-dev.org/demo/
:::

# おわりに

以上でPre-Built Functionsを利用して、OCI Media Flowのメディアワークフロージョブの自動実行を「非常に素早く簡単に」確認できました。実際の開発現場でも使うことが多いシナリオと想定されるため、あらかじめ準備されている（Pre-Built）のは非常にありがたいですね。

最後に関連するドキュメントやリンクを記載します。参考にしていただければ幸いです

- [Support for pre-built functions](https://docs.oracle.com/en-us/iaas/releasenotes/changes/4fd4758d-7efc-4225-b3ba-83bcba36c95a/) ※製品リリース情報
- [Media Workflow Job Spawner Function](https://docs.oracle.com/en-us/iaas/Content/Functions/Tasks/functions_pbf_catalog_media_workflow_job.htm) ※製品ドキュメント
- [Automate media processing jobs](https://blogs.oracle.com/cloud-infrastructure/post/automate-media-processing-jobs) ※ブログ記事
- [Automate media processing using OCI Media Flow with Pre‐Built Functions](https://docs.oracle.com/en/learn/launch-media-flow-with-pbf/)　※チュートリアル
- [Oracle Functions ご紹介 / oracle-functions-overview](https://speakerdeck.com/oracle4engineer/oracle-functions-overview) ※speakerdeck資料（日本語）
- [Oracle Functions ハンズオン](https://oracle-japan.github.io/ocitutorials/cloud-native/functions-for-beginners/) ※OCIチュートリアル（日本語）
- [OCI Digital Media Services をクイックスタートしてみた](https://qiita.com/nakasato310/items/bdf430947f516c48276a)　※Qiita記事
- [OCI Media Flowで作成したメディアワークフローの実行ログをOCIロギングで収集してみた](https://qiita.com/nakasato310/items/fef73fce4d8b5e5fb6ad)　※Qiita記事