AWS Lambdaを使用してAsset Managerにアセットを自動追加する
アセットをAsset Managerに直接アップロードするのが最適ですが、できない場合もあります。
例えば、ユーザーがユーザー生成コンテンツをS3バケットに直接アップロードする場合です。この場合、AWS Lambda関数を使用してアセットを自動的にAsset Managerに追加することができます。
このチュートリアルでは、S3バケットで新しいアセットを監視し、それをAsset Managerに追加するAWS Lambda関数の作成方法を学びます。
Asset Managerを使用しなくてもRendering APIを利用可能です
Originに追加されたアセットは、Rendering APIを通じてOriginパスから自動的に利用可能になります。画像の配信方法については、Serving Assetsガイドをご覧ください。
この記事では特に、メタデータとタグ付けなどの追加機能を活用するためにAsset Managerにアセットを追加する方法に焦点を当てています。また、ユーザーがリクエストする前にVideo APIを使用して動画をトランスコードするために自動エンコードする方法にも使用できます。
前提条件
- AWS S3バケット
- AWS Lambda (ランタイム: Node.js 22.x)
実装
ステップ1: Lambda Layerの作成
まず、以下の2つのガイドに従って、Lambda関数をS3バケットに接続するためのLambda Layerを作成します。
これらのチュートリアルを使用して、S3に接続されたLambda関数の作成と理解を行うことをお勧めします。以下を理解していることを確認してください:
- Lambda関数でのコード作成と変更
- Cloudwatchを使用してログを確認しテストする
- Lambda関数のトリガー (S3 -> Lambda) の設定
関数の作成とテスト方法を理解したら、次のコードを関数にコピーできます。
ステップ2: Lambda関数にコードをコピーする
次のコードをLambda関数にコピーします。このコードは以下を行います:
- 新しいアセットのためにS3バケットを監視
- パスを取得
add
エンドポイントを使用してimgixへのリクエストを構築
import https from "https";
export async function handler(event) {
try {
// Extract bucket name and object key from the event
const record = event.Records[0];
const objectKey = decodeURIComponent(
record.s3.object.key.replace(/\+/g, " ")
);
// Retrieve environment variables
const imgixApiKey = process.env.IMGIX_API_KEY;
const imgixSourceId = process.env.IMGIX_SOURCE_ID;
if (!imgixApiKey || !imgixSourceId) {
console.error(
"IMGIX_API_KEY or IMGIX_SOURCE_ID is not set in environment variables."
);
throw new Error(
"Server configuration error: Missing IMGIX_API_KEY or IMGIX_SOURCE_ID."
);
}
// Prepare the Origin path for the imgix add endpoint
const originPath = encodeURIComponent(objectKey);
// Create the request body
const requestBody = JSON.stringify({});
// Options for the HTTPS request
const options = {
hostname: "api.imgix.com",
path: `/api/v1/sources/${imgixSourceId}/assets/add/${originPath}`,
method: "POST",
headers: {
Authorization: `Bearer ${imgixApiKey}`,
"Content-Type": "application/json",
"Content-Length": Buffer.byteLength(requestBody),
},
};
// Make a request to the imgix add endpoint
const response = await makeHttpsRequest(options, requestBody);
console.log("Asset added successfully:", response);
return {
statusCode: 200,
body: JSON.stringify({ message: "Asset added successfully" }),
};
} catch (error) {
console.error("Error adding asset to imgix:", error);
return {
statusCode: 500,
body: JSON.stringify({ error: "Failed to add asset to imgix" }),
};
}
}
// Helper function to make HTTPS requests
function makeHttpsRequest(options, body) {
return new Promise((resolve, reject) => {
const req = https.request(options, (res) => {
res.on("end", () => {
if (res.statusCode >= 200 && res.statusCode 300) {
resolve();
} else {
reject(new Error(`HTTP ${res.statusCode}`));
}
});
});
req.on("error", (error) => {
reject(error);
});
// Send the request body
req.write(body);
req.end();
});
}
ステップ3: 環境変数を設定する
次に、以下の環境変数をLambda関数に設定します:
IMGIX_API_KEY
: imgixのAPIキーIMGIX_SOURCE_ID
: アセットを追加するimgix Source ID
ステップ4: 関数が動作することをテストして確認する
以下を実行した後:
- 上記のLambda関数コードを作成および保存
- 環境変数を設定
- S3トリガーを設定
S3バケットに新しいアセットをアップロードして関数をテストします。アセットがimgixダッシュボードのAsset Managerに追加されるはずです。
アセットが追加されない場合は、以下を確認してください:
- Lambda関数のCloudwatchログにエラーがないか確認
- Asset Managerで正しいSource IDを確認
- 遅延がある場合もあるため、数分後に再確認
- Pipedreamなどのエンドポイントテストツールを使用してLambda関数をテスト
結論
このチュートリアルでは、AWS Lambda関数を使用してAsset Managerにアセットを自動追加する方法を学びました。この関数を使用すると、S3バケットからAsset Managerにアセットを大規模に取り込むことができます。