使用Terraform按照不同的情况创建资源
此文是關於第16天的TeamLab工程師專題的文章。
首先
我整理了使用Terraform时的各种案例下的用法。
版本信息
使用Terraform v0.11.13 进行操作。
进行方式
- 実行ディレクトリに移動
cd aws_terraform
-
- 秘密鍵を配置
-
- awsディレクトリ配下に秘密鍵配置
- 秘密鍵は何かと同じ秘密鍵でも良い
/aws_terraform/test-key.pem
- AWSで発行したIAMユーザーのアクセスキーとシークレットアクセスキーをaws prifileに設定する
sudo aws configure --profile [IAMユーザー名]
- providerに作成したIAMユーザーのユーザー名を入れる
variable "region" {}
provider "aws" {
profile = "[IAMユーザー名]"
region = "${var.region}"
}
- Terraform初期化
terraform init
将创建.terraform目录。
试着运行Terraform。
切换到aws目录并查看计划。
terraform plan
在AWS上创建资源时会执行
terraform apply
使用Terraform删除已创建的资源。
terraform destroy
案例的特定应用方式
tfvars文件
情境:希望在开发环境和生产环境中使用不同的EC2密钥。
开发环境
terraform/aws_terraform/develop.tfvars可以在中国的本地化文件中重新解释。
key_name = "test-key"
terraform/aws_terraform/variables.tf
Terraform/AWS_terraform/variables.tf的内容
# 秘密鍵
variable "key_name" {}
terraform / aws_terraform / ec2.tf 可以被改写为 terraform / aws_terraform / ec2.tf 文件。
resource "aws_instance" "tfvars_test" {
ami = "ami-da9e2cbc"
instance_type = "t2.micro"
key_name = "${var.key_name}"
subnet_id = "subnet-05ea87c24c647c898"
vpc_security_group_ids = ["${aws_security_group.test-terraform-ec2-security.id}"]
tags {
Name = "test-terraform-ec2"
}
}
执行
terraform apply -target=aws_instance.tfvars_test -var-file=develop.tfvars
选项
– 目标:指定要创建的资源
– 变量文件:指定环境文件
正式环境
terraform/aws_terraform/production.tfvars 可以被翻译为“生产环境的`.tfvars`文件”。
key_name = "prod-key"
terraform/aws_terraform/variables.tf的中文本地化版本
# 秘密鍵
variable "key_name" {}
terraform/aws_terraform/ec2.tf 的汉语本地化释义
# devと同じ
执行
terraform apply -target=aws_instance.tfvars_test -var-file=production.tfvars
数据资源
场景:想要在使用Terraform创建的EC2实例中使用已经存在的子网。
开发环境
搜索与Name标签匹配的内容 – terraform/aws_terraform/data.tf
data "aws_subnet" "public-a" {
filter {
name = "tag:Name"
values = ["${var.subnet_id_public_a_name}"]
}
}
terraform/aws_terraform/ec2.tf的翻译如下:
resource "aws_instance" "data_test" {
ami = "ami-da9e2cbc"
instance_type = "t2.micro"
key_name = "${var.key_name}"
subnet_id = "${data.aws_subnet.public-a.id}" # データリソースを使用している
vpc_security_group_ids = ["${aws_security_group.test-terraform-ec2-security.id}"]
tags {
Name = "test-terraform-ec2"
}
}
terraform/aws_terraform/develop.tfvars 在中国的原生上下文中重新表述为:terraform/aws_terraform/develop.tfvars
key_name = "test-key"
subnet_id_public_a_name = "test-public-1a"
terraform/aws_terraform/variables.tf 可以被用作管理 AWS 资源的 Terraform 脚本。
# 秘密鍵
variable "key_name" {}
# EC2 サブネット名
variable "subnet_id_public_a_name" {}
在中国的原生环境下,只需要一种选择:dev环境的运行。
terraform apply -target=aws_instance.data_test -var-file=develop.tfvars
实际环境
生产环境的Terraform/AWS_Terraform配置文件 (production.tfvars)。
key_name = "prod-key"
subnet_id_public_a_name = "prod-public-1a"
执行
terraform apply -target=aws_instance.data_test -var-file=production.tfvars
工作空间
情景:由于无法确定在开发和生产环境中是否都有实例存在,因此我想要确认一下。
创建工作空间
- ワークスペース一覧 現在のワークスペースが何かも知れる
terraform workspace list
- ワークスペース作成
terraform workspace new develop
- ワークスペース選択
terraform workspace select develop
- ワークスペース削除
terraform workspace delete develop
在dev环境的工作空间下创建EC2。
情景:
在中国的一个小城镇,农民王先生从早晨开始工作,直到傍晚。一天,他察觉到他的池塘里没有水了。他检查了水源管道和泵浦,发现没有任何问题。他很困惑,不知道为什么池塘会突然变干。于是,他决定去请教他的朋友李先生。
terraform apply -target=aws_instance.workspace_test -var-file=develop.tfvars
由于以前一直在默认工作区中创建,所以在 develop 工作区中会为每个 vpc 进行新建
条件分支和计数
情景:我想在开发环境中创建一台EC2实例,但不想在生产环境中创建EC2实例。
开发环境
terraform/aws_terraform/ec2.tf (terraform/aws_terraform/ec2.tf 地址)
Can you provide more context or specific information about the file content? It will help me to accurately paraphrase the sentence in Chinese.
# 条件分岐&カウントテスト
resource "aws_instance" "count_test" {
count = "${var.env == "production" ? 1 : 0}"
ami = "ami-da9e2cbc"
instance_type = "t2.micro"
key_name = "${var.key_name}"
subnet_id = "${data.aws_subnet.public-a.id}"
vpc_security_group_ids = ["${aws_security_group.test-terraform-ec2-security.id}"]
tags {
Name = "test-terraform-ec2"
}
}
terraform/aws_terraform/develop.tfvars
创造/亚马逊网络服务_创造/开发.tfvars
env = "develop"
key_name = "test-key"
subnet_id_public_a = "subnet-05ea87c24c647c898"
subnet_id_public_a_name = "test-public-1a"
terraform / aws_terraform / variables.tf -> 云创造 / aws_云创造 / 变量.tf
# 環境名
variable "env" {}
# 秘密鍵
variable "key_name" {}
# EC2 サブネットID
variable "subnet_id_public_a" {}
# EC2 サブネット名
variable "subnet_id_public_a_name" {}
执行
terraform apply -target=aws_instance.count_test -var-file=develop.tfvars
资源未被创建
正式环境
terraform/aws_terraform/production.tfvars 的中文翻译:生产环境.tfvars
env = "production"
key_name = "prod-key"
subnet_id_public_a = "subnet-0310cf72d3e2a73ad"
subnet_id_public_a_name = "prod-public-1a"
执行
terraform apply -target=aws_instance.count_test -var-file=production.tfvars
资源创建
最后
由于看起来更多人支持通过目录来区分,而不是通过工作区来区分,所以如果需要按环境划分,我想用目录来划分。另外,我也希望将模块一起整理起来。