

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 解決唯寫屬性
<a name="generate-IaC-write-only-properties"></a>

使用 CloudFormation IaC 產生器，您可以使用已在帳戶中佈建且尚未由 CloudFormation 管理的資源來產生範本。不過，某些資源屬性會指定為*唯寫*，這表示其可以寫入，但 CloudFormation 無法讀取，例如資料庫密碼。

透過現有資源產生 CloudFormation 範本時，唯寫屬性會帶來挑戰。在大多數情況下，CloudFormation 會將這些屬性轉換為所產生範本中的參數。這可讓您在匯入操作期間將屬性輸入為參數值。不過，在某些情況下無法進行此轉換，CloudFormation 會以不同的方式處理這些案例。

## 互斥屬性
<a name="write-only-mutually-exclusive-properties"></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) 的程式碼。
+ `Code/S3Bucket`、`Code/S3Key` 和可選的 `Code/S3ObjectVersion`
+ `Code/ImageUri`
+ `Code/ZipFile`

所有這些屬性都是唯寫屬性。IaC 產生器會選取其中一個專用屬性集，並將其新增至產生的範本。系統會為每個唯寫屬性新增參數。參數名稱包含 `OneOf`，參數說明指出對應的屬性可以取代為其他專用屬性。IaC 產生器會為包含的屬性設定 `MUTUALLY_EXCLUSIVE_PROPERTIES` 的警告類型。

## 互斥類型
<a name="write-only-mutually-exclusive-types"></a>

在某些情況下，唯寫屬性可以是多種資料類型。例如，[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html) 的 `Body` 屬性可以是 `object` 或 `string`。在這種情況下，IaC 產生器會使用 `string` 的類型在產生的範本中包含屬性，並設定 `MUTUALLY_EXCLUSIVE_TYPES` 的警告類型。

## Array 屬性
<a name="write-only-array-properties"></a>

如果唯寫屬性具有 `array` 類型，則 IaC 產生器無法將其包含在產生的範本中，因為參數只能是純量值。在此情況下，會從範本中省略該屬性，並設定 `UNSUPPORTED_PROPERTIES` 的警告類型。

## 可選屬性
<a name="write-only-optional-properties"></a>

對於選用的唯寫屬性，IaC 產生器無法偵測在設定資源時是否使用屬性。在此情況下，會從產生的範本中省略該屬性，並設定 `UNSUPPORTED_PROPERTIES` 的警告類型。

## 警告和後續步驟
<a name="write-only-properties-warnings-and-next-steps"></a>

若要確定哪些屬性為唯讀屬性，必須查看 IaC 產生器主控台傳回的警告。[AWS 資源和屬性類型參考](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html)不會指出屬性是否為唯讀屬性，或者它是否支援多種類型。

或者，可以從資源提供者結構描述中查看哪些屬性是唯讀屬性。若要下載資源提供者結構描述，請參閱 [CloudFormation 資源提供者結構描述](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/resource-type-schemas.html)。

**若要解決唯寫屬性的問題**

1. 開啟 CloudFormation 主控台的 [IaC 產生器頁面](https://console.aws.amazon.com/cloudformation/home?#iac-generator)。

1. 在畫面頂端的導覽列上， AWS 區域 為您的範本選擇 。

1. 選擇**範本**索引標籤，然後選擇建立的範本名稱。

1. 在**範本定義**索引標籤中，當產生的範本包含具有唯寫屬性的資源時，IaC 產生器主控台會顯示警告，其中包含問題類型的摘要。例如：  
![\[有關所產生範本中唯寫屬性的 IaC 產生器主控台警告\]](http://docs.aws.amazon.com/zh_tw/AWSCloudFormation/latest/UserGuide/images/IaC-generator-write-only-property-warning.png)

1. 選擇**檢視警告詳細資訊**以取得更多詳細資訊。由所產生的範本和資源類型中使用的邏輯 ID 來識別具有唯寫屬性的資源。

   使用警告清單來識別具有唯寫屬性的資源，並查看每個資源，以確定需要對產生的範本進行哪些變更 (如果有的話)。  
![\[有關所產生範本中唯寫屬性的 IaC 產生器主控台詳細警告\]](http://docs.aws.amazon.com/zh_tw/AWSCloudFormation/latest/UserGuide/images/IaC-generator-write-only-property-resource-warning.png)

1. 如果必須更新範本以解決唯寫屬性的問題，請執行下列動作：

   1. 選擇**下載**以下載範本副本。

   1. 編輯範本。

   1. 變更完成後，可以選擇**匯入已編輯的範本**按鈕以繼續匯入程序。

# 如何解決 AWS::ApiGateway::RestAPI 資源中唯寫屬性的問題
<a name="generate-IaC-apigateway-restapi"></a>

本主題說明如何在使用 IaC 產生器時解決 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html) 資源中唯寫屬性的問題。

## 問題
<a name="apigateway-restapi-write-only-properties-issue"></a>

當產生的範本包含 `AWS::ApiGateway::RestApi` 資源時，會產生警告，指出 `Body`、`BodyS3Location`和 `CloneFrom` 屬性已標識為 `UNSUPPORTED_PROPERTIES`。這是因為其是選用的唯寫屬性。IaC 產生器不知道這些屬性是否曾經套用至資源。因此，它會在產生的範本中忽略這些屬性。

## Resolution
<a name="apigateway-restapi-write-only-properties-resolution"></a>

若要設定 REST API 的 `Body` 屬性，請更新產生的範本。

1. 使用 Amazon API Gateway [https://docs.aws.amazon.com/apigateway/latest/api/API_GetExport.html](https://docs.aws.amazon.com/apigateway/latest/api/API_GetExport.html) API 動作來下載 API。例如，使用 [https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-export.html](https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-export.html) AWS CLI 命令。如需詳細資訊，請參閱《API Gateway 開發人員指南》**中的[從 API Gateway 匯出 REST API](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-export-api.html)。

1. 從 `GetExport` API 動作的回應中擷取 `Body` 屬性。將其上傳至 Amazon S3 儲存貯體。

1. 下載產生的範本。

1. 將 `BodyS3Location/Bucket` 和 `BodyS3Location/Key` 屬性新增至範本，指定存放 `Body` 的儲存貯體名稱和金鑰。

1. 在 IaC 產生器主控台中開啟產生的範本，然後選擇**匯入已編輯的範本**。

# 如何解決 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 程式碼：
+ `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` 資源，必須下載並更新具有正確程式碼屬性的範本。

## Resolution
<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. 使用 API AWS Lambda [https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html)動作 （例如，使用 [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. 在回應中，如果程式碼位於 Amazon S3 儲存貯體中，則 `RepositoryType` 參數為 `S3`，如果程式碼位於 Amazon ECR 儲存庫中，則為 `ECR`。

1. 在回應中，`Location` 參數包含預先簽章的 URL，可用來下載部署套件，時長 10 分鐘。下載程式碼。

1. 將程式碼上傳至 Amazon S3 儲存貯體。

1. 使用產生的範本來執行匯入操作，並提供儲存貯體名稱和金鑰作為參數值。