

# CloudFormation テンプレートを使用して S3 Object Lambda のセットアップを自動化する
<a name="olap-using-cfn-template"></a>

**注記**  
2025 年 11 月 7 日現在、S3 Object Lambda は、現在サービスを使用している既存のお客様、および一部の AWS パートナーネットワーク (APN) パートナーのみが利用できます。S3 Object Lambda と同様の機能の詳細については、「[Amazon S3 Object Lambda availability change](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html)」を参照してください。

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

この [GitHub リポジトリ](https://github.com/aws-samples/amazon-s3-object-lambda-default-configuration)には、CloudFormation テンプレートと Lambda 関数のソースコードが含まれています。テンプレートの使用方法については、「[Object Lambda アクセスポイントの作成](olap-create.md)」を参照してください。

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

## テンプレートの変更
<a name="modifying-cfn-template"></a>

**新しいサポートアクセスポイントの作成**  
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 リクエストメトリクスの詳細については、「[アクセスポイントのモニタリングとログ記録](access-points-monitoring-logging.md)」を参照してください。  
料金表については、「[CloudWatch 料金表](https://aws.amazon.com/cloudwatch/pricing/)」を参照してください。

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

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

**注記**  
同時実行のプロビジョニングには追加料金が発生します。プロビジョニングされた同時実行の詳細については、「*AWS Lambda デベロッパーガイド*」の「[Lambda プロビジョニング済み同時実行数の管理](https://docs.aws.amazon.com/lambda/latest/dg/provisioned-concurrency.html)」を参照してください。  
料金の詳細については、「[AWS Lambda の料金](https://aws.amazon.com/lambda/pricing/)」を参照してください。

## Lambda 関数の変更
<a name="modifying-lambda-function"></a>

**`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 リファレンス*の [https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax](https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax) を参照してください。

**メタデータヘッダーを返します。**  
Lambda 関数を更新して、新しいヘッダー値を [https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax](https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax) 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();
}
```

**新しいステータスコードを返します。**  
カスタムステータスコードを [https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax](https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax) 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 リファレンス*の [https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax](https://docs.aws.amazon.com/AmazonS3/latest/API/API_WriteGetObjectResponse.html#API_WriteGetObjectResponse_RequestSyntax) を参照してください。

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

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

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

```
AllowedFeatures:
  - GetObject-Range
  - GetObject-PartNumber
  - HeadObject-Range 
  - HeadObject-PartNumber
```

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