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에서 기동 템플릿을 지정했을 경우는, 설정 내용을 덮어쓰기할 것이므로, 완전하게 수수께끼입니다.
다만, 모든 항목이 덧쓰기되지 않는 것은 아니고, 이하의 항목이 덧쓰기되지 않는 것 같습니다.
  • DisableApiTermination (종료 보호)
  • EbsOptimized(EBS 최적화 인스턴스)※
  • InstanceInitiatedShutdownBehavior(셧다운 동작)
  • Monitoring(CloudWatch 모니터링 세부 정보)

  • ※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 # 終了保護設定項目を追加
    

    좋은 웹페이지 즐겨찾기