

# AWS::Lambda::Function リソースの書き込み専用プロパティの問題を解決する方法
<a name="generate-IaC-lambda-function"></a>

このトピックでは、IaC ジェネレーターを使用するときの [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) リソースの書き込み専用プロパティの問題を解決する方法について説明します。

## 問題
<a name="lambda-function-mutually-exclusive-properties-issue"></a>

`AWS::Lambda::Function` リソースには、Lambda コードを指定するための相互に排他的なプロパティのセットが 3 つあります。
+ `Code/S3Bucket` と `Code/S3Key` のプロパティ、およびオプションで `Code/S3ObjectVersion` のプロパティです。
+ `Code/ImageUri` プロパティ
+ `Code/ZipFile` プロパティ

特定の `AWS::Lambda::Function` リソースに使用できるのは、これらのセットの 1 つだけです。

IaC ジェネレーターは、リソースの作成または更新に排他的な書き込み専用プロパティのどのセットが使用されたのかを特定することはできません。そのため、これには、生成されたテンプレートの最初のプロパティのセットのみが含まれます。`Code/ImageUri` プロパティと `Code/ZipFile` プロパティは省略されます。

さらに、IaC ジェネレーターは次の警告を発行します。
+ **`MUTUALLY_EXCLUSIVE_PROPERTIES`** – `Code/S3Bucket` および `Code/S3Key` が相互に排他的なプロパティとして識別されることを警告します。
+ **`UNSUPPORTED_PROPERTIES`** – `Code/S3ObjectVersion` プロパティがサポートされていないことを警告します。

生成されたテンプレートに `AWS::Lambda::Function` リソースを含めるには、正しいコードプロパティでテンプレートをダウンロードして更新する必要があります。

## 解決策
<a name="lambda-function-mutually-exclusive-properties-resolution"></a>

**Lambda コードを Amazon S3 バケットに保存し、`S3ObjectVersion` プロパティを使用しない場合**、生成されたテンプレートを修正せずにそのままインポートすることができます。IaC ジェネレーターは、インポートオペレーション中に、テンプレートのパラメータとして Amazon S3 バケットとキーを要求します。

****Lambda コードを Amazon ECR リポジトリとして保存する場合は**、以下の手順に従ってテンプレートを更新します。**

1. 生成されたテンプレートをダウンロードします。

1. 生成されたテンプレートから、`Code/S3Bucket` および `Code/S3Key` プロパティのプロパティと対応するパラメータを削除します。

1. 生成されたテンプレートで削除したプロパティを `Code/ImageUri` プロパティに置き換え、Amazon ECR リポジトリの URL を指定します。

1. 生成されたテンプレートを IaC ジェネレーターのコンソールで開き、**[編集したテンプレートをインポート]** をクリックします。

****Lambda コードを zip ファイルとして保存する場合は**、以下の手順に従ってテンプレートを更新します。**

1. 生成されたテンプレートをダウンロードします。

1. 生成されたテンプレートから、`Code/S3Bucket` および `Code/S3Key` プロパティのプロパティと対応するパラメータを削除します。

1. 生成されたテンプレートの削除されたプロパティを `Code/ZipFile` プロパティに置き換えます。

1. 生成されたテンプレートを IaC ジェネレーターのコンソールで開き、**[編集したテンプレートをインポート]** をクリックします。

****Lambda コードのコピーがない場合は**、以下の手順に従ってテンプレートを更新します。**

1. AWS Lambda [https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) API アクションを使用します ([https://docs.aws.amazon.com/cli/latest/reference/lambda/get-function.html](https://docs.aws.amazon.com/cli/latest/reference/lambda/get-function.html) AWS CLI コマンドを使用するなど)。

1. レスポンスの `RepositoryType` パラメータは、コードが Amazon S3 バケットにある場合は `S3` 、コードが Amazon ECR リポジトリにある場合は `ECR` です。

1. レスポンスの `Location` パラメータには、デプロイパッケージを 10 分間ダウンロードするときに使用できる、署名付き URL が含まれています。コードをダウンロードします。

1. このコードを Amazon S3 バケットにファイルをアップロードします。

1. 生成されたテンプレートを使ってインポートオペレーションを実行し、パラメータ値としてバケット名とキーを指定します。