当我使用 CloudFormation 预置 Amazon EC2 实例时,如何确保 CodeDeploy 代理已部署?
我正在使用 AWS CloudFormation 预置我的基础设施和 AWS CodeDeploy 资源。我想确保 CodeDeploy 代理已安装并在 Amazon Elastic Compute Cloud (Amazon EC2) 实例上运行。
简短描述
如果您创建以下任一资源作为 CodeDeploy 部署的目标,则请使用 cfn-init 和 cfn-signal 帮助程序脚本:
- AWS::EC2::Instance
- AWS::AutoScaling::AutoScalingGroup
在预置基础设施部署之前,您可以使用帮助程序脚本通过 CodeDeploy 代理完全预置目标实例。
解决方法
要使用 cfn-init 和 cfn-signal 帮助程序脚本部署 CodeDeploy 代理,请完成以下步骤以正确配置 AWS CloudFormation 模板。
1.在代码编辑器中创建 JSON 或 YAML 文件,以用作资源的 AWS CloudFormation 模板。
2.对于元数据键,使用 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.设置 UserData 属性以调用 cfn-init 脚本。
调用 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 组在特定时间段内向 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 堆栈。