【问题标题】:Terraform structure for two aws accounts两个 aws 帐户的 Terraform 结构
【发布时间】:2019-11-04 06:59:03
【问题描述】:

我有两个 AWS 账户,一个用于开发,另一个用于生产。我正在尝试在两个帐户中创建与 VPC、子网等相同的资源。通过阅读谷歌,我想出了以下结构:

|---- README.md
|---- dev_account
    |---- main.tf
    |---- terraform.tfvars
    |---- variables.tf
|---- prod_account
    |---- main.tf
    |---- terraform.tfvars
    |---- variables.tf
|---- modules
    |---- provider.tf
    |---- vpc.tf
    |---- variables.tf

这是我正在使用的一些代码:

模块/provider.tf

provider "aws" {
  region = "${var.aws_region}"
}

模块/vpc.tf

 resource "aws_vpc" "vpc" {
      cidr_block       = "${var.vpc_cidr_block}"
      instance_tenancy = "default"
 }

dev_account/main.tf:

module "create_infra" {
  source = "../modules"

  aws_region = "${var.aws_region}"
  vpc_cidr_block = "${var.vpc_cidr_block}"
}

与上面相同,我将创建更多模块,如子网并从 main.tf 文件调用。

dev_account/variables.tf

variable "aws_region" {}

variable "vpc_cidr_block" {}

dev_account/terraform.tfvars

aws_region = "us-west-1"
vpc_cidr_block = "10.10.10.0/8"

这是正确的方法吗?有没有更好的方法来做到这一点? dev_account 下的 main.tf 文件似乎不正确,因为如果我拥有 10 个或更多资源,它将变得难以管理。

【问题讨论】:

  • 最佳实践是使用工作区和提供者别名。您是正确的,您的方法不会扩展并且最终变得难以维护。您的方法是人们如何在这些功能不可用的旧版本中解决 Terraform 中的这个问题。

标签: terraform terraform-provider-aws


【解决方案1】:

这确实符合 Terraform 最佳实践。我想补充几点:

Dev/Prod 中的资源之间可能存在差异。例如,在 Dev 中,您可以使用部署在 EC2 机器上的 MySQL 实例来节省成本,而在 Prod 中,您可以使用托管 RDS 实例。

因此,一个用于所有基础架构的模块可能有点难以维护,因为它会开始为不同的选项(例如 MySQL 与 RDS)获取大量标志。相反,您可以使用以下设置:

modules
  rds
  ec2-mysql

在您的开发人员main.tf 中,您将调用ec2-mysql 模块,而在产品main.tf 中您调用rds 模块。

您的基础架构可能会变得如此庞大,而仅基于环境来拆分它是很困难的。例如。在 Prod 中,您可能会维护多个微服务、数据库、数据湖以及谁知道什么。您可能希望能够在数据湖中部署更改,而不会冒更新微服务中的某些内容的风险。此时您有两种方法:

  1. 将代码拆分到多个存储库中。您可以通过 git reference 获取 terraform 模块。
  2. 移至如下文件夹结构:
environment
  dev
    microservices
    data lake

您可能会使用像 Terragrunt 这样的工具来简化最后的设置

希望这能给你一些有用的意见。

【讨论】:

    【解决方案2】:

    我建议使用以下文件夹结构,这将有助于在所有环境中使用相同的 main.tf terraform 代码,从而避免在所有 env 文件夹中复制相同的代码。

    我在当前的实现中使用它,它真的很有帮助,要使用这种模式,您需要为每个模块添加切换开/关功能,以便基于变量 terraform 可以根据环境需要跳过特定模块。

    |---- README.md
    |---- deployment
        |---- main.tf
        |---- variables.tf
    |---- environments
        |---- dev
            |---- backend.tfvar
            |---- variables.tfvar
        |---- prod
            |---- backend.tfvar
            |---- variables.tfvar
    |---- modules
        |---- provider.tf
        |---- vpc.tf
        |---- variables.tf
    

    要初始化和应用 terraform,请使用以下命令(cd 到特定环境文件夹)

    terraform init -var-file=variables.tfvar -backend-config=backend.tfvar ../../deployment/
    terraform apply -var-file=variables.tfvar ../../deployment
    

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 2023-04-02
      • 2020-09-15
      • 2020-07-27
      • 2019-04-28
      • 2020-06-03
      • 2020-06-18
      • 1970-01-01
      • 2019-04-05
      相关资源
      最近更新 更多