我为开发团队编写了一个自定义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
答案 0 :(得分:3)
您遇到的情况是Terraform issue #21408中描述的错误,即使您打算编写一个将继承提供程序的模块,验证仍会检查提供程序的配置是否完整。
在撰写本文时,有两个主要的解决方法。最简单的一站式解决方法是将环境变量AWS_REGION
设置为任何有效的AWS区域,然后将其用作region
的值并允许通过验证。
要使其具有可复制性,可以使用 test配置,该配置可以在特定调用者的上下文之外单独开发模块时为模块提供测试床。为此,请创建一个目录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问题,测试配置仍然是一种很好的技术,可确保您的模块作为子模块使用,而与单独使用是否有效无关。
答案 1 :(得分:3)
即使我在提供程序配置中提供了区域,我也遇到了同样的问题。
经过一番挖掘,我遇到了this thread from terraform's discussion board。似乎存在的问题是,出于某些未记录的原因,terraform希望将AWS_DEFAULT_REGION环境变量设置为区域值(例如“ us-west-1”)。将其设置为有效区域已经为我解决了这个问题。
您可以找到有关为Terraform here设置环境变量的更多信息。
希望它可以解决您的问题。