【Terraform】dataブロックを使って同一VPC内のサブネット・セキュリティグループを一括取得する

## 概要
Terraformで任意のVPC内に存在するサブネット・セキュリティグループの一覧を一括取得したい。
**dataブロック**と**filter**を使うことによって、VPCのIDから検索して一括取得することができる。

## 前提
任意のVPCにVPC名と**同名のNameタグ**が付与されている
（タグ名でVPCを絞り込むため必要）
![スクリーンショット 2022-12-23 9.55.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/62733409-2863-6ea8-a33c-6b87e7b08ec6.png)



## コード
```tf
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`

```tf
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"]'`


```tf
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内の既存サブネットやセキュリティグループを割り当てたい時に役に立つかも。

## 参考
https://developer.hashicorp.com/terraform/language/data-sources

https://qiita.com/yuta_vamdemic/items/be3cf73c8df29a52f5ec