CloudFormation을 사용하여 Amazon EC2 인스턴스를 프로비저닝할 때 CodeDeploy 에이전트 배포 여부를 확인하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 3월 11일

AWS CloudFormation을 사용하여 인프라와 AWS CodeDeploy 리소스를 프로비저닝하고 있습니다. CodeDeploy 에이전트가 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 설치 및 실행되고 있는지를 어떻게 확인할 수 있습니까?

간략한 설명

CodeDeploy 배포 대상으로 다음 리소스 중 하나를 생성하는 경우, cfn-initcfn-signal 도우미 스크립트를 사용합니다.

  • AWS::EC2::Instance
  • AWS::AutoScaling::AutoScalingGroup

인프라 배포를 프로비저닝하기 전에 헬퍼 스크립트를 사용하여 CodeDeploy 에이전트가 포함된 대상 인스턴스를 완전히 프로비저닝할 수 있습니다.

해결 방법

cfn-initcfn-signal 헬퍼 스크립트를 사용하여 CodeDeploy 에이전트를 배포하려면 다음 단계를 완료하여 AWS CloudFormation 템플릿을 올바르게 구성하십시오.

1.    코드 편집기에서 리소스에 AWS CloudFormation 템플릿으로 사용할 JSON 또는 YAML 파일을 생성합니다.

2.    Metadata 키의 경우, AWS::CloudFormation::Init 유형을 사용하여 인스턴스에 대한 메타데이터 또는 시작 구성을 포함시킵니다.

AWS::CloudFormation::Init 유형을 사용하는 메타데이터 키 예제

"SampleLinuxInstance" : {
            "Type" : "AWS::EC2::Instance",
            "Metadata" : {
                "AWS::CloudFormation::Init" : {
                    "config" : {
                        "packages" : {
                            "yum" : {
                                "ruby" : []
                            }
                        },
                        "files" : {
                            "/home/ec2-user/install" : {
                                "source" : {"Fn::Join" : ["", ["https://aws-codedeploy-", {"Ref" : "AWS::Region"}, ".s3.amazonaws.com/latest/install"]]},
                                "mode" : "000755"
                            }
                        },
                        "commands" : {
                            "00-install-agent" : {
                                "command" : "./install auto",
                                "cwd" : "/home/ec2-user/"
                            },
                            "01-cfn-signal" : {
                                "command" : {"Fn::Join" : ["", ["/opt/aws/bin/cfn-signal -e 0 --stack ", { "Ref": "AWS::StackName" }, " --resource SampleLinuxInstance --region ", { "Ref" : "AWS::Region" }]]}
                            }
                        }
                    }
                }
            },
            "Properties" : {
                ...
            }
        }

참고: AWS::CloudFormation::Init 유형은 CodeDeploy 에이전트의 설치 단계를 포함합니다. 또한 다음 단계를 완료한 후 CloudFormation 스택으로 다시 신호를 보내는 명령도 포함합니다.

3.    cfn-init 스크립트를 호출하도록 UserData 속성을 설정합니다.

cfn-init 스크립트를 호출하는 사용자 데이터 속성 예제

"Properties" : {
                "InstanceType" : "t2.micro",
                "ImageId" : {"Ref" : "AMI"},
                "IamInstanceProfile" : {"Ref" : "SampleInstanceProfile"},
                "KeyName" : {"Ref" : "SSHKey"},
                "UserData" :  {"Fn::Base64" : {
                    "Fn::Join" : ["", [
                        "#!/bin/bash\n",
                        "yum -y update\n",
                        "yum -y install cfn-bootstrap\n",
                        "/opt/aws/bin/cfn-init -v",
                        " --stack ", { "Ref" : "AWS::StackName" },
                        " --resource SampleLinuxInstance",
                        " --region ", { "Ref" : "AWS::Region" }, 
                        "\n"
                    ]]
                }},
                "Tags" : [
                    {
                        "Key" : {"Ref" : "InstanceTagKey"},
                        "Value" : {"Ref" : "InstanceTagValue"}
                    }
                ]
            }

4.    인스턴스 리소스의 경우, CreationPolicy 속성을 구성하여 다음을 수행합니다. 지정된 기간 이내에 Amazon EC2 인스턴스 또는 Amazon EC2 Auto Scaling 그룹이 CloudFormation에 성공 신호를 전송하도록 합니다.

Amazon EC2 인스턴스가 특정 기간 내에 CloudFormation에 성공 신호를 보내야 하는 CreationPolicy 속성의 예제

"SampleLinuxInstance" : {
            "Type" : "AWS::EC2::Instance",
            "CreationPolicy" : {
                "ResourceSignal" : {
                    "Count" : "1",
                    "Timeout" : "PT5M"
                }
            },

5.    Amazon EC2 인스턴스 또는 Amazon EC2 Auto Scaling 그룹에서 배포 그룹 리소스에 대한 명시적 종속성을 생성하려면 DependsOn 속성을 사용합니다.

예: 배포 그룹 리소스에 대한 명시적 종속성을 생성하는 DependsOn 속성

"SampleLinuxCDDeploymentGroup" : {
            "Type" : "AWS::CodeDeploy::DeploymentGroup",
            "DependsOn" : "SampleLinuxInstance",
            "Properties" : {
                "ApplicationName" : {"Ref" : "SampleCDApp"},
                "ServiceRoleArn" : {"Ref" : "ServiceRole"},
                "Ec2TagFilters" : [
                    {
                        "Key" : {"Ref" : "InstanceTagKey"},
                        "Value" : {"Ref" : "InstanceTagValue"},
                        "Type" : "KEY_AND_VALUE"
                    }
                ],
                "Deployment" : {
                    "Revision" : {
                        "RevisionType" : "S3",
                        "S3Location" : {
                            "Bucket" : {"Ref" : "BucketName"},
                            "BundleType" : {"Ref" : "BundleType"},
                            "Key" : {"Ref" : "BundleKey"}
                        }
                    }
                }
            }
        }

6.    CloudFormation 템플릿을 완료하려면 환경에 필요한 기타 추가 리소스, 속성 또는 출력을 포함합니다.

7.    완료된 템플릿을 사용하여 CloudFormation 스택을 생성합니다.