【问题标题】:How can I use Terraform workspace to switch between aws and localstack?如何使用 Terraform 工作区在 aws 和 localstack 之间切换?
【发布时间】:2019-12-07 09:30:12
【问题描述】:

我想使用Terraform 工作区来管理两个环境,一个用于aws,另一个用于localstack。下面是 Terraform 的配置文件。我不想要aws 工作区上的endpointsskip_xxx 属性。我怎样才能实现这个逻辑?我能想到的唯一方法是为不同的环境创建多个文件夹,例如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"
  }
}

【问题讨论】:

  • 您使用的是哪个版本的 Terraform?
  • 我正在使用v0.12.4

标签: terraform terraform-provider-aws


【解决方案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% 兼容,则可能无法正常运行。如果您使用任何第三方模块,那么他们可能会做出不适用于 localstack 的假设。

【讨论】:

  • 如何放置这两个不同的提供者文件? terraform 如何根据工作空间选择一个而不是另一个?我认为所有工作区的所有配置文件都是可见的。对吗?
  • 每个配置都在一个单独的目录中
猜你喜欢
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
相关资源
最近更新 更多