订阅云计算RSS CSDN首页> 云计算

Amazon S3使用AWS CodeDeploy自动部署

发表于2015-05-07 15:42| 次阅读| 来源blogs| 0 条评论| 作者Surya Bala

摘要:AWS CodeDeploy可以对任何实例做软件部署,包括Amazon EC2实例和本地运行的实例。可以帮助您避免在部署过程中停机,还可以集中控制您的应用程序、实例、部署和部署配置。

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行动,应对其他事件。


原文链接:      https://blogs.aws.amazon.com/application-management/post/Tx3TPMTH0EVGA64/Automatically-Deploy-from-Amazon-S3-using-AWS-CodeDeploy


活动推荐 AWSome Day—让您大有作为(北京站)

活动推荐:5月26日 CSDN在线培训——AWS 云计算环境中的机器学习


订阅“AWS中文技术社区”微信公众号,实时掌握AWS技术及产品消息!

AWS中文技术社区为广大开发者提供了一个Amazon Web Service技术交流平台,推送AWS最新资讯、技术视频、技术文档、精彩技术博文等相关精彩内容,更有AWS社区专家与您直接沟通交流!快加入AWS中文技术社区,更快更好的了解AWS云计算技术。


                                                                                                          ( 翻译/李贻丽  责编/王鑫贺 )

0
0