CloudFormation에서 생성하는 EC2가 지정된 시작 템플릿 설정으로 덮어쓰지 않음
16300 단어 EC2CloudFormationAWS
사건
CloudFormation(이하 CFn)을 사용하여 시작 템플릿에서 EC2 인스턴스(이하 EC2)를 만들 때 시작 템플릿 설정으로 덮어쓰지 않았습니다.
CFn을 사용하지 않고 관리 콘솔 (이하 매니콘)에서 템플릿에서 EC2를 시작하는 경우 문제없이 설정 내용이 반영됩니다.
아래 이미지와 같은 설정으로 시작 템플릿을 만듭니다.
※ 기동 템플릿 자체는 CFn으로 작성해도 매니콘으로부터 작성해도 바뀌지 않습니다.
CFn에서 이 기동 템플릿을 지정하여 작성한 EC2의 설정은 다음 이미지와 같습니다.
실제로 만들어진 EC2와 시작 템플릿에서 설정 내용이 다릅니다.
사용한 CFn 템플릿
시작 템플릿과 EC2를 동시에 생성하는 경우AWSTemplateFormatVersion: "2010-09-09"
Description: "Template Settings Overwrite Test"
Parameters:
ImageId:
Default: "ami-0cc75a8978fbbc969"
MinLength: 1
Type: "String"
KeyPairName:
MinLength: 1
Type: "AWS::EC2::KeyPair::KeyName"
SubnetIdForEth0:
MinLength: 1
Type: "AWS::EC2::Subnet::Id"
SecurityGroupIdsForEth0:
MinLength: 1
Type: "List<AWS::EC2::SecurityGroup::Id>"
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
-
Label:
default: "Basic Configuration"
Parameters:
- "InstanceType"
- "ImageId"
- "KeyPairName"
-
Label:
default: "NetworkInterface Configuration For Eth0"
Parameters:
- "SubnetIdForEth0"
- "SecurityGroupIdsForEth0"
Resources:
EC2LaunchTemplate:
Type: "AWS::EC2::LaunchTemplate"
DeletionPolicy: "Delete"
Properties:
LaunchTemplateName: "test_EC2LaunchTemplate"
LaunchTemplateData:
BlockDeviceMappings:
- DeviceName: "/dev/xvda"
Ebs:
DeleteOnTermination: true
Encrypted: false
VolumeSize: 8
VolumeType: "gp2"
CreditSpecification:
CpuCredits: "unlimited"
DisableApiTermination: true
EbsOptimized: true
ImageId:
Ref: "ImageId"
InstanceInitiatedShutdownBehavior: "terminate"
InstanceType: "t3.nano"
KeyName:
Ref: "KeyPairName"
Monitoring:
Enabled: true
NetworkInterfaces:
- AssociatePublicIpAddress: true
DeleteOnTermination: true
DeviceIndex: 0
Groups:
Ref: "SecurityGroupIdsForEth0"
SubnetId:
Ref: "SubnetIdForEth0"
TagSpecifications:
- ResourceType: "instance"
Tags:
- Key: "Name"
Value: "test"
- ResourceType: "volume"
Tags:
- Key: "Name"
Value: "test-root"
EC2Instance:
Type: "AWS::EC2::Instance"
Properties:
LaunchTemplate:
LaunchTemplateId: !Ref 'EC2LaunchTemplate'
Version: !GetAtt 'EC2LaunchTemplate.LatestVersionNumber'
Outputs:
EC2LaunchTemplate:
Value: !Ref 'EC2LaunchTemplate'
Export:
Name: !Sub '${AWS::StackName}-LaunchTemplateID'
위의 CFn 템플릿으로 만든 시작 템플릿을 다른 스택으로 지정하여 EC2를 만드는 경우AWSTemplateFormatVersion: "2010-09-09"
Description: "Overwriting test of template settings to be imported"
Parameters:
EC2LaunchTemplateStackName:
MinLength: 1
Type: "String"
Resources:
EC2Instance:
Type: "AWS::EC2::Instance"
Properties:
LaunchTemplate:
LaunchTemplateId:
Fn::ImportValue:
!Sub '${EC2LaunchTemplateStackName}-LaunchTemplateID'
Version: "1"
매니콘으로 만든 시작 템플릿을 지정하여 EC2를 만드는 경우AWSTemplateFormatVersion: "2010-09-09"
Description: "Overwriting test of template settings to be imported"
Resources:
EC2Instance:
Type: "AWS::EC2::Instance"
Properties:
LaunchTemplate:
LaunchTemplateId: "lt-xxxxxxxxxxxxxxxxx"
Version: "1"
AWS::EC2::Instance 문서 의 LaunchTemplate
항목에는 다음이 포함되어 있습니다.
인스턴스를 시작하는 데 사용할 시작 템플릿. AWS CloudFormation 템플릿에 지정된 모든 파라미터는 시작 템플릿의 동일한 파라미터를 덮어씁니다.
기재된 대로라면 EC2를 작성하는 CFn에서 기동 템플릿을 지정했을 경우는, 설정 내용을 덮어쓰기할 것이므로, 완전하게 수수께끼입니다.
다만, 모든 항목이 덧쓰기되지 않는 것은 아니고, 이하의 항목이 덧쓰기되지 않는 것 같습니다.
AWSTemplateFormatVersion: "2010-09-09"
Description: "Template Settings Overwrite Test"
Parameters:
ImageId:
Default: "ami-0cc75a8978fbbc969"
MinLength: 1
Type: "String"
KeyPairName:
MinLength: 1
Type: "AWS::EC2::KeyPair::KeyName"
SubnetIdForEth0:
MinLength: 1
Type: "AWS::EC2::Subnet::Id"
SecurityGroupIdsForEth0:
MinLength: 1
Type: "List<AWS::EC2::SecurityGroup::Id>"
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
-
Label:
default: "Basic Configuration"
Parameters:
- "InstanceType"
- "ImageId"
- "KeyPairName"
-
Label:
default: "NetworkInterface Configuration For Eth0"
Parameters:
- "SubnetIdForEth0"
- "SecurityGroupIdsForEth0"
Resources:
EC2LaunchTemplate:
Type: "AWS::EC2::LaunchTemplate"
DeletionPolicy: "Delete"
Properties:
LaunchTemplateName: "test_EC2LaunchTemplate"
LaunchTemplateData:
BlockDeviceMappings:
- DeviceName: "/dev/xvda"
Ebs:
DeleteOnTermination: true
Encrypted: false
VolumeSize: 8
VolumeType: "gp2"
CreditSpecification:
CpuCredits: "unlimited"
DisableApiTermination: true
EbsOptimized: true
ImageId:
Ref: "ImageId"
InstanceInitiatedShutdownBehavior: "terminate"
InstanceType: "t3.nano"
KeyName:
Ref: "KeyPairName"
Monitoring:
Enabled: true
NetworkInterfaces:
- AssociatePublicIpAddress: true
DeleteOnTermination: true
DeviceIndex: 0
Groups:
Ref: "SecurityGroupIdsForEth0"
SubnetId:
Ref: "SubnetIdForEth0"
TagSpecifications:
- ResourceType: "instance"
Tags:
- Key: "Name"
Value: "test"
- ResourceType: "volume"
Tags:
- Key: "Name"
Value: "test-root"
EC2Instance:
Type: "AWS::EC2::Instance"
Properties:
LaunchTemplate:
LaunchTemplateId: !Ref 'EC2LaunchTemplate'
Version: !GetAtt 'EC2LaunchTemplate.LatestVersionNumber'
Outputs:
EC2LaunchTemplate:
Value: !Ref 'EC2LaunchTemplate'
Export:
Name: !Sub '${AWS::StackName}-LaunchTemplateID'
AWSTemplateFormatVersion: "2010-09-09"
Description: "Overwriting test of template settings to be imported"
Parameters:
EC2LaunchTemplateStackName:
MinLength: 1
Type: "String"
Resources:
EC2Instance:
Type: "AWS::EC2::Instance"
Properties:
LaunchTemplate:
LaunchTemplateId:
Fn::ImportValue:
!Sub '${EC2LaunchTemplateStackName}-LaunchTemplateID'
Version: "1"
AWSTemplateFormatVersion: "2010-09-09"
Description: "Overwriting test of template settings to be imported"
Resources:
EC2Instance:
Type: "AWS::EC2::Instance"
Properties:
LaunchTemplate:
LaunchTemplateId: "lt-xxxxxxxxxxxxxxxxx"
Version: "1"
※EBS 최적화 인스턴스 항목에 대해서는, 기본적으로 EBS 최적화가 지원되는 인스턴스 유형 의 경우, false 지정이어도 EBS 최적화가 적용됩니다. false 로 하면 매니콘상의 표시나 awscli 로 참조한 결과는 false 가 되지만 EBS 최적화는 적용 상태가 됩니다.
결론
AWS 지원팀에 문의했는데 문제가 발생했습니다.
연락 받은 사건이 재현하는 것을 확인했습니다.
CloudFormation이 매개 변수를 암시적으로 덮어쓰는 것을 알았습니다.
덧붙여 이 동작에 대해서는 문서화되어 있지 않은 동작이 되어, 장래적으로 변경될 가능성도 생각할 수 있습니다.
AWS 지원 답변보다 ※2020/08/27 시점
해결 방법
현재는 EC2를 생성하는 CFn 템플릿의 AWS::EC2::Instance 리소스 측에서 명시적으로 속성을 지정하면 시작 템플릿을 지정해도 임의의 설정이 가능합니다.
예를 들어, 다음과 같이 CFn 템플릿을 만들면 종료 보호가 True가 됩니다.
매니콘으로 만든 시작 템플릿을 지정하여 EC2를 만드는 경우AWSTemplateFormatVersion: "2010-09-09"
Description: "Overwriting test of template settings to be imported"
Resources:
EC2Instance:
Type: "AWS::EC2::Instance"
Properties:
LaunchTemplate:
LaunchTemplateId: "lt-xxxxxxxxxxxxxxxxx"
Version: "1"
DisableApiTermination: true # 終了保護設定項目を追加
Reference
이 문제에 관하여(CloudFormation에서 생성하는 EC2가 지정된 시작 템플릿 설정으로 덮어쓰지 않음), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hiren/items/8e22d9c2c34279193cbc
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
현재는 EC2를 생성하는 CFn 템플릿의 AWS::EC2::Instance 리소스 측에서 명시적으로 속성을 지정하면 시작 템플릿을 지정해도 임의의 설정이 가능합니다.
예를 들어, 다음과 같이 CFn 템플릿을 만들면 종료 보호가 True가 됩니다.
매니콘으로 만든 시작 템플릿을 지정하여 EC2를 만드는 경우
AWSTemplateFormatVersion: "2010-09-09"
Description: "Overwriting test of template settings to be imported"
Resources:
EC2Instance:
Type: "AWS::EC2::Instance"
Properties:
LaunchTemplate:
LaunchTemplateId: "lt-xxxxxxxxxxxxxxxxx"
Version: "1"
DisableApiTermination: true # 終了保護設定項目を追加
Reference
이 문제에 관하여(CloudFormation에서 생성하는 EC2가 지정된 시작 템플릿 설정으로 덮어쓰지 않음), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hiren/items/8e22d9c2c34279193cbc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)