パーソル&サーバーワークス

ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

【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とサブネットが作成されました!

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

VPCのCIDRブロック変更.png

  • Subnet CIDRブロック
    • 変更前: 10.0.1.0/24 ⇒ 変更後: 10.0.1.1/24

サブネットのCIDRブロック変更.png

terraform apply実行(2回目)

VPCとサブネットの置換に成功しました!

  • 置換後のVPC
    VPCの置換.png
  • 置換後のサブネット
    サブネットの置換.png

リソース破棄の検証

terraform destroy実行

VPCとサブネットが削除できました!
VPC削除後.png

おわりに

  • 実行環境で可能な操作をTerraformコマンドで管理できるのは便利です!
  • 各プロバイダーでサポートされていないリソースの操作に使用すると便利かもしれません
  • 誰かに刺さりますように...

この記事は私が書きました

森 翔吾

最近はコンテナ・サーバレスを学習しています。 よろしくお願いします。

森 翔吾

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。