IAM配置正确CLI可assume role但Terraform apply无法代入角色报错求解
Terraform AWS Provider assume role 报错但CLI可正常代入解决方案
你遇到的报错是Terraform AWS Provider凭证链加载优先级冲突导致的,可按以下步骤排查修复:
核心根因
你在Provider配置中同时指定了profile参数和assume_role块,旧版本AWS Provider加载凭证时会出现优先级异常,优先使用全局默认凭证而非你指定的profile凭证执行角色代入操作,导致权限校验失败。
修复方案(二选一即可)
方案1:移除provider块内的profile配置,通过环境变量指定凭证来源
修改后的provider配置如下:
provider "aws" { region = var.aws_region assume_role { role_arn = var.assume_role_arn session_name = "terraform-assume-role-session" } }
执行Terraform命令前先指定对应profile环境变量:
# 临时指定profile,避免和全局环境变量冲突 export AWS_PROFILE=<你配置的凭证profile名称> terraform apply
方案2:保留profile配置,显式开启共享配置文件加载
在provider块内添加共享配置加载参数,强制Provider使用指定profile的凭证执行角色代入:
provider "aws" { region = var.aws_region profile = var.aws_profile shared_config_files = ["~/.aws/config"] shared_credentials_files = ["~/.aws/credentials"] assume_role { role_arn = var.assume_role_arn session_name = "terraform-assume-role-session" } }
额外优化校验点
- 不要在
session_name中使用timestamp()函数:该函数每次执行都会生成新的会话名称,部分配置了角色会话名称限制的AWS账号会触发拦截,替换为固定值或静态插值即可。 - 执行命令前先清理冲突的环境变量:如果当前shell配置了
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN等硬编码凭证变量,优先级会高于profile配置,导致使用错误凭证代入角色,可通过unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN清理。 - 如需详细排查凭证链加载问题,可开启调试日志后执行apply:
export TF_LOG=DEBUG export AWS_CONFIG_CREDENTIALS_CHAIN_VERBOSE_ERRORS=1 terraform apply
内容的提问来源于stack exchange,提问作者Steven Staley
相关产品推荐
相关产品推荐

