

# 쓰기 전용 속성 해결
<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/ko_kr/AWSCloudFormation/latest/UserGuide/images/IaC-generator-write-only-property-warning.png)

1. 자세히 알아보려면 **경고 세부 정보 보기**를 선택합니다. 쓰기 전용 속성이 있는 리소스는 생성된 템플릿과 리소스 유형에 사용된 논리적 ID에 따라 식별됩니다.

   경고 목록을 사용하여 쓰기 전용 속성이 있는 리소스를 식별하고 생성된 템플릿에 변경이 필요한 경우 어떤 변경이 필요한지 판단하기 위해 각 리소스를 살펴봅니다.  
![\[생성된 템플릿의 쓰기 전용 속성에 대한 IaC 생성기 콘솔의 자세한 경고\]](http://docs.aws.amazon.com/ko_kr/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 생성기는 해당 속성이 리소스에 적용되었는지 여부를 알지 못합니다. 따라서 생성된 템플릿에서 이러한 속성을 생략합니다.

## 해결 방법
<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 코드를 지정하기 위한 상호 배타적인 속성 세트가 3개 있습니다.
+ `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>

**Amazon S3 버킷에 Lambda 코드를 저장하고 `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. 생성된 템플릿으로 가져오기 작업을 실행하고 버킷 이름과 키를 파라미터 값으로 제공합니다.