cfn-init를 사용하여 CodeDeploy 에이전트를 설치하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2019년 11월 22일

AWS CloudFormation을 사용하여 인프라와 CodeDeploy 리소스를 프로비저닝할 때 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 AWS CodeDeploy 에이전트가 설치되고 실행되는지 확인하려면 어떻게 해야 합니까?

간략한 설명

CodeDeploy를 사용하여 AWS::EC2::Instance 리소스 또는 AWS::AutoScaling::AutoScalingGroup 리소스를 배포의 대상으로 생성하는 경우 cfn-init 및 cfn-signal 헬퍼 스크립트를 사용합니다. 인프라 배포를 프로비저닝하기 전에 헬퍼 스크립트를 사용하여 CodeDeploy 에이전트로 대상 인스턴스를 완전히 프로비저닝할 수 있습니다.

해결 방법

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

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

2.    메타데이터 키의 경우 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 에이전트에 대한 설치 단계와 다음 단계를 완료한 후 AWS CloudFormation 스택에 다시 신호를 보내는 명령이 포함되어 있습니다.

3.    cfn-init 스크립트를 호출하도록 UserData 속성을 설정합니다. 다음 예제를 참조하십시오.

"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 그룹에서 성공 신호를 AWS CloudFormation으로 전송하도록 요구합니다. 다음 예제를 참조하십시오.

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

5.    Amazon EC2 인스턴스 또는 Amazon EC2 Auto Scaling 그룹에서 배포 그룹 리소스에 대한 명시적 종속성을 생성하려면 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.    AWS CloudFormation 템플릿을 완료하려면 환경에 필요한 기타 추가 리소스, 속성 또는 출력을 포함합니다.

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