- 公開日
- 最終更新日
【Terraform】terraform_dataでVPCとサブネットを作成してみた!
この記事を共有する
目次
はじめに
こんにちは!サービスGの森です!
最近、Terraformの勉強していて terraform_data という面白いリソースタイプを学習したので紹介します。
やりたいこと
リソースタイプaws_vpcとaws_subnetを使わずに。 terraform_data でVPCとサブネットを作成したい!
terraform_dataとは...?
- Terraform 1.4で導入されたリソースタイプです
- リモートコマンドの実行や既存リソースの管理など、多様な用途に対応します
terraform_dataでリソースを作成します
実行環境
Terraform実行環境 | EC2 Instance(Amazon LInux 2023) IAM RoleにAdministratorAccessを付与 |
Terraform Version | v1.10.0 |
Provider Source | hashicorp/aws |
Provider Version | v5.80.0 |
main.tf
# VPC
resource "terraform_data" "vpc" {
# VPCを作成
provisioner "local-exec" {
command = <<-EOF
VPC_ID=$(aws ec2 create-vpc \
--cidr-block "10.0.0.0/16" \
--tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=my-vpc}]' \
--query 'Vpc.VpcId' \
--output text)
echo $VPC_ID
EOF
}
}
# Subnet
resource "terraform_data" "subnet" {
# Subnetを作成
provisioner "local-exec" {
command = <<-EOF
VPC_ID=$(aws ec2 describe-vpcs \
--filters "Name=tag:Name,Values=my-vpc" \
--query 'Vpcs[0].VpcId' \
--output text)
SUBNET_ID=$(aws ec2 create-subnet \
--vpc-id $VPC_ID \
--cidr-block "10.0.1.0/24" \
--availability-zone "ap-northeast-1a" \
--tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=my-subnet}]' \
--query 'Subnet.SubnetId' \
--output text)
echo $SUBNET_ID
EOF
}
depends_on = [terraform_data.vpc]
}
コードについて
provisioner "local-exec" {} :
- Terraform を実行しているマシン上でコマンドを実行できます
- EC2インスタンス上で Terraform を実行している場合、そのEC2インスタンス上で実行されます
- ここではAWS CLIコマンドaws ec2 create-vpc, aws ec2 create-subnetを実行しています
terraform apply実行
terraform apply 実行後、VPCとサブネットが作成されました!
注意点!
- terraform_dataによるリソースの作成に成功しました!...が、このままではリソースの置換と破棄には対応していません。テンプレートを修正していきます!
テンプレートの修正
- リソースの置換と破棄にも対応できるように修正しました
# VPC
resource "terraform_data" "vpc" {
# リソースの再作成トリガー <<-- 追加
triggers_replace = {
cidr_block = "10.0.0.0/16"
}
# VPCを作成
provisioner "local-exec" {
command = <<-EOF
VPC_ID=$(aws ec2 create-vpc \
--cidr-block ${self.triggers_replace.cidr_block} \
--tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=my-vpc}]' \
--query 'Vpc.VpcId' \
--output text)
echo $VPC_ID
EOF
}
# VPCを削除 <<-- 追加
provisioner "local-exec" {
when = destroy
command = <<-EOF
VPC_ID=$(aws ec2 describe-vpcs \
--filters "Name=tag:Name,Values=my-vpc" \
--query 'Vpcs[0].VpcId' \
--output text)
aws ec2 delete-vpc --vpc-id $VPC_ID
EOF
}
}
# Subnet
resource "terraform_data" "subnet" {
# リソースの再作成トリガー <<-- 追加
triggers_replace = {
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-1a"
}
# Subnetを作成
provisioner "local-exec" {
command = <<-EOF
VPC_ID=$(aws ec2 describe-vpcs \
--filters "Name=tag:Name,Values=my-vpc" \
--query 'Vpcs[0].VpcId' \
--output text)
SUBNET_ID=$(aws ec2 create-subnet \
--vpc-id $VPC_ID \
--cidr-block ${self.triggers_replace.cidr_block} \
--availability-zone ${self.triggers_replace.availability_zone} \
--tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=my-subnet}]' \
--query 'Subnet.SubnetId' \
--output text)
echo $SUBNET_ID
EOF
}
# Subnetを削除
provisioner "local-exec" {
when = destroy
command = <<-EOF
SUBNET_ID=$(aws ec2 describe-subnets \
--filters "Name=tag:Name,Values=my-subnet" \
--query 'Subnets[0].SubnetId' \
--output text)
aws ec2 delete-subnet --subnet-id $SUBNET_ID
EOF
}
depends_on = [terraform_data.vpc]
}
コードについて
triggers_replace ={}:
- リソースの再作成を実行させるためのトリガーを定義します。ここではCIDRブロックなど、通常は置換が発生する設定値を条件にしています
when = destroy :
- リソースが削除される時にのみ実行されます。この中にリソースを削除するコマンドを記載しています。
リソース置換の検証
VPCとサブネットのCIDRブロックを書きかえます。
- VPC CIDRブロック
- 変更前: 10.0.0.0/16 ⇒ 変更後: 10.1.0.0/16
- Subnet CIDRブロック
- 変更前: 10.0.1.0/24 ⇒ 変更後: 10.0.1.1/24
terraform apply実行(2回目)
VPCとサブネットの置換に成功しました!
- 置換後のVPC
- 置換後のサブネット
リソース破棄の検証
terraform destroy実行
VPCとサブネットが削除できました!
おわりに
- 実行環境で可能な操作をTerraformコマンドで管理できるのは便利です!
- 各プロバイダーでサポートされていないリソースの操作に使用すると便利かもしれません
- 誰かに刺さりますように...
この記事は私が書きました
森 翔吾
最近はコンテナ・サーバレスを学習しています。 よろしくお願いします。