基于同一Terraform脚本的AWS跨账号部署案例咨询及配置问题求助
AWS跨账号Terraform部署案例与问题排查
优质跨账号部署架构示例
我分享一个AWS组织内跨账号部署的典型最佳实践模式,核心是通过IAM角色切换实现安全的跨账号操作,避免直接使用子账号长期凭证:
核心架构逻辑
- 组织主账号(Master)下的授权用户/角色,通过STS服务Assume子账号(比如Dev)的专用部署角色
- 子账号提前配置信任策略,允许主账号的特定身份切换到该角色
- Terraform基于切换后的子账号角色身份完成资源部署,资源归属自然是子账号
具体配置示例
- 子账号(Dev)的IAM角色配置(用Terraform定义)
resource "aws_iam_role" "terraform_deployer" { name = "terraform-deployer" # 信任主账号的指定IAM用户能切换到此角色 assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Principal = { AWS = "arn:aws:iam::[主账号ID]:user/[你的主账号IAM用户名]" } } ] }) } # 给角色附加部署所需的最小权限(生产环境避免用管理员权限) resource "aws_iam_role_policy_attachment" "deploy_perms" { role = aws_iam_role.terraform_deployer.name policy_arn = "arn:aws:iam::aws:policy/AmazonS3FullAccess" # 示例权限,按需调整 }
- 本地AWS配置文件(~/.aws/config)
[profile master-admin] aws_access_key_id = [主账号Access Key] aws_secret_access_key = [主账号Secret Key] region = us-east-1 [profile dev-deploy] role_arn = arn:aws:iam::[Dev子账号ID]:role/terraform-deployer source_profile = master-admin region = us-east-1
- Terraform Provider配置
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } } } provider "aws" { profile = "dev-deploy" region = "us-east-1" } # 示例:在Dev账号创建S3桶 resource "aws_s3_bucket" "dev_data_bucket" { bucket = "dev-project-data-bucket-123" # 桶名需全局唯一 }
部署时直接执行terraform apply(或指定AWS_PROFILE=dev-deploy),Terraform会自动完成角色切换,资源所有者会显示为Dev子账号ID。
针对你的问题排查
你遇到的资源所有者仍显示主账号问题,大概率是dev_admin这个profile的配置存在问题,常见原因和排查步骤如下:
- Profile实际使用主账号凭证:检查
~/.aws/credentials里的dev_admin条目,是不是误填了主账号的Access Key/Secret Key?如果是,部署时自然会用主账号身份创建资源。 - 角色切换配置错误:如果
dev_admin是基于角色切换的profile,检查~/.aws/config里的role_arn是否为子账号的角色ARN?source_profile是否指向主账号的有效profile?同时确认子账号角色的信任策略是否正确允许主账号身份Assume它。 - Provider配置未生效:确保Terraform的provider块里的
profile参数确实指向dev_admin,并且没有优先级更高的环境变量(比如AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY会覆盖profile配置)。
快速验证身份的命令
执行以下命令,查看当前profile对应的身份:
AWS_PROFILE=dev_admin aws sts get-caller-identity
如果返回的Account是主账号ID,说明profile配置有问题;如果是子账号ID,尝试执行terraform init -reconfigure刷新provider缓存,再重新部署。
内容的提问来源于stack exchange,提问作者d8aninja
相关产品推荐
相关产品推荐

