GitLab CI中执行Terratest时AWS认证失败,求排查解决方法
问题
我正在编写GitLab CI阶段以运行Terraform的Terratest测试,但在向AWS认证时出现错误。我已在流水线中正确设置AWS凭证环境变量,且测试在本地可成功运行。
CI阶段配置
terratest: stage: Test and Lint image: name: "hashicorp/terraform:1.0.5" entrypoint: - "/usr/bin/env" - "PATH=/go/bin:/usr/local/go/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" needs: - Package-lambda script: - go mod init $(basename $PWD) - go mod tidy - go test ./test/ -v -timeout 30m rules: - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^(master|production)$/ || $CI_COMMIT_BRANCH =~ /^(master|production)$/'
错误信息
with module.image-lambda-s3-trg.provider["registry.terraform.io/hashicorp/aws"], TestTerraformFirst 2022-08-10T14:17:13Z logger.go:66: │ on .terraform/modules/image-lambda-s3-trg/image-lambda-s3-trg/main.tf line 2, in provider "aws": TestTerraformFirst 2022-08-10T14:17:13Z logger.go:66: │ 2: provider "aws" { TestTerraformFirst 2022-08-10T14:17:13Z logger.go:66: │ TestTerraformFirst 2022-08-10T14:17:13Z logger.go:66: ╵ TestTerraformFirst 2022-08-10T14:17:13Z retry.go:99: Returning due to fatal error: FatalError{Underlying: error while running command: exit status 1; ╷ │ Error: error configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found.
我怀疑问题可能源于我在Terraform中使用了模块,而我仅编写了简单测试以验证输出是否正确。请问有哪些排查或解决的思路?
排查与解决思路
确认CI环境中AWS凭证变量的有效性
在CI脚本开头添加打印命令(如echo "AWS_ACCESS_KEY_ID starts with: ${AWS_ACCESS_KEY_ID:0:4}"),验证凭证变量是否成功注入。同时检查GitLab项目变量的范围设置,确保变量对当前运行的分支/MR可见。检查Terraform模块的Provider配置
模块中显式定义了awsprovider,需确认其是否继承根模块的凭证逻辑。若模块provider未配置凭证来源,可能会忽略环境变量。可以在模块的provider块中添加profile = "default"(依赖默认凭证链),或确保模块未硬编码覆盖凭证相关设置。验证CI镜像的凭证读取能力
在CI脚本中临时添加terraform init && terraform plan命令,直接运行Terraform操作,排除Terratest的干扰,确认镜像中的Terraform能否正常读取环境变量中的AWS凭证。检查Terratest代码的环境变量传递
确认Terratest代码中是否将CI环境的AWS凭证传递给Terraform进程。例如在terraform.Options中明确设置环境变量:opts := &terraform.Options{ TerraformDir: "../", EnvVars: map[string]string{ "AWS_ACCESS_KEY_ID": os.Getenv("AWS_ACCESS_KEY_ID"), "AWS_SECRET_ACCESS_KEY": os.Getenv("AWS_SECRET_ACCESS_KEY"), "AWS_DEFAULT_REGION": os.Getenv("AWS_DEFAULT_REGION"), }, }补充AWS区域环境变量
Terraform AWS Provider可能需要明确的区域配置,即使模块中已设置,缺失AWS_DEFAULT_REGION环境变量也可能导致凭证加载失败。在CI环境中添加该变量,或在模块provider块中显式指定region参数。确认凭证权限匹配
虽然本地运行正常,但需确保CI使用的AWS凭证与本地权限一致,避免因权限不足导致的隐性认证失败(不过当前错误是凭证未找到,此点可作为后续排查项)。
内容的提问来源于stack exchange,提问作者bruvio

