使用AWS的terraform来建立测试环境,注重划分和成本感知
经过
建立样本

大致上,我們使用 Terraform 建立了以下的整體結構。這個結構包括 VPC、子網、安全組(以下簡稱 SG)和 EC2。創建順序是根據自動判斷處理的,即 VPC→[子網、SG]→EC2。在刪除時則是相反的順序,即 EC2→[子網、SG]→VPC。這是為了防止刪除有關聯資源,如果在刪除 VPC 時子網還存在,AWS 將無法刪除該 VPC,而導致錯誤。這表明了 AWS 在維持每個資源的相依性方面的作用。
哦,這個,這個,無法消除建造!

考虑到上述情况,在进行terraform构建时需要将lambda放置在外部。
虽然可以通过terraform管理lambda,但由于源代码管理变得相当复杂,
基本上建议将其放置在terraform构建的外部。
但在这种情况下,除非删除lambda或者断开各种依赖关系,
否则无法删除除EC2以外的资源,这导致无法销毁terraform构建。
如果在测试环境中不需要保留产生成本的资源,例如EC2和RDS,
这将变得非常严重,因为需要将构建持续运行到测试时间之外,这样造成的成本很高。
通过使用Terraform资源分离来解决成本问题

所以,我们来谈谈这样做的事情。
把成本不高或微不足道的基础设施部分放在一起,我们称之为基础设施。
将涉及费用的部分,如EC2、RDS等,放在一起作为所谓的服务器部分。
这样一来,我们可以删除EC2!这样,在工作结束后,我们只需删除成本资源,就可以节约成本了吧?
将想要一直保留的部分和想要更换的部分分开,这样能方便地创建测试环境,对吧?
构建过程
构建形象

实际上,并不直接使用子网和安全组的信息,而是将terraform执行时创建的信息文件(tfstate文件)存储在S3上,
然后引用该文件提取各种信息,在下一个terraform中进行利用。
概述建构方法

如果我们假设是这样构建的,我们将拆解红框部分。
你可以直接使用variables.tf和tfvars文件,只需要将modules的执行管理部分modules.tf拆分开来。

如果按照上面的那种感觉来做,感觉会很好。
执行时会成为从stage1到stage2的两个步骤,但相比手动创建,仍然要简单得多。
1阶段的基础建设方法
在执行根目录上准备一个outputs.tf文件,并在其中记录要输出的信息。
尽管tfstate文件中已经包含了各个资源的信息,
但这些信息是在传递给外部资源之前存储的,并不是专门用于传递的。
因此,需要单独记录传递信息。
其他terraform只能使用在这里写的信息。
output vpc_id {
value = module.vpc.vpc_id
}
output subnet_id {
value = module.vpc.subnet_id
}
output sg_ec2_id {
value = module.securitygroup.sg_ec2_id
}
构建方式(第二阶段、服务器端)
在执行的根目录上创建remote_state.tf,指定从哪个tfstate文件中提取信息。
data "terraform_remote_state" "data" {
backend = "s3"
config = {
bucket = "terraform-hogefuga-bucket"
key = "tfstate/hogeproject_dev_stage1.tfstate"
region = "ap-northeast-1"
}
}
在stage1的输出部分设置的值可以被使用,所以要在指定的值上做出良好的使用。
根据terraform的tfstate版本,以下的读取方法似乎会有所不同,所以请注意。这是tfstate版本V2的读取方式。
~~
module "server" {
source = "../../../modules/server/ec2_instance/"
subnet = "${data.terraform_remote_state.data.outputs.subnet_id}"
sg_ec2_id = "${data.terraform_remote_state.data.outputs.sg_ec2_id}"
}
~~