CloudFormation テンプレートを使用して S3 Object Lambda のセットアップを自動化する - Amazon Simple Storage Service

CloudFormation テンプレートを使用して S3 Object Lambda のセットアップを自動化する

AWS CloudFormation テンプレートを使用すると、Amazon S3 Object Lambda アクセスポイントをすばやく作成できます。CloudFormation テンプレートは、関連するリソースを自動的に作成し、AWS Identity and Access Management (IAM) ロールを設定し、Object Lambda アクセスポイントを介してリクエストを自動的に処理する AWS Lambda 関数を設定します。CloudFormation テンプレートでベストプラクティスを実装し、セキュリティ体制を改善し、マニュアルプロセスによって引き起こされるエラーを減らすことができます。

この GitHub リポジトリには、CloudFormation テンプレートと Lambda 関数のソースコードが含まれています。テンプレートの使用方法については、「Object Lambda アクセスポイントの作成」を参照してください。

テンプレートで提供される Lambda 関数が変換を実行することはありません。代わりに、S3 バケットからオブジェクトをそのまま返します。関数をクローン化し、独自の変換コードを追加して、データがアプリケーションに返されるときに変更および処理できます。関数の変更の詳細については、「Lambda 関数の変更」と「S3 Object Lambda アクセスポイントの Lambda 関数の記述」を参照してください。

テンプレートの変更

新しいサポートアクセスポイントの作成

S3 Object Lambda は、Object Lambda アクセスポイントと、サポートアクセスポイントと呼ばれる、標準の S3 アクセスポイントの 2 つのアクセスポイントを使用します。Object Lambda アクセスポイントにリクエストを行うと、S3 は S3 Object Lambda の設定に応じて、ユーザーに代わって Lambda を呼び出すか、サポートアクセスポイントにリクエストを委任します。テンプレートのデプロイ時に、aws cloudformation deploy コマンドの一部として次のパラメータを渡すことにより、新しいサポートアクセスポイントを作成できます。

CreateNewSupportingAccessPoint=true
関数ペイロードの設定。

テンプレートをデプロイするときに aws cloudformation deploy コマンドの一部として、次のパラメータを渡すことにより、Lambda 関数に補足データを提供するようにペイロードを設定できます。

LambdaFunctionPayload="format=json"
Amazon CloudWatch モニタリングを有効にします。

テンプレートをデプロイするときに aws cloudformation deploy コマンドの一部として<次のパラメータを渡すことで、CloudWatch モニタリングを有効にできます。

EnableCloudWatchMonitoring=true

このパラメータにより、Amazon S3 リクエストメトリクスの Object Lambda アクセスポイントが有効になり、クライアント側とサーバー側のエラーをモニタリングする 2 つの CloudWatch アラームが作成されます。

注記

Amazon CloudWatch の使用には追加コストが発生します。Amazon S3 リクエストメトリクスの詳細については、「アクセスポイントのモニタリングとログ記録」を参照してください。

料金表については、「CloudWatch 料金表」を参照してください。

プロビジョニング済み同時実行の設定

レイテンシーを低減するために、Object Lambda アクセスポイントをサポートする Lambda 関数にプロビジョニングされた同時実行を設定するには、テンプレートを編集して、Resources の以下の行を含めます。

LambdaFunctionVersion: Type: AWS::Lambda::Version Properties: FunctionName: !Ref LambdaFunction ProvisionedConcurrencyConfig: ProvisionedConcurrentExecutions: Integer
注記

同時実行のプロビジョニングには追加料金が発生します。プロビジョニングされた同時実行の詳細については、「AWS Lambdaデベロッパーガイド」の「Lambda プロビジョニング済み同時実行数の管理」を参照してください。

料金の詳細については、「AWS Lambda の料金表」を参照してください。

Lambda 関数の変更

GetObject リクエストのヘッダー値の変更

デフォルトでは、Lambda 関数は Content-LengthETag を除くすべてのヘッダーを、署名付き URL リクエストから GetObject クライアントに転送します。Lambda 関数の変換コードに基づいて、新しいヘッダー値を GetObject クライアントに送信を選択できます。

Lambda 関数を更新して、新しいヘッダー値を WriteGetObjectResponse API オペレーションで渡すことで送信できます。

例えば、Lambda 関数が Amazon S3 オブジェクトのテキストを別の言語に変換する場合、Content-Language ヘッダーに新しい値を渡すことができます。これを行うには、以下のように writeResponse 関数を変更します。

async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest }, ...headers, ContentLanguage: 'my-new-language' }).promise(); }

サポートされているヘッダーの完全なリストについては、Amazon Simple Storage Service API リファレンスWriteGetObjectResponse を参照してください。

メタデータヘッダーを返します。

Lambda 関数を更新して、新しいヘッダー値を WriteGetObjectResponse API オペレーションリクエストで渡すことで送信できます。

async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest, 'my-new-header': 'my-new-value' }, ...headers }).promise(); }
新しいステータスコードを返します。

カスタムステータスコードを WriteGetObjectResponse API オペレーションリクエストで渡すことにより、GetObject クライアントに返すことができます。

async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest }, ...headers, StatusCode: Integer }).promise(); }

サポートされているステータスコードの完全なリストについては、Amazon Simple Storage Service API リファレンスWriteGetObjectResponse を参照してください。

ソースオブジェクトに RangepartNumber パラメータを適用します。

デフォルトでは、CloudFormation テンプレートによって作成された Object Lambda アクセスポイントは、RangepartNumber のパラメータを処理できます。Lambda 関数は、要求された範囲または部品番号を変換されたオブジェクトに適用します。これを行うには、関数がオブジェクト全体をダウンロードして変換を実行する必要があります。場合によっては、変換されたオブジェクト範囲がソースオブジェクトの範囲に正確にマップされることがあります。つまり、ソースオブジェクトでバイト範囲 A−B を要求して変換を実行すると、オブジェクト全体を要求して変換を実行し、変換されたオブジェクトでバイト範囲 A−B を返すのと同じ結果が得られる可能性があります。

このような場合、Lambda 関数の実装を変更して、範囲または部品番号をソースオブジェクトに直接適用できます。このアプローチにより、関数全体のレイテンシーと必要なメモリが軽減されます。詳細については、「Range および partNumber ヘッダーの操作」を参照してください。

RangepartNumber 処理の無効化

デフォルトでは、CloudFormation テンプレートによって作成された Object Lambda アクセスポイントは、RangepartNumber のパラメータを処理できます。この動作が不要な場合は、テンプレートから次の行を削除して無効化することができます。

AllowedFeatures: - GetObject-Range - GetObject-PartNumber - HeadObject-Range - HeadObject-PartNumber
大きなオブジェクトの変換

デフォルトでは、Lambda 関数は、S3 Object Lambda への応答のストリーミングをスタートする前に、メモリ内のオブジェクト全体を処理します。関数を変更して、変換の実行時に応答をストリーミングできます。これにより、変換のレイテンシーと Lambda 関数のメモリサイズを軽減できます。実装例については、ストリーミング圧縮コンテンツの例を参照してください。