如何让单账号EC2 Image Builder自动更新多账号Launch Templates?
优雅的自动化解决方案推荐
针对你的场景,有几个无需共享密钥、基于AWS原生服务或Terraform生态的优雅方案,比Jenkins定时任务更可靠:
方案1:Terraform Cloud/Enterprise + 事件触发+角色假设
- 给dev/stage/prod每个环境单独创建Terraform工作空间,设置为事件触发式运行(而非定时)
- 在infra账号的Image Builder完成AMI创建并共享后,触发一个轻量Lambda,调用Terraform Cloud API触发对应环境工作空间的
plan和apply - 权限层面,每个工作空间通过AWS OIDC连接到对应环境账号,自动假设该账号内的Terraform执行角色(无需长期密钥),该角色需要权限读取共享AMI、更新Launch Template
- 关键:Terraform的
data.aws_ami要配置精准过滤器(比如按Image Builder的自定义标签、所有者指定为infra账号ID),确保每次apply都能拉取到最新的共享AMI
方案2:EventBridge + 跨账号角色 + 原生EC2 API更新
完全绕开Terraform,用AWS原生服务实现实时更新:
- 当infra账号的Image Builder生成AMI并完成共享后,会自动触发EventBridge事件(事件类型为
aws.imagebuilder,包含AMI ID、共享账号列表等信息) - 给该事件绑定Lambda,Lambda通过
sts:AssumeRole分别获取dev/stage/prod账号的临时权限 - 在每个目标账号中,Lambda调用
CreateLaunchTemplateVersionAPI,基于现有Launch Template创建新版本并指定最新AMI ID - 若需要ASG立即滚动更新新实例,可额外调用
StartInstanceRefreshAPI触发实例刷新(ASG已设置使用Latest版本的前提下) - 权限配置:
- infra账号的Lambda执行角色需具备
sts:AssumeRole权限,允许假设每个环境账号的自定义角色 - 每个环境账号的自定义角色需具备
ec2:CreateLaunchTemplateVersion和autoscaling:StartInstanceRefresh(可选)权限
- infra账号的Lambda执行角色需具备
方案3:AWS CodePipeline+CodeBuild + Terraform Remote State
如果不想用Terraform Cloud,可基于AWS原生CI/CD服务实现:
- 配置EventBridge规则,在infra账号的Image Builder完成后,触发对应环境的CodePipeline
- CodeBuild任务通过OIDC角色假设,直接在目标环境账号中执行
terraform init && terraform apply -target=aws_launch_template.your_template -auto-approve - Terraform使用S3+DynamoDB作为远程状态存储,保证状态一致性
- 同样依赖
data.aws_ami的精准过滤逻辑,确保拉取最新共享AMI
关于Jenkins定时任务的弊端
定时任务存在时间差问题:比如AMI凌晨2点生成,但Jenkins凌晨3点运行,会有1小时窗口;若Image Builder延迟,可能当天的AMI无法被拉取。而上述触发式方案基于AMI创建完成事件,能保证实时更新,可靠性更高。
内容的提问来源于stack exchange,提问作者Cory Ringdahl
相关产品推荐
相关产品推荐

