如何使用Terraform工作区在AWS和LocalStack之间切换?

时间:2019-07-30 03:49:35

标签: terraform terraform-provider-aws

我想使用Terraform工作区来管理两个环境,一个用于aws,另一个用于localstack。下面是Terraform的配置文件。我不希望endpoints工作区上的skip_xxxaws属性。如何实现该逻辑?我能想到的唯一方法是为不同的环境创建多个文件夹,例如awsopenstackshared。但我想在workspace上找到解决方案,因为它是Terraform的内置功能,适用于不同的环境。

provider "aws" {
  profile = "default"
  region  = "ap-southeast-2"
  skip_credentials_validation = true
  skip_metadata_api_check     = true

  endpoints {
       lambda = "http://localhost:4574"
  }
}

1 个答案:

答案 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%兼容,则可能无法正确运行。如果您使用任何第三方模块,则它们可能会做出不适用于本地堆栈的假设。