Amazon web services 在多个环境中使用AWS和单个帐户进行地形设置

Amazon web services 在多个环境中使用AWS和单个帐户进行地形设置,amazon-web-services,terraform,Amazon Web Services,Terraform,在AWS中为多个环境设置terraform的最佳方法是使用单个帐户开发、阶段和产品。我的客户只提供了一个账户供我们使用。大多数关于使用terraform的文章都是从使用我没有的多个帐户开始的。我计划使用S3后端存储,因为我们会有几个人支持基础架构。这将适用于大多数使用情况 选项1:使用区域 这有利于在控制台和api调用中保持分离。您将需要处理一些全局命名服务,如IAM和S3,但请参见解决方案的选项2。另外,确保所有区域都有您需要使用的服务 例如: 美国东部1号:prod us-east-2:质量

在AWS中为多个环境设置terraform的最佳方法是使用单个帐户开发、阶段和产品。我的客户只提供了一个账户供我们使用。大多数关于使用terraform的文章都是从使用我没有的多个帐户开始的。我计划使用S3后端存储,因为我们会有几个人支持基础架构。

这将适用于大多数使用情况

选项1:使用区域

这有利于在控制台和api调用中保持分离。您将需要处理一些全局命名服务,如IAM和S3,但请参见解决方案的选项2。另外,确保所有区域都有您需要使用的服务

例如:

美国东部1号:prod us-east-2:质量保证 美国西部2号:开发署 在每个区域创建一个S3存储桶来存储您的状态文件。类似于tfstate-01234567890-us-east-1、tfstate-01234567890-us-east-2、tfstate-01234567890-us-west-1的内容将确保您没有冲突

选项2:使用环境标记

即使您正在执行选项1,我仍然建议您也执行该选项。它将允许您执行诸如部署多个开发环境之类的操作

对于每个资源,将环境附加到名称中,并将环境添加到标记中

假设您创建了一个模块

variable environment {
  type = string
}
resource aws_lambda_function image_handler {
  function_name = "cool-function-${var.environment}"
  tags = {
    environment: var.environment
  }
... 
那你会的

module dev {
  source = "../path/to/above/module"
  environment = "prod"
}

不应使用不同的区域分割环境。在特定数据中心发生临时故障等情况下,区域可提高系统的恢复能力

此外,拥有自定义环境变量也不会对您有所帮助,因为您最终会 有代码重复


您的北极星应该拥有两个环境的精确副本,并避免代码重复。Terraform在这方面帮助您,因为它有。通过这种方式,您将使用相同的配置,并且您可以使用一个命令(如terraform workspace select staging/dev/production)更改环境,不要将工作空间用于多个环境部署,除非您只部署非常静态的基础架构。因为分支您的地形代码并不容易。假设您正在更新terraform的下一个版本。但您在生产中发现一个需要更新的bug。要将生产环境分支到修补程序,然后将修补程序重新合并到开发中,没有简单的方法。解决方案是为您的terraform代码使用类似git的版本控制系统。当然,您应该将您的基础结构作为代码进行版本控制,以便您可以跟踪更改并在出现故障时回滚。如果您采用版本控制解决方案,那么修复基础设施的错误将与修复任何应用程序的错误一样简单。在@Waldde提出的方案中,您可以进行分支,修复问题,在staging/dev中对其进行测试,一旦您感到满意,就可以将其合并到master中并应用到生产中。如本文所述,您对工作空间与通过文件布局隔离有何看法?使用区域不仅仅是为了恢复能力。2常见用例包括边缘或分布式体系结构,将计算和数据推近设备,从而减少延迟并改善用户体验。它还可以降低成本。另一个用例是需要在国家/地区保存数据的合法用例。对于这个问题,客户机将它们限制在一个AWS帐户区域,这对于开发、qa和产品环境来说是非常好的。关于为什么不使用工作区,请参见上面主要评论中的我的回答。使用这种方法,您最终会拥有不同的prod/stage/dev环境。例如,响应时间可能会因地区而异。此外,某些区域可能具有其他区域没有的特定设置