Terraform使用带MFA的AWS跨账号IAM角色报AssumeRole 403错误
跨账号启用MFA的IAM角色对接Terraform配置问题
问题背景
- 组织使用网关账号,当前持有网关账号的AWS访问凭证
- 同时持有个人AWS账号,网关账号用户必须通过担任个人账号内创建的IAM角色,才能访问个人账号资源
- 跨账号架构下执行Terraform资源创建持续报错:
Error: operation error STS: AssumeRole, https response error StatusCode: 403, RequestID: xxxxxxx, api error AccessDenied: User: arn:aws:iam::xxxxxx:user/xx-xxxxxx is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::xxxxxxx2:role/xxxxxx
当前配置
当前使用的AWS Provider配置如下:
provider "aws" { alias = "mad" profile = "personal account" region = "ap-south-1" assume_role { role_arn = "arn:aws:iam::xxxxxxx:role/personal account" } }
补充配置信息:目标IAM角色已启用MFA校验,个人账号侧已配置角色信任策略,允许网关账号IAM用户担任该角色,信任策略内容如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::gateway-account-id:user/user" }, "Action": "sts:AssumeRole", "Condition": { "Bool": { "aws:MultiFactorAuthPresent": "true" } } } ] }
诉求
如何调整配置,让Terraform正常对接该启用了MFA的跨账号IAM角色?
解决方案
报错核心原因有两点:
- 角色信任策略强制要求AssumeRole请求携带MFA校验信息,但当前provider的
assume_role块未配置MFA相关参数,请求不满足策略条件直接被拒绝 - provider配置中
profile字段指向personal account,但本地持有的可直接使用的长期凭证属于网关账号,配置逻辑存在偏差
按以下步骤调整即可:
- 修正本地AWS凭证配置
编辑本地AWS凭证文件(Linux/macOS路径为~/.aws/credentials,Windows路径为%USERPROFILE%\.aws\credentials),新增/确认网关账号对应的profile配置,填入持有的网关账号长期访问密钥:[gateway] aws_access_key_id = <网关账号IAM用户的AK> aws_secret_access_key = <网关账号IAM用户的SK> - 补全Provider的AssumeRole配置
先登录网关账号的IAM控制台,进入对应用户的「安全凭证」页面,复制绑定的MFA设备ARN(格式为arn:aws:iam::<网关账号ID>:mfa/<IAM用户名>)。
之后修改Terraform的AWS Provider配置:provider "aws" { alias = "mad" profile = "gateway" # 替换为本地存储网关账号凭证的profile名称 region = "ap-south-1" assume_role { role_arn = "arn:aws:iam::<个人账号ID>:role/<目标角色名>" # 替换为个人账号侧目标角色的完整ARN serial_number = "arn:aws:iam::<网关账号ID>:mfa/<IAM用户名>" # 替换为你的MFA设备ARN session_name = "terraform-operation" # 自定义会话名即可,无强制规范 } } - 执行Terraform操作时完成MFA验证
配置完成后执行terraform plan/terraform apply等操作时,终端会自动提示输入MFA设备生成的6位动态验证码,输入正确后provider会自动完成角色代入,获取个人账号的临时操作凭证。
额外排查项
如果调整后仍然报403错误,核对个人账号侧角色信任策略的Principal配置,确认填入的网关账号IAM用户ARN与实际使用的用户ARN完全匹配,账号ID、用户名拼写错误也会导致权限拒绝。
内容的提问来源于stack exchange,提问作者Jatin Mehrotra
相关产品推荐
相关产品推荐

