56 lines
4.9 KiB
Markdown
56 lines
4.9 KiB
Markdown
---
|
||
title: "CTP Topic 16 Cross-account Terraform modules"
|
||
type: source
|
||
tags: [Terraform, Cross-Account, Modules, CTP, IaC, DevOps, AWS-Landing-Zone]
|
||
date: 2026-04-14
|
||
---
|
||
|
||
## Source File
|
||
- [[raw/Cloud & DevOps/Public-Cloud-Learning-Sessions/03_Terraform/ctp-topic-16-cross-account-terraform-modules.md]]
|
||
|
||
## Summary(用中文描述)
|
||
- 核心主题:**跨账号 Terraform 模块的中心化部署方案**,解决多账号 AWS 环境中一个模块内跨账号创建资源的安全与自动化问题
|
||
- 问题域:原有的 Gruntwork 流水线针对单账号设计,在多账号场景下存在安全风险(一账号被攻破可能波及全局)
|
||
- 方法/机制:基于 **Shared Account(共享账号)** 的中心化部署架构,Jenkins + ECS Deploy Runner + Assume Role 三者联动
|
||
- 结论/价值:实现安全性(账号间无直接信任关系)、自动化(Jenkins 自动识别跨账号模块)、可复用性(模块代码不硬编码特定账号角色)
|
||
|
||
## Key Claims(用中文描述)
|
||
- **Shared Account 作为中转站**:Jenkins 托管在 Shared Account,当检测到 `cross-account.json` 标记文件时触发 ECS Deploy Runner
|
||
- **Assume Role 双角色机制**:ECS Deploy Runner 通过 Assume Role 访问目标账号的两个角色——`TF state bucket accessor`(读取状态文件)和 `cross-account ECS deploy runner role`(执行资源部署)
|
||
- **Blast Radius 控制**:避免 Workload 账号之间直接互访,权限控制在受严格审计的 Shared Account
|
||
- **Terragrunt HCL 全局配置**:通过根目录 `terragrunt.hcl` 定义远程状态存储和角色切换逻辑,支持本地开发与 Jenkins 自动部署的差异化角色处理
|
||
|
||
## Key Quotes
|
||
> "Cross-account Terraform Modules 指在一个模块内通过配置多个 Provider,实现在多个 AWS 账号中同时创建或管理资源的功能" — Fibos,核心概念定义
|
||
> "Shared Account 是整个 Landing Zone 的核心管理账号,托管 Jenkins、镜像仓库等公共服务,并作为跨账号部署的信任源" — Fibos,架构定位
|
||
> "ECS Deploy Runner 运行在 ECS 上的 Docker 容器,负责执行 Terraform plan 和 apply 命令,是流水线中的实际执行单元" — Fibos,EDR 定义
|
||
|
||
## Key Concepts
|
||
- [[Cross-account Terraform Modules]]:在一个 Terraform 模块中通过配置多个 Provider,实现在多个 AWS 账号中同时创建或管理资源的功能
|
||
- [[Shared Account]]:Landing Zone 核心管理账号,托管 Jenkins 及公共服务,作为跨账号部署的信任源
|
||
- [[ECS Deploy Runner]]:运行在 ECS 上的 Docker 容器,负责执行 Terraform plan/apply,是流水线的实际执行单元
|
||
- [[TF State Bucket Accessor]]:专门定义的 IAM 角色,仅允许部署工具访问目标账号 S3 桶中的 Terraform 状态文件
|
||
- [[Cross-account ECS Deploy Runner Role]]:部署在目标账号中的角色,允许 Shared Account 的执行器通过 Assume Role 获取资源创建权限
|
||
- [[cross-account.json]]:约定俗成的标记文件,放置于模块目录中,用于告知 Jenkins 该模块需要调用跨账号部署逻辑
|
||
- [[Root Terragrunt HCL]]:全局 Terragrunt 配置文件,定义远程状态存储和角色切换逻辑
|
||
|
||
## Key Entities
|
||
- **Fibos**:主讲人,分享了团队基于 Shared Account 的跨账号 Terraform 部署方案
|
||
- **Gruntwork**:参考架构来源,原有 Gruntwork 流水线主要针对单账号设计
|
||
- **Jenkins**:CI/CD 引擎,托管在 Shared Account,负责检测模块类型并触发部署流程
|
||
- **AWS Landing Zone**:多账号架构框架,Shared Account + Workload Account 的分层设计
|
||
|
||
## Connections
|
||
- [[ctp-topic-9-ci-cd-with-gruntwork]] ← foundation ← [[ctp-topic-16-cross-account-terraform-modules]]
|
||
- [[ECS Deploy Runner]] ← depends_on ← [[Shared Account]]
|
||
- [[Cross-account Terraform Modules]] ← uses ← [[ECS Deploy Runner]]
|
||
- [[ECS Deploy Runner]] ← assumes ← [[Cross-account ECS Deploy Runner Role]]
|
||
- [[ECS Deploy Runner]] ← reads_state ← [[TF State Bucket Accessor]]
|
||
- [[Root Terragrunt HCL]] ← configures ← [[Cross-account Terraform Modules]]
|
||
- [[ctp-topic-48-terraform-vs-terragrunt]] ← related ← [[Root Terragrunt HCL]]
|
||
- [[AWS-Landing-Zone]] ← enables ← [[Shared Account]]
|
||
|
||
## Contradictions
|
||
- 与 [[ctp-topic-9-ci-cd-with-gruntwork]](单账号 Gruntwork 流水线):原有 Gruntwork 流水线主要针对单账号设计,不处理跨账号场景;本方案通过 Shared Account 中心化架构扩展支持多账号,同时保留 Gruntwork 模块复用优势。两者为演进关系而非冲突。
|
||
- 与 [[ctp-topic-32-using-atlantis-cicd-for-infrastructure-deployments]](Atlantis 替代 Jenkins):Atlantis 在 merge 前应用变更,每个 Landing Zone 部署单台 EC2 实例;本方案的 ECS Deploy Runner 运行在容器中,更适合跨账号大规模部署。Atlantis 的跨账号访问通过各账户 IAM 角色实现,与本方案 Assume Role 机制类似,但执行载体不同。
|