CloudFormation テンプレートを使用して S3 Object Lambda のセットアップを自動化する
AWS CloudFormation テンプレートを使用すると、Amazon S3 Object Lambda アクセスポイントをすばやく作成できます。CloudFormation テンプレートは、関連するリソースを自動的に作成し、AWS Identity and Access Management (IAM) ロールを設定し、Object Lambda アクセスポイントを介してリクエストを自動的に処理する AWS Lambda 関数を設定します。CloudFormation テンプレートでベストプラクティスを実装し、セキュリティ体制を改善し、マニュアルプロセスによって引き起こされるエラーを減らすことができます。
この GitHub リポジトリ
テンプレートで提供される 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-Length
と ETag
を除くすべてのヘッダーを、署名付き 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
を参照してください。
ソースオブジェクトに Range
と partNumber
パラメータを適用します。
デフォルトでは、CloudFormation テンプレートによって作成された Object Lambda アクセスポイントは、Range
と partNumber
のパラメータを処理できます。Lambda 関数は、要求された範囲または部品番号を変換されたオブジェクトに適用します。これを行うには、関数がオブジェクト全体をダウンロードして変換を実行する必要があります。場合によっては、変換されたオブジェクト範囲がソースオブジェクトの範囲に正確にマップされることがあります。つまり、ソースオブジェクトでバイト範囲 A−B を要求して変換を実行すると、オブジェクト全体を要求して変換を実行し、変換されたオブジェクトでバイト範囲 A−B を返すのと同じ結果が得られる可能性があります。
このような場合、Lambda 関数の実装を変更して、範囲または部品番号をソースオブジェクトに直接適用できます。このアプローチにより、関数全体のレイテンシーと必要なメモリが軽減されます。詳細については、「Range および partNumber ヘッダーの操作」を参照してください。
Range
と partNumber
処理の無効化
デフォルトでは、CloudFormation テンプレートによって作成された Object Lambda アクセスポイントは、Range
と partNumber
のパラメータを処理できます。この動作が不要な場合は、テンプレートから次の行を削除して無効化することができます。
AllowedFeatures: - GetObject-Range - GetObject-PartNumber - HeadObject-Range - HeadObject-PartNumber
大きなオブジェクトの変換
デフォルトでは、Lambda 関数は、S3 Object Lambda への応答のストリーミングをスタートする前に、メモリ内のオブジェクト全体を処理します。関数を変更して、変換の実行時に応答をストリーミングできます。これにより、変換のレイテンシーと Lambda 関数のメモリサイズを軽減できます。実装例については、ストリーミング圧縮コンテンツの例を参照してください。