Files
nexus/wiki/sources/ctp-topic-16-cross-account-terraform-modules.md

56 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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
- [[Cloud & DevOps/Public-Cloud-Learning-Sessions/03_Terraform/ctp-topic-16-cross-account-terraform-modules]]
## 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 命令,是流水线中的实际执行单元" — FibosEDR 定义
## 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 替代 JenkinsAtlantis 在 merge 前应用变更,每个 Landing Zone 部署单台 EC2 实例;本方案的 ECS Deploy Runner 运行在容器中更适合跨账号大规模部署。Atlantis 的跨账号访问通过各账户 IAM 角色实现,与本方案 Assume Role 机制类似,但执行载体不同。