You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置
    模块中显式定义了aws provider,需确认其是否继承根模块的凭证逻辑。若模块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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 00:18:19