概要
Terraformで任意のVPC内に存在するサブネット・セキュリティグループの一覧を一括取得したい。
dataブロックとfilterを使うことによって、VPCのIDから検索して一括取得することができる。
前提
任意のVPCにVPC名と同名のNameタグが付与されている
(タグ名でVPCを絞り込むため必要)
コード
variable "vpc_name" {
default = "my-vpc"
}
# NameタグからVPC情報を取得
data "aws_vpc" "self" {
filter {
name = "tag:Name"
values = [var.vpc_name]
}
}
# 上記で取得したVPCのIDから、同一VPC内に存在するサブネットID一覧を一斉取得
data "aws_subnets" "vpc" {
filter {
name = "vpc-id"
values = [data.aws_vpc.self.id]
}
}
# 上記で取得したサブネットIDをキーに、サブネットの詳細情報を取得
data "aws_subnet" "self" {
for_each = toset(data.aws_subnets.vpc.ids)
vpc_id = data.aws_vpc.self.id
id = each.value
}
# 以下セキュリティグループもサブネットと同様VPCのIDから取得
data "aws_security_groups" "self" {
filter {
name = "vpc-id"
values = [data.aws_vpc.self.id]
}
}
data "aws_security_group" "self" {
for_each = toset(data.aws_security_groups.self.ids)
vpc_id = data.aws_vpc.self.id
id = each.value
}
terraform apply
を実行してstateを更新する
terraform state
で確認
terraform state list
data.aws_security_group.self["sg-XXXXXXXXXXXXXXXX"]
data.aws_security_group.self["sg-YYYYYYYYYYYYYYYY"]
data.aws_security_groups.self
data.aws_subnet.self["subnet-XXXXXXXXXXXXXXXX"]
data.aws_subnet.self["subnet-YYYYYYYYYYYYYYYY"]
data.aws_subnets.vpc
data.aws_vpc.self
取得したサブネットID一覧を確認
terraform state show data.aws_subnets.vpc
data "aws_subnets" "vpc" {
id = "ap-northeast-1"
ids = [
"subnet-XXXXXXXXXXXXXXXX",
"subnet-YYYYYYYYYYYYYYYY",
]
filter {
name = "vpc-id"
values = [
"vpc-XXXXXXXXXXXXXXX",
]
}
}
取得したサブネットIDをキーにサブネット詳細情報を確認
terraform state show 'data.aws_subnet.self["subnet-XXXXXXXXXXXXXXXX"]'
data "aws_subnet" "self" {
arn = "arn:aws:ec2:ap-northeast-1:0000000000000000:subnet/subnet-XXXXXXXXXXXXXXXX"
assign_ipv6_address_on_creation = false
availability_zone = "ap-northeast-1a"
availability_zone_id = "apne1-az4"
available_ip_address_count = 249
cidr_block = "10.0.11.0/24"
default_for_az = false
enable_dns64 = false
enable_resource_name_dns_a_record_on_launch = false
enable_resource_name_dns_aaaa_record_on_launch = false
id = "subnet-XXXXXXXXXXXXXXXX"
ipv6_native = false
map_customer_owned_ip_on_launch = false
map_public_ip_on_launch = true
owner_id = "0000000000000000"
private_dns_hostname_type_on_launch = "ip-name"
state = "available"
tags = {
"Name" = "subnet-a"
}
vpc_id = "vpc-XXXXXXXXXXXXXXXX"
}
任意のVPC内に新規リソースを立てて、同一VPC内の既存サブネットやセキュリティグループを割り当てたい時に役に立つかも。
参考