两个AWS帐户的地形结构

时间:2019-06-21 12:09:57

标签: terraform terraform-provider-aws

我有两个AWS账户,一个用于dev,另一个用于prod。我试图在两个帐户中创建与VPC,子网等相同的资源。通过在google上阅读,我得出了以下结构:

|---- 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

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

modules / provider.tf

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

module / 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个或更多资源,将很难管理。

2 个答案:

答案 0 :(得分:0)

这确实是根据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之类的工具来简化上一次设置

希望这给了您一些有用的输入。

答案 1 :(得分:0)

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

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

|---- 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