Files
nexus/wiki/concepts/Cross-account-Terraform-Modules.md

62 lines
2.6 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: "Cross-account Terraform Modules"
type: concept
tags: [Terraform, Cross-Account, Modules, IaC, AWS]
sources: [ctp-topic-16-cross-account-terraform-modules]
last_updated: 2026-04-14
---
## Overview
Cross-account Terraform Modules 指的是在单个 Terraform 模块中通过配置多个 AWS Provider实现跨多个 AWS 账号同时创建或管理资源的能力。
## Problem Statement
在复杂的云架构中(如 AWS Landing Zone经常需要在一个模块内跨多个账号创建资源。例如
-**InfoBlocks 账号** 配置 DNS 记录
-**Workload 账号** 部署应用服务
原有的 Gruntwork 流水线主要针对单账号设计,直接赋予账号间互访权限存在巨大安全风险——某一账号被攻破可能波及全局。
## Solution Architecture
基于 **Shared Account共享账号** 的中心化部署方案:
1. **Jenkins 托管于 Shared Account**,当检测到模块目录中存在 `cross-account.json` 标记文件时,触发 ECS Deploy Runner
2. **ECS Deploy Runner**(运行在 ECS 上的 Docker 容器)被授予特殊权限,通过 Assume Role 访问目标账号:
- `TF state bucket accessor`:读取目标账号 S3 桶中的 Terraform 状态文件
- `cross-account ECS deploy runner role`:在目标账号内执行资源部署
3. 通过根目录 `terragrunt.hcl` 配置角色切换逻辑
## Three Design Goals
| Goal | Mechanism | Benefit |
|------|-----------|---------|
| **安全性** | 无 Workload 账号间直接信任,权限集中于 Shared Account | 控制 Blast Radius |
| **自动化** | Jenkins 自动识别模块类型并选择正确部署路径 | 无人工干预 |
| **可复用性** | 模块代码不硬编码特定账号的角色 | 灵活适配多环境 |
## Key Files
- `cross-account.json`:约定俗成的标记文件,放置于模块目录中,告知 Jenkins 调用跨账号部署逻辑
- `terragrunt.hcl`Root全局 Terragrunt 配置文件,定义远程状态存储和角色切换逻辑
## Relationships
- [[ECS Deploy Runner]] — 执行单元,运行 Docker 容器执行 plan/apply
- [[Shared Account]] — 信任源,托管 Jenkins 和公共服务
- [[Terraform]] — 底层 IaC 工具
- [[Gruntwork]] — 参考架构来源
- [[AWS-Landing-Zone]] — 多账号架构框架
## Related Concepts
- [[Infrastructure-as-Code]] — 上层方法论
- [[GitOps]] — 部署编排模式
- [[Assume Role]] — 跨账号身份切换机制AWS IAM
## Notes
- 本方案与单账号 Gruntwork 流水线为**演进关系**而非冲突
- 本方案与 Atlantis 跨账号 IAM Role 机制**类似**但执行载体不同ECS 容器 vs EC2