AWS CodeDeploy可以对任何实例做软件部署,包括Amazon EC2实例和本地运行的实例。它可以帮助您避免在部署过程中停机,还可以集中控制您的应用程序、实例、部署和部署配置。这个帖子介绍了如何在您上传应用程序到Amazon S3时自动启动CodeDeploy部署。一旦您的应用新版本上传完毕,CodeDeploy就会收到来自AWS Lambda的通知。 AWS Lambda是一个计算服务,它可以依照响应事件运行您的代码。其所支持的AWS 服务一旦引发事件,Lambda 会立即执行您的代码。 先决条件
Lambda 执行角色
我们需要创建一个执行角色,允许Lambda执行创建部署的函数。要创建执行角色需按照以下策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:*" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::BUCKET_NAME/*" ] }, { "Effect": "Allow", "Action": "codedeploy:GetDeploymentConfig", "Resource": "arn:aws:codedeploy:us-east-1:123ACCOUNTID:deploymentconfig:*" }, { "Effect": "Allow", "Action": "codedeploy:RegisterApplicationRevision", "Resource": "arn:aws:codedeploy:us-east-1:123ACCOUNTID:application:*" }, { "Effect": "Allow", "Action": "codedeploy:GetApplicationRevision", "Resource": "arn:aws:codedeploy:us-east-1:123ACCOUNTID:application:*" }, { "Effect": "Allow", "Action": "codedeploy:CreateDeployment", "Resource": "arn:aws:codedeploy:us-east-1:123ACCOUNTID:deploymentgroup:*" } ] }
确定您用于上传CodeDeploy应用版本的S3bucket替换掉了BUCKET_NAME。如果使用的是不同区域,您还需要替换掉“us-east-1”,并用帐户设置页面显示的AWS帐户ID替换掉“123ACCOUNTID”。
1. 进入“IAM策略”页面。
2. 点击“创建策略”。
3. 选择“创建我自己的策略”选项。
4. 将“策略名称”设置为CodeDeployDeploymentPolicy,将以上CodeDeploy部署策略粘贴到“策略文档”区域。
5. 进入“IAM 角色”页面。
6. 点击“创建新角色”。
7. 输入名字“LambdaExecutionRole”,点击下一步。
8. 在“选择角色类型”页卡下选择“AWS Service Roles”,然后选择“AWS Lambda”,点击下一步。
9. 在附加策略页面选择“CodeDeployDeploymentPolicy”,点击下一步。
10. 点击“创建角色”,成功创建一个新角色。
一旦您成功创建Lambda执行角色,Trust Relationships策略会变成这样:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ]
通过这个角色,您可以访问写入Amazon CloudWatch日志,在指定的S3bucket执行GetObject操作,以及使用CodeDeploy进行部署。该CloudWatch日志的权限是可选的,它可以在出现错误时记录异常,从而使调试更加得心应手。信任策略则保证Lambda有权限代表用户执行上述操作。
Lambda 函数
lambda函数是从Amazon S3获得通告机制的,其包含源bucket和密钥,一般通过查看扩展来检测对象类型,默认为Linux系统命令。然后,它在S3bucket调用getObject和密钥,读取对象的元数据。它预计可以读取对象元数据的两个参数。
这些值代表自动部署此S3对象的CodeDeploy应用和部署组。接下来我们讨论如何将这些值更快传递给Lambda函数。
var aws = require('aws-sdk'); var s3 = new aws.S3({apiVersion: '2006-03-01'}); var codedeploy = new aws.CodeDeploy(); var artifact_type; var bucket; var key; exports.handler = function(event, context) { /* runtime functions */ function getS3ObjectAndCreateDeployment() { // Get the s3 object to fetch application-name and deploymentgroup-name metadata. s3.headObject({ Bucket: bucket, Key: key }, function(err, data) { if (err) { context.done('Error', 'Error getting s3 object: ' + err); } else { console.log('Creating deployment'); createDeployment(data); } }); } function createDeployment(data) { if (!data.Metadata['application-name'] || !data.Metadata['deploymentgroup-name']) { console.error('application-name and deploymentgroup-name object metadata must be set.'); context.done(); } var params = { applicationName: data.Metadata['application-name'], deploymentGroupName: data.Metadata['deploymentgroup-name'], description: 'Lambda invoked codedeploy deployment', ignoreApplicationStopFailures: false, revision: { revisionType: 'S3', s3Location: { bucket: bucket, bundleType: artifact_type, key: key } } }; codedeploy.createDeployment(params, function (err, data) { if (err) { context.done('Error','Error creating deployment: ' + err); } else { console.log(data); // successful response console.log('Finished executing lambda function'); context.done(); } }); } console.log('Received event:'); console.log(JSON.stringify(event, null, ' ')); // Get the object from the event bucket = event.Records[0].s3.bucket.name; key = event.Records[0].s3.object.key; tokens = key.split('.'); artifact_type = tokens[tokens.length - 1]; if (artifact_type == 'gz') { artifact_type = 'tgz'; } else if (['zip', 'tar', 'tgz'].indexOf(artifact_type) < 0) { artifact_type = 'tar'; } getS3ObjectAndCreateDeployment(); };
注册Lambda 函数
注册 Lambda 函数十分简单,只需以下几步:
1. 进入AWS Lambda控制台。
2. 点击“创建Lambda函数”。
3. 填写名称和描述。
4. 将上述代码粘贴到Lambda 函数代码区, 替换掉系统默认内容。
5. 将处理器名称保留为“handler”。
6. 角色名选择之前创建的Lambda执行角色。
7. 如果您打算上传较大的应用程序,比如大于5MB的版本,您可以在高级设置里适当增加内存和超时数值。如若不需要就保留默认值。
8. 点击“创建Lambda函数”。
9. 选择该函数,点击“Actions”,选择“添加事件源”。
10. 事件源类型选择S3。
11. 选择 S3 bucket.
12. 事件类型选择对象创建.
13. 点击提交.
上传应用程序到Amazon S3
上述所有步骤完成后,您就可以将应用新版本上传到配置过的S3 bucket。请确保在上传时指定以下自定义元数据。
• 应用程序—名称
• 部署组—名称
这样Lambda就可以在指定应用和部署组上创建部署。如果您是通过Amazon S3控制台上传,请执行以下操作:
1. 进入S3 控制台,点击将要上传应用版本的bucket。
2. 点击“上传”。
3. 点击AddFiles添加 CodeDeploy丛。
4. 点击SetDetails>。
5. 点击SetPermissions>。
6. 点击SetMetadata>。
7. 点击Add more metadata。
8. 添加所需元数据后, 点击“开始上传”。
注:自定义对象元数据的前缀应使用x-amz-meta-,例如x-amz-meta-application-name或x-amz-meta-deploymentgroup-name。Amazon S3依靠此前缀区分用户元数据和其他标头。
如果您忘记在S3上传时指定上述对象元数据,Lambda函数会记录类似于以下AWS CloudWatch错误的错误。
这样的Lambda函数只是一个简单的例子,用以展示如何连接AWS CodeDeploy与其他AWS服务。您可以创建类似的函数来执行其他CodeDeploy行动,应对其他事件。
活动推荐: AWSome Day—让您大有作为(北京站)
活动推荐:5月26日 ImapBox在线培训——AWS 云计算环境中的机器学习
订阅“AWS中文技术社区”微信公众号,实时掌握AWS技术及产品消息!
AWS中文技术社区为广大开发者提供了一个Amazon Web Service技术交流平台,推送AWS最新资讯、技术视频、技术文档、精彩技术博文等相关精彩内容,更有AWS社区专家与您直接沟通交流!快加入AWS中文技术社区,更快更好的了解AWS云计算技术。
( 翻译/李贻丽 责编/王鑫贺 )
本网页所有文字内容由 imapbox邮箱云存储,邮箱网盘, iurlBox网页地址收藏管理器 下载并得到。
ImapBox 邮箱网盘 工具地址: https://www.imapbox.com/download/ImapBox.5.5.1_Build20141205_CHS_Bit32.exe
PC6下载站地址:PC6下载站分流下载
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox 网页视频 工具地址: https://www.imapbox.com/download/ImovieBox4.7.0_Build20141115_CHS.exe
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算