

# 如何解决 AWS::Lambda::Function 资源中的只写属性问题
<a name="generate-IaC-lambda-function"></a>

本主题介绍如何解决在使用 IaC 生成器时的 [AWS::Lambda::Function](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) 资源只写属性问题。

## 问题
<a name="lambda-function-mutually-exclusive-properties-issue"></a>

`AWS::Lambda::Function` 资源具有三组互斥属性，用于指定 Lambda 代码：
+ `Code/S3Bucket` 和 `Code/S3Key` 属性，以及可选的 `Code/S3ObjectVersion` 属性
+ `Code/ImageUri` 属性
+ `Code/ZipFile` 属性

任何给定的 `AWS::Lambda::Function` 资源只能使用其中的一组属性。

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. 使用 Amazon Lambda [`GetFunction`](https://docs.amazonaws.cn/lambda/latest/api/API_GetFunction.html) API 操作（例如，通过使用 [`aws lambda get-function`](https://docs.amazonaws.cn/cli/latest/reference/lambda/get-function.html) Amazon CLI 命令）。

1. 在响应中，如果代码位于 Amazon S3 存储桶中，则 `RepositoryType` 参数为 `S3`；如果代码位于 Amazon ECR 存储库中，则该参数为 `ECR`。

1. 在响应中，`Location` 参数包含一个预签名 URL，您可以用其下载部署包 10 分钟。下载代码。

1. 将代码上传到 Amazon S3 存储桶。

1. 使用生成的模板运行导入操作，并提供桶名称和密钥作为参数值。