如何使用 cfn-init 安装 CodeDeploy 代理?
上次更新时间:2019 年 11 月 22 日
在通过 AWS CloudFormation 预置我的基础设施和 CodeDeploy 资源时,如何确保 AWS CodeDeploy 代理已安装,并且在 Amazon Elastic Compute Cloud (Amazon EC2) 实例上运行?
简短描述
解决方法
要使用 cfn-init 和 cfn-signal 帮助程序脚本部署 CodeDeploy 代理,完成以下步骤以正确配置 AWS CloudFormation 模板。
1. 在代码编辑器中,创建 JSON 或 YAML 文件,并将其作为资源的 AWS CloudFormation 模板。
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. 设置 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 组在指定时段向 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 堆栈。