You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让单账号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调用CreateLaunchTemplateVersion API,基于现有Launch Template创建新版本并指定最新AMI ID
  • 若需要ASG立即滚动更新新实例,可额外调用StartInstanceRefresh API触发实例刷新(ASG已设置使用Latest版本的前提下)
  • 权限配置:
    • infra账号的Lambda执行角色需具备sts:AssumeRole权限,允许假设每个环境账号的自定义角色
    • 每个环境账号的自定义角色需具备ec2:CreateLaunchTemplateVersion和autoscaling:StartInstanceRefresh(可选)权限

方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 01:58:10