始めるチュートリアル開発者ガイドAWS Lambdaを使用してAsset Managerにアセットを自動追加する

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関数にコピーします。このコードは以下を行います:

  1. 新しいアセットのためにS3バケットを監視
  2. パスを取得
  3. 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関数に設定します:

ステップ4: 関数が動作することをテストして確認する

以下を実行した後:

  1. 上記のLambda関数コードを作成および保存
  2. 環境変数を設定
  3. S3トリガーを設定

S3バケットに新しいアセットをアップロードして関数をテストします。アセットがimgixダッシュボードのAsset Managerに追加されるはずです。

アセットが追加されない場合は、以下を確認してください:

  • Lambda関数のCloudwatchログにエラーがないか確認
  • Asset Managerで正しいSource IDを確認
  • 遅延がある場合もあるため、数分後に再確認
  • Pipedreamなどのエンドポイントテストツールを使用してLambda関数をテスト

結論

このチュートリアルでは、AWS Lambda関数を使用してAsset Managerにアセットを自動追加する方法を学びました。この関数を使用すると、S3バケットからAsset Managerにアセットを大規模に取り込むことができます。