在AWS上通过GET部署GitLab参考架构时Terraform报错求助
问题:GitLab Environment Toolkit容器中Terraform Plan AWS凭证验证失败
问题详情
我正在完成GitLab PSE路径下的实施课程,已完成所有环境搭建及必要文件配置,当前处于运行工具包(GET)Docker容器的步骤:
- 进入对应目录:
cd /gitlab-environment-toolkit/terraform/environments/3k terraform init执行成功,但执行terraform plan -out 3k.aws_ec2.tfplan时出现报错- 使用的是AWS临时凭证,无法访问IAM页面获取其他凭证
- 已尝试的操作:
- 在Linux实例上设置环境变量并传入Docker容器
- 在
main.tf中硬编码AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY - 修改Terraform的
variables.tf和environment.tf中的区域配置
但问题仍未解决,怀疑是AWS凭证相关问题导致,希望完成后续Ansible脚本运行以结束workshop。
当前main.tf内容:
terraform { required_providers { aws = { source = "hashicorp/aws" } } } # Configure the AWS Provider provider "aws" { region = var.region }
运行的Docker命令:
docker run -it \ -v /home/ec2-user/gitlab-environment-toolkit/keys:/gitlab-environment-toolkit/keys \ -v /home/ec2-user/gitlab-environment-toolkit/ansible/environments/3k:/gitlab-environment-toolkit/ansible/environments/3k \ -v /home/ec2-user/gitlab-environment-toolkit/ansible/ansible.cfg:/gitlab-environment-toolkit/ansible/ansible.cfg \ -v /home/ec2-user/gitlab-environment-toolkit/terraform/environments/3k:/gitlab-environment-toolkit/terraform/environments/3k \ -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \ -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \ -e GITLAB_PASSWORD=$GITLAB_PASSWORD \ registry.gitlab.com/gitlab-org/gitlab-environment-toolkit:latest
排查与解决步骤
1. 补充临时凭证必需的Session Token
AWS临时凭证除了AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,还必须携带AWS_SESSION_TOKEN参数。修改Docker运行命令,添加该环境变量传递:
docker run -it \ -v /home/ec2-user/gitlab-environment-toolkit/keys:/gitlab-environment-toolkit/keys \ -v /home/ec2-user/gitlab-environment-toolkit/ansible/environments/3k:/gitlab-environment-toolkit/ansible/environments/3k \ -v /home/ec2-user/gitlab-environment-toolkit/ansible/ansible.cfg:/gitlab-environment-toolkit/ansible/ansible.cfg \ -v /home/ec2-user/gitlab-environment-toolkit/terraform/environments/3k:/gitlab-environment-toolkit/terraform/environments/3k \ -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \ -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \ -e AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN \ -e GITLAB_PASSWORD=$GITLAB_PASSWORD \ registry.gitlab.com/gitlab-org/gitlab-environment-toolkit:latest
同时确保宿主机Linux实例已正确设置AWS_SESSION_TOKEN环境变量,可通过env | grep AWS验证。
2. 验证容器内凭证是否生效
进入Docker容器后,先手动打印环境变量确认传递是否成功:
echo $AWS_ACCESS_KEY_ID echo $AWS_SECRET_ACCESS_KEY echo $AWS_SESSION_TOKEN
如果输出为空,说明宿主机环境变量未设置成功,或Docker命令中变量引用存在问题(比如非bash环境下变量解析失败)。
3. 指定AWS Provider稳定版本
当前main.tf未指定AWS Provider版本,可能存在版本兼容问题,添加版本约束:
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 4.0" # 指定稳定兼容版本 } } }
修改后执行terraform init -upgrade更新Provider。
4. 测试临时凭证权限范围
在容器内用AWS CLI直接测试凭证权限,确认是否有Terraform所需的资源操作权限:
aws ec2 describe-instances --region <你的目标区域>
如果返回权限不足报错,说明临时凭证权限不够,需联系课程管理员获取权限覆盖更全的临时凭证。
5. 确认区域配置一致性
检查variables.tf或environment.tf中的region变量值,确保与AWS凭证允许访问的区域完全一致,避免跨区域访问导致的权限验证失败。
内容的提问来源于stack exchange,提问作者John Wick
相关产品推荐
相关产品推荐

