Terraform多AWS Provider配置apply时出现InvalidClientTokenId错误
Terraform部署EKS集群首次apply报错原因排查
问题场景
使用两个独立AWS Provider:一个基于已有IAM用户创建VPC和新IAM用户,另一个使用新创建的IAM用户部署EKS集群。首次执行terraform apply到EKS模块时触发以下错误:
│ Error: validating provider credentials: retrieving caller identity from STS: operation error STS: GetCallerIdentity, https response error StatusCode: 403, RequestID: xxxxxxxxxx, api error InvalidClientTokenId: The security token included in the request is invalid.
二次执行terraform apply可正常完成部署,重新从头执行也能正常工作。仅排查该问题原因,不讨论配置合理性。
核心原因
问题出在Terraform Provider的初始化时机与资源创建顺序不匹配:
- Terraform会在执行任何资源创建操作前,先完成所有Provider的初始化验证,包括配置了动态密钥的
aws-milano-eksProvider - 首次执行时,
module.aws-jupyterhub-iam还未完成新IAM用户的创建,cluster_profile_key和cluster_profile_secret这两个输出值尚未生成,此时Provider拿到的是无效的空值或临时占位值,导致STS调用GetCallerIdentity时返回403错误 - 第一次apply虽然报错,但
module.aws-jupyterhub-iam已经完成了IAM用户的创建,其密钥输出已被写入Terraform状态文件 - 二次apply时,Provider初始化直接读取状态文件中已存在的有效密钥,验证通过后即可正常部署EKS集群
- 重新从头执行时,Terraform会严格按照依赖链先创建VPC和IAM用户,状态文件提前存储了有效密钥,Provider初始化时能获取到有效值,因此不会触发错误
相关配置代码
provider "aws" { alias = "aws-milano" region = local.region profile = local.terraform_profile } module "aws-jupyterhub-vpc" { source = "./modules/aws-jupyterhub-vpc" # parameters.... providers = { aws = aws.aws-milano } } module "aws-jupyterhub-iam" { depends_on = [ module.aws-jupyterhub-vpc ] source = "./modules/aws-jupytherhub-iam" providers = { aws = aws.aws-milano } } provider "aws" { alias = "aws-milano-eks" region = local.region # exposed from module access_key = module.aws-jupyterhub-iam.cluster_profile_key secret_key = module.aws-jupyterhub-iam.cluster_profile_secret } module "aws-jupyterhub-eks" { source = "./modules/aws-jupyterhub-eks" depends_on = [ module.aws-jupyterhub-vpc, module.aws-jupyterhub-iam] # parameters... providers = { aws = aws.aws-milano-eks } }
内容的提问来源于stack exchange,提问作者Leonardo
相关产品推荐
相关产品推荐

