我有两个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个或更多资源,将很难管理。
答案 0 :(得分:0)
这确实是根据Terraform最佳实践得出的。我想补充几点:
Dev / Prod中的资源之间可能存在差异。例如,在Dev中,您可以使用部署在EC2计算机上的MySQL实例来节省成本,而在Prod中,您可以使用托管RDS实例。
因此,用于您所有基础架构的模块可能很难维护,因为它将开始为不同的选项(例如MySQL与RDS)获得很多标志。相反,您可以使用以下设置:
modules
rds
ec2-mysql
在开发人员main.tf
中,您将调用ec2-mysql
模块,而在产品main.tf
中,您将调用rds
模块。
在某些情况下,您的基础架构可能变得如此庞大,很难仅根据环境进行拆分。例如。在Prod中,您可能会维护几个微服务,一个数据湖的数据库以及谁知道什么。而且,您可能希望能够在数据湖中部署更改,而不会冒着更新微服务中某些内容的风险。到那时,您有两种方法:
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