カスタムアプリケーションの内部 how-custom-application-works
次の図は、クライアントでカスタムアプリケーションを使用してデジタルアセットを処理する際のエンドツーエンドのワークフローを示しています。
図:Adobe Asset Compute Service を使用してアセットを処理する手順。
登録 registration
クライアントは、/process
への最初のリクエストの前に /register
を 1 回呼び出して、Adobe Asset Compute の Adobe I/O Events イベントを受信するためのジャーナル URL を設定および取得する必要があります。
curl -X POST \
https://asset-compute.adobe.io/register \
-H "x-ims-org-id: $ORG_ID" \
-H "x-gw-ims-org-id: $ORG_ID" \
-H "Authorization: Bearer $JWT_TOKEN" \
-H "x-api-key: $API_KEY"
@adobe/asset-compute-client
JavaScript ライブラリを NodeJS アプリケーションで使用すると、登録から処理、非同期イベント処理まで、必要なすべての手順を実行できます。必要なヘッダーについて詳しくは、認証と承認を参照してください。
処理 processing
クライアントは処理リクエストを送信します。
curl -X POST \
https://asset-compute.adobe.io/process \
-H "x-ims-org-id: $ORG_ID" \
-H "x-gw-ims-org-id: $ORG_ID" \
-H "Authorization: Bearer $JWT_TOKEN" \
-H "x-api-key: $API_KEY" \
-d "<RENDITION_JSON>
クライアントは、署名済みの URL を使用してレンディションの形式を正しく設定する必要があります。@adobe/node-cloud-blobstore-wrapper
JavaScript ライブラリを NodeJS アプリケーションで使用すると、URL に事前に署名することができます。現在、このライブラリでは Azure Blob ストレージと AWS S3 コンテナのみをサポートしています。
処理リクエストは、Adobe I/O イベントのポーリングに使用できる requestId
値を返します。
カスタムアプリケーションの処理リクエストの例を以下に示します。
{
"source": "https://www.adobe.com/some-source-file.jpg",
"renditions" : [
{
"worker": "https://my-project-namespace.adobeioruntime.net/api/v1/web/my-namespace-version/my-worker",
"name": "rendition1.jpg",
"target": "https://some-presigned-put-url-for-rendition1.jpg",
}
],
"userData": {
"my-asset-id": "1234567890"
}
}
Asset Compute Service が、カスタムアプリケーションレンディションリクエストをカスタムアプリケーションに送信します。指定されたアプリケーション URL(App Builder のセキュアな web アクション URL)への HTTP POST が使用されます。すべてのリクエストで HTTPS プロトコルが使用されるので、データのセキュリティは最大になります。
カスタムアプリケーションで使用する Asset Compute SDK が HTTP POST リクエストを処理します。また、ソースのダウンロード、レンディションのアップロード、Adobe I/O Events の送信、エラー処理も行います。
アプリケーションコード application-code
カスタムコードでは、ローカルで使用可能なソースファイル(source.path
)を受け取るコールバックのみ提供するだけです。rendition.path
は、アセット処理リクエストの最終結果を保存する場所です。カスタムアプリケーションでは、このコールバックを使用し、渡された名前(rendition.path
)を使用して、ローカルで使用可能なソースファイルを、レンディションファイルに変換します。レンディションを作成するには、カスタムアプリケーションが rendition.path
に書き込む必要があります。
const { worker } = require('@adobe/asset-compute-sdk');
const fs = require('fs').promises;
// worker() is the entry point in the SDK "framework".
// The asynchronous function defined is the rendition callback.
exports.main = worker(async (source, rendition) => {
// Tip: custom worker parameters are available in rendition.instructions.
console.log(rendition.instructions.name); // should print out `rendition.jpg`.
// Simplest example: copy the source file to the rendition file destination so as to transfer the asset as is without processing.
await fs.copyFile(source.path, rendition.path);
});
ソースファイルのダウンロード download-source
カスタムアプリケーションは、ローカルファイルのみを扱います。この ASSET COMPUTESDK ソースファイルのダウンロードを処理します。
レンディションの作成 rendition-creation
SDK は、レンディションごとに非同期のレンディションコールバック関数を呼び出します。
このコールバック関数は、source オブジェクトと rendition オブジェクトにアクセスできます。source.path
は既に存在し、ソースファイルのローカルコピーへのパスになっています。rendition.path
は、処理済みレンディションの保存先となるパスです。disableSourceDownload フラグが設定されていない場合、アプリケーションは rendition.path
を正確に使用する必要があります。そうでない場合、SDK はレンディションファイルを特定または識別できず、失敗します。
なお、この例は、カスタムアプリケーションの構造に焦点をあてるために、極端に単純化されています。アプリケーションは、ソースファイルをレンディション先にコピーするだけです。
レンディションコールバックパラメーターについて詳しくは、Asset Compute SDK API を参照してください。
レンディションのアップロード upload-rendition
各レンディションが作成され、rendition.path
で指定されたパスでファイルに保存されたら、Asset Compute SDK は各レンディションをクラウドストレージ(AWS か Azure のいづれか)にアップロードします。カスタムアプリケーションは、受信リクエストに、同じアプリケーション URL を示す複数のレンディションが含まれている場合に限り、同時に複数のレンディションを取得します。クラウドストレージへのアップロードは、各レンディションの後、次のレンディションのコールバックを実行する前に実行されます。
この batchWorker()
の動作は異なります。 すべてのレンディションを処理し、すべてのレンディションが処理された後にのみ、アップロードします。
Adobe I/O イベント aio-events
SDK は、レンディションごとに Adobe I/O Events を送信します。これらのイベントは、結果に応じて rendition_created
か rendition_failed
のどちらかのタイプになります。詳しくは、を参照してください Asset compute非同期イベント.
Adobe I/O イベントを受信 receive-aio-events
クライアントは、消費ロジックに従って Adobe I/O Events ジャーナルをポーリングします。最初のジャーナル URL は、/register
API 応答で提供される URL です。イベントは、requestId
を使用して識別できます。この ID はイベントに存在し、/process
で返されるものと同じです。レンディションごとに個別のイベントがあります。このイベントは、レンディションがアップロードされる(または失敗する)とすぐに送信されます。一致するイベントを受信すると、クライアントは結果のレンディションを表示または処理できます。
JavaScript ライブラリ asset-compute-client
では、waitActivation()
メソッドを使用してすべてのイベントを取得するので、ジャーナルのポーリングが簡単になります。
const events = await assetCompute.waitActivation(requestId);
await Promise.all(events.map(event => {
if (event.type === "rendition_created") {
// get rendition from cloud storage location
}
else if (event.type === "rendition_failed") {
// failed to process
}
else {
// other event types
// (could be added in the future)
}
}));
ジャーナルイベントの取得方法について詳しくは、Adobe I/O Events API を参照してください。