首页 > 解决方案 > terraform validate 错误:参数“region”是必需的,但未设置

问题描述

我为我的开发团队编写了一个自定义RDS模块,用于部署RDS实例。我正在使用BitBucket源代码控制,我正在尝试集成一个BitBucket管道以terraform validate在我的.tf文件上运行以验证语法,然后再将其提供给开发人员使用。terraform init运行正常,但是当我运行时terraform validate出现以下错误:Error: Missing required argument. The argument "region" is required, but was not set.查看文档后,我很困惑为什么如果该命令实际上没有部署任何东西,它会检查声明的提供程序?诚然,我是编写模块的新手。也许这不是我想要完成的正确命令?

Terraform version: v0.12.7

AWS Provider version: 2.24

bitbucket-pipelines.yml:

image: hashicorp/terraform:full

pipelines:
  branches:
    master:
    - step:
        script:
          - terraform version
          - terraform init
          - terraform validate

Module tree:

├── CHANGELOG.md
├── README.md
├── bitbucket-pipelines.yml
├── main.tf
├── modules
│   ├── db_instance
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── db_option_group
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   ├── db_parameter_group
│   │   ├── README.md
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   └── db_subnet_group
│       ├── README.md
│       ├── main.tf
│       ├── outputs.tf
│       └── variables.tf
├── outputs.tf
└── variables.tf

标签: bitbucketterraformcontinuous-deploymentterraform-provider-aws

解决方案


您在这里遇到的情况是Terraform 问题 #21408中描述的错误,其中验证正在检查提供程序配置是否完整,即使您打算编写一个将继承提供程序的模块。

在撰写本文时,有两种主要的解决方法。最简单的一次性解决方法是将环境变量设置AWS_DEFAULT_REGION为任何有效的 AWS 区域,然后将其用作值region并允许验证通过。

为了使该可重现,您可以使用测试配置,当您在特定调用者的上下文之外单独开发模块时,该配置可以为模块提供测试平台。为此,请创建一个目录tests/simple(或任何您喜欢的目录;名称无关紧要)并在其中放入一个test.tf包含以下内容的文件:

provider "aws" {
  region = "us-east-1"
}

module "under_test" {
  source = "../.."

  # Any arguments the module requires
}

然后,您可以切换到该测试目录并使用正常的 Terraform 工作流来一起验证整个配置:

cd tests/simple
terraform init
terraform validate

terraform plan这种测试配置的一般概念的一个很好的好处是,您还可以通过运行或设置一组合适的环境变量来将它们用于端到端测试terraform apply,并且您可以有多个测试配置来测试不同的选项排列并确保它们都通过验证,如果您进行端到端测试,它们都可以工作

即使修复了 Terraform 问题,测试配置仍然是一种很好的技术,可以确保您的模块作为子模块工作,与它是否单独有效分开。


推荐阅读