因亚马逊云科技中国区并没有完整的CodePipeline服务,所以想要实现CICD(CI:Continuous Integration,持续集成;CD:Continuous Deployment,持续部署)自动部署的话需要搭配使用Lambda,此套方案可以帮助我们监测新Docker Image上传,并自动触发Auto Scaling Group去进行更版。实施步骤如下:
1.创建Lambda
2.创建CloudWatch Event
3.测试CICD流程
架构图
实施前,先来了解一下 CICD 吧~
持续交付(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是否正常运行。
实施步骤
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的名字)
MinHealthyPercentage和InstanceWarmup这两个参数可以默认,也可以根据实际情况调整
2. 参数修改完成后,部署Lambda
1. 切换到Cloudwatch
2. 创建Event
3. 设置触发规则
1的部分需要修改为您环境中实际的Repository名称
2的部分需要修改为刚才创建的Lambda函数
此规则代表的是每次ECR中的testcicd Repository上传了新的Docker Image,就会触发Target中的Lambda
4. 输入Event名字,创建即可
那我们尝试测试一下上传一个新的Docker Image到ECR
切换到Auto Scaling Group 控制台,可以看到已经开始部署新的版本了
Auto Scaling Group会等到warm-up时长和Health Check Grace Period结束后,开始替换第二批旧的EC2,依次轮换,实现滚动部署,直到将所有旧EC2替换完毕。
注意,尽量把Health Check Grace Period的时长设置的比机器启动需要的时间长一些,否则会导致开始健康检查时显示Unhealthy。