おぎろぐはてブロ

なんだかんだエンジニアになって10年以上

VPCのサブネットを抽出して、きれいに並べたい

tl;dr

aws ec2 describe-subnets --filter Name=vpc-id,Values=vpc-123456  \
  --query "Subnets[*].[CidrBlock,(Tags[?Key=='Name'].Value)[0]]" \
  --output text | sort -V
10.0.0.0/22     public-subnet-ap-northeast-1a
10.0.4.0/22     public-subnet-ap-northeast-1c
10.0.8.0/22     public-subnet-ap-northeast-1d
10.0.12.0/22    private-subnet-ap-northeast-1a
10.0.16.0/22    private-subnet-ap-northeast-1c
10.0.20.0/22    private-subnet-ap-northeast-1d

aws ec2 describe-subnets

タグを取り出すのがちょっとだるい

{
  "Subnets": [
    {
      "AvailabilityZone": "ap-northeast-1d",
      "AvailabilityZoneId": "apne1-az2",
      "AvailableIpAddressCount": 1019,
      "CidrBlock": "10.0.20.0/22",
      "State": "available",
      "SubnetId": "subnet-...",
      "VpcId": "vpc-....",
      "Tags": [
        {
          "Key": "Name",
          "Value": "private-subnet-ap-northeast-1d"
        }
      ],
    },
   ...

今回は指定したVPC内のサブネットと、その名前を取り出したかったので、CidrBlockと、Tags の中の KeyName である要素をフィルタしてきて、これは1つなので (正確には1つかゼロ)、リストの先頭をとってくる。

--query "Subnets[*].[CidrBlock,(Tags[?Key=='Name'].Value)[0]]"

sort -V

queryの中で sort_by を使ってソートも (きっと) できるけれど、さすがに辛いので、sort を使う。

-V は natural sort of (version) numbers within text ということで、ドットで区切られたバージョン番号をソートするオプションで、バージョン番号ではないけれど、ドットの後の数字で並べてくれるので、これでIPアドレス順に並んでくれる。