【发布时间】:2021-10-04 17:29:37
【问题描述】:
我有一些在 AWS 中创建资源的 terraform 代码。
对于生产,我们有一个针对真实 AWS 运行的 CICD 管道。对于本地开发,我使用 localstack。所以有两个这样的提供者:
# AWS config
provider "aws" {
region = ...
}
# Localstack config
provider "aws" {
region = ...
access_key = "mock_access_key"
secret_key = "mock_secret_key"
skip_credentials_validation = true
endpoints {
s3 = "http://localhost:4566"
...
}
}
我目前的解决方案是注释掉未使用的提供程序。这并不理想,因为我们需要记住在本地开发时取消注释 localstack 配置,并在推送代码时取消注释真正的 aws 配置,忘记这可能是一个大问题。
我还尝试为 localstack 配置 alias = localstack 和几个变量创建别名:
variable provider_id {
type = map
default = {
localdev = "aws.localstack"
prod = "aws"
}
}
variable aws_account {
type = string
default = ""
}
然后资源可以像这样查找提供者:
provider = lookup(var.provider_id, var.aws_account)
然后我们的想法是我们可以在运行terraform apply 时传递变量aws_account=...,以便资源选择正确的提供者。但是,这不起作用并返回此错误(我想是因为它应该查找aws 而不是"aws"):
╷
│ Error: Invalid provider configuration reference
│
│ on s3.tf line 2, in resource "aws_s3_bucket" "bucket":
│ 2: provider = lookup(var.provider_id, var.aws_account)
│
│ The provider argument requires a provider type name, optionally followed by a period and then a configuration alias.
╵
即使它确实有效,它也不是理想的,因为我们必须记住将提供程序查找添加到每个资源块。
我想知道与这样的多个提供商合作的最佳方式是什么?理想情况下是一个简单的解决方案,例如在运行terraform apply 时传递变量或参数。我不介意它是否需要重构 terraform(我上周才学会了这个工具)。
【问题讨论】:
标签: amazon-web-services terraform localstack