CICD- 自动更新Docker Image到Auto Scaling Group

2021-03-12 11:44

因亚马逊云科技中国区并没有完整的CodePipeline服务,所以想要实现CICD(CI:Continuous Integration,持续集成;CD:Continuous Deployment,持续部署)自动部署的话需要搭配使用Lambda,此套方案可以帮助我们监测新Docker Image上传,并自动触发Auto Scaling Group去进行更版。实施步骤如下:

1.创建Lambda

2.创建CloudWatch Event

3.测试CICD流程





架构图





实施前,先来了解一下 CICD 吧~

CI

持续集成(CI:Continuous Integration),持续集成是一种软件开发实践,希望团队中的成员频繁提交代码到代码仓库,且每次提交都能通过自动化测试进行验证,从而使问题尽早暴露和解决。


CD

持续交付(CD:Continuous Delivery),持续交付是持续集成的扩展,指的是将通过自动化测试的软件部署到产品环境。持续交付的本质是把每个构建成功的应用更新交付给用户使用。


实验前提及注意事项

您需要提前创建好自己的ECR Repository, Launch Template, Auto Scaling Group,其中值得提醒的问题如下:


1. 您需要在Launch Template中的User Data写明每次需要更新的内容,以本次实验为例,我需要每次更新Docker Image,那我的Launch Template中的User Data如下:


#!/bin/bash

aws ecr get-login-password --region cn-north-1 | docker login --username AWS --password-stdin 0000000000.dkr.ecr.cn-north-1.amazonaws.com.cn

docker pull 0000000000.dkr.ecr.cn-north-1.amazonaws.com.cn/hendry2:latest


2. 如果是下载Docker Image的话,需要给Launch Template附加一个IAM Role,给这台EC2下载ECR 镜像的权限,这个IAM Role需要有AmazonEC2ContainerRegistryFullAccess 权限。




3. 在Launch Template中的基础AMI镜像,需要给其设置Docker开机自启,否则跑User Data中的Docker命令时会提示Docker进程未启动,导致下载失败。


4. 建议在Launch Template中的基础AMI镜像中提前安装好您的业务程序、依赖包、驱动等,这样就不需要每次都在User Data进行安装,节省每次CICD流程花费的时间。


5. Launch Template中网络部分的设置可以为空,这样才能以Auto Scaling Group中设置的网络为主。如果在Launch Template中设置了子网,并且和Auto Scaling Group中的子网不同,则会冲突并导致错误。


6. 在创建Auto Scaling Group时,选择Launch Template 版本时,需要选择Latest。


7. 以上的问题都解决后,可以手动去使用这个Launch Template去开启机器测试一下,看能否正常开机,以及User Data是否正常运行。



实施步骤


步骤一:

创建Lambda


1. 进入到Lambda控制台





  • 运行环境选择Pthon 3.6

  • 并且需要新创建一个IAM Role给Lambda,这个Role需要具有的权限如下:

AutoScalingFullAccess、AmazonEC2FullAccess、CloudWatchFullAccess

  • 其他设置为默认即可


Lambda代码如下:




from __future__ import print_function

import json

import boto3

def lambda_handler(event, context):

    print("Received event: " + json.dumps(event, indent=2))

    imageDigest= event['detail']['image-digest']

    print(imageDigest)

   

    client = boto3.client('ec2')

    response = client.create_launch_template_version(

    LaunchTemplateId='lt-0cb3fb0756ec9b1b4',

    SourceVersion='6',

    VersionDescription=imageDigest,

    LaunchTemplateData={

        'ImageId': 'ami-057aecfb0bffdc74a'

        }

    )

    # get autoscaling client

    asgClient = boto3.client('autoscaling')

    response = asgClient.start_instance_refresh(

    AutoScalingGroupName='hendry2',

    Strategy='Rolling',

    Preferences={

        'MinHealthyPercentage': 50,

        'InstanceWarmup': 60

        }

)

需要将参数修改为您AWS账户中的实际情况,具体如下:

LaunchTemplateId(您使用的Launch Template ID)

SourceVersion(Lauch Template的源版本,Lambda会在此版本之上创建新的版本)

ImageId(Lauch Template中的基础镜像ID)

AutoScalingGroupName(Auto Scaling Group的名字)

MinHealthyPercentageInstanceWarmup这两个参数可以默认,也可以根据实际情况调整


2. 参数修改完成后,部署Lambda




步骤二:

创建CloudWatch Event

1. 切换到Cloudwatch



2. 创建Event



3. 设置触发规则


1的部分需要修改为您环境中实际的Repository名称

2的部分需要修改为刚才创建的Lambda函数

此规则代表的是每次ECR中的testcicd Repository上传了新的Docker Image,就会触发Target中的Lambda


4. 输入Event名字,创建即可



步骤三:

测试CICD


那我们尝试测试一下上传一个新的Docker Image到ECR



切换到Auto Scaling Group 控制台,可以看到已经开始部署新的版本了



Auto Scaling Group会等到warm-up时长和Health Check Grace Period结束后,开始替换第二批旧的EC2,依次轮换,实现滚动部署,直到将所有旧EC2替换完毕。



注意,尽量把Health Check Grace Period的时长设置的比机器启动需要的时间长一些,否则会导致开始健康检查时显示Unhealthy。



云代理伙伴
扫描关注微信公众号
获取更多云端资讯
联系我们
——

模板表单-2(1)

  • 姓名*

  • 电话*

  • 邮箱*

  • 职称*

  • 公司*

  • 地址*

  • 需求*

  • * 点击提交,即表示您同意我们存储和处理您提交的个人信息,以向您提供所请求的内容,该信息仅供公司提供服务使用。您的信息受到相关法律的安全保护。