我想使用Terraform
工作区来管理两个环境,一个用于aws,另一个用于localstack
。下面是Terraform的配置文件。我不希望endpoints
工作区上的skip_xxx
和aws
属性。如何实现该逻辑?我能想到的唯一方法是为不同的环境创建多个文件夹,例如aws
,openstack
和shared
。但我想在workspace
上找到解决方案,因为它是Terraform的内置功能,适用于不同的环境。
provider "aws" {
profile = "default"
region = "ap-southeast-2"
skip_credentials_validation = true
skip_metadata_api_check = true
endpoints {
lambda = "http://localhost:4574"
}
}
答案 0 :(得分:1)
Terraform工作区功能用于在一个位置存储多个状态并在它们之间切换。如果您希望将状态存储在不同的位置(不同的S3存储桶,或者在您的情况下根本不使用S3),请the workspaces feature is not appropriate。
相反,您可以使用多个配置根目录,并将共享配置分解为两个配置共享的一个或多个子模块。然后,您单独的根模块可以代表这些目标之间的所有差异,包括所有后端配置。
provider "aws" {
profile = "default"
region = "ap-southeast-2"
skip_credentials_validation = true
skip_metadata_api_check = true
endpoints {
lambda = "http://localhost:4574"
}
}
module "shared_something" {
source = "./modules/shared-something"
# Configuration for this module that makes sense for localstack
}
provider "aws" {
profile = "default"
region = "ap-southeast-2"
}
module "shared_something" {
source = "./modules/shared-something"
# Configuration for this module that makes sense for real AWS
}
如果您的配置相对简单,则仅包含一个共享模块,其中的所有内容就足够了,但是对于更复杂的情况,您可能需要使用module composition来分解系统并更好地支持任何可能导致变化的配置在AWS和localstack之间是必需的。
请注意,Terraform AWS提供程序仅在尽力而为的基础上支持非AWS实施,如果localstack与AWS的行为并非100%兼容,则可能无法正确运行。如果您使用任何第三方模块,则它们可能会做出不适用于本地堆栈的假设。