Central账户CodePipeline跨账号部署CloudFormation到Dev并同步输出到参数存储是否可行
跨账号CodePipeline同步Dev资源输出到Central账户SSM的实现方案
方案可行性结论
该方案完全可以实现,你当前编写的CloudFormation模板无法直接生效的核心原因是:单个CloudFormation栈默认只能部署到单个AWS账户,无法在同一份模板内同时向两个不同AWS账户创建资源。
可行实现思路
第一步:拆分CloudFormation模板
首先把原有模板拆为两份:- Dev账户S3栈模板:仅包含S3存储桶定义,新增Outputs段导出S3的DomainName属性,示例如下:
# 部署到Dev账户的S3栈模板 dev-s3-stack.yaml Resources: DeployDevAccountBucket: Type: AWS::S3::Bucket Properties: BucketName: "dev-bucket" AccessControl: Private BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 VersioningConfiguration: Status: "Enabled" Outputs: S3BucketDomainName: Value: !GetAtt DeployDevAccountBucket.DomainName Export: Name: DevAccountS3DomainName- (可选)Central账户SSM参数模板:仅包含SSM Parameter定义,通过模板参数接收S3域名值,示例如下:
# 部署到Central账户的SSM参数模板 central-ssm-stack.yaml Parameters: DevS3DomainName: Type: String Description: 从Dev账户S3栈获取的域名 Resources: BucketNameParameter: Type: AWS::SSM::Parameter Properties: Name: "dev-account-s3-domainname" Type: String Value: !Ref DevS3DomainName第二步:配置跨账号访问权限
- 在Dev账户创建专用部署角色,信任Central账户的CodePipeline服务角色,同时授予CloudFormation部署、S3资源创建的必要权限
- 给Central账户的CodePipeline服务角色添加
sts:AssumeRole权限,允许其代入Dev账户的部署角色 - 给后续写入SSM的动作角色(CodeBuild角色或Central账户的CFN部署角色)授予SSM参数的写权限
第三步:编排CodePipeline阶段
Pipeline全程部署在Central账户,按以下顺序设置阶段:- 源阶段:拉取存储上述两份CFN模板的代码仓库(CodeCommit/GitHub等)
- Dev资源部署阶段:添加CloudFormation部署动作,角色ARN填写Dev账户的部署角色ARN,部署dev-s3-stack.yaml到Dev账户,开启动作的「将栈输出导出为Pipeline变量」配置
- SSM参数写入阶段,二选一实现即可:
- 方案1:使用CodeBuild动作,直接读取上一步导出的S3域名Pipeline变量,执行
aws ssm put-parameter命令写入Central账户的Parameter Store - 方案2:添加CloudFormation部署动作(默认使用Central账户权限),将上一步导出的S3域名作为参数传入central-ssm-stack.yaml,部署到Central账户完成参数创建
注意事项
- 所有权限遵循最小原则,避免授予超出必要范围的权限
- 若存储的参数为敏感值,可将SSM参数类型设置为SecureString,使用KMS密钥加密存储
- 如果需要同步多个Dev账户资源的输出,可统一在Pipeline中添加变量收集和批量写入SSM的逻辑
内容的提问来源于stack exchange,提问作者Peltier
相关产品推荐
相关产品推荐

