AWS：VPC関連の情報を取得したいとき

以前、[「AWS：EC2インスタンスの情報を取得したいとき」](https://qiita.com/If_it_bleeds-we_can_kill_it/items/f445608fdf3286ebcce8)ではEC2の情報取得をAWSCLIで一括で行う手法を書いた。今回はそれのVPC版となる。パラシ作成用などにどうぞ。

# 前提
- タグ：Nameを使って名前付与をしている
　⇒タグNameを使ってない場合もコマンドの構文を少し変えれば対応は可能。
　⇒.他のタグを使ってるときは、{Name:Tags[?Key==`Name`].Value|[0]のところのNameをご自身の環境の値に変える
- Cloudshellが望ましいが、AWSCLIがインストールされているマシンもおK
<br>

# コマンド集
行が複数に分かれていますが、行の末尾に「\」で改行しているため、全行をまるごとコピーペーストしてもOKな状態にしています。

- VPCを一覧出力してCSVに出力
```shell-session
aws ec2 describe-vpcs --query 'Vpcs[].{Name:Tags[?Key==`Name`].Value|[0], VpcId:VpcId, CidrBlock:CidrBlock, OwnerId:OwnerId, Tenancy:InstanceTenancy, Ipv6CidrBlock:Ipv6CidrBlockAssociationSet[].Ipv6CidrBlock|[0], Ipv6Pool:Ipv6CidrBlockAssociationSet[].Ipv6Pool|[0]}' \
 | jq '.[]' | jq -rs '(.[0]|keys_unsorted),map([.[]])[]|@csv' | sort > vpclist.csv
```
vpclist.csvがカレントにできるので、それをダウンロード。
<br>

- サブネット一覧出力
```shell-session
aws ec2 describe-subnets --query 'Subnets[].{Name:Tags[?Key==`Name`].Value|[0], VpcId:VpcId, CidrBlock:CidrBlock, SubnetId:SubnetId, AZ:AvailabilityZone, MapPublicIpOnLaunch:MapPublicIpOnLaunch, State:State, OwnerId:OwnerId}' \
 | jq '.[]' | jq -rs '(.[0]|keys_unsorted),map([.[]])[]|@csv' | sort > subnetlist.csv
```
subnetlist.csvがカレントにできるので、それをダウンロード。
<br>

- ルートテーブルのルート一覧出力

```shell-session
CSVFILE=route-table.csv;\
echo "RouteTableId,Name,DestinationCidrBlock,GatewayId,NatGatewayId,VpcPeeringConnectionId,TransitGatewayId,NetworkInterfaceId,DestinationPrefixListId,InstanceId,State" > ${CSVFILE};\
aws ec2 describe-route-tables --query "RouteTables[].[RouteTableId,Tags[?Key=='Name']|[0].Value,Routes[].[DestinationCidrBlock,GatewayId,NatGatewayId,VpcPeeringConnectionId,TransitGatewayId,NetworkInterfaceId,DestinationPrefixListId,InstanceId,State]]" --output text | \
tr "\t" "," | sed -e 's/rtb*^/rtb*,/g' -e 's/^0/,,0/g' -e 's/^1/,,1/g' -e 's/^2/,,2/g' -e 's/^3/,,3/g' -e 's/^4/,,4/g' -e 's/^5/,,5/g' -e 's/^6/,,6/g' \
 -e 's/^7/,,7/g' -e 's/^8/,,8/g' -e 's/^9/,,9/g' -e 's/^None/,,None/g' \
 >> ${CSVFILE}
```
route-table.csvがカレントにできるので、それをダウンロード。
<br>

- インターネットゲートウェイの一覧出力
```shell-session
aws ec2 describe-internet-gateways --query 'InternetGateways[].{Name:Tags[?Key==`Name`].Value|[0], InternetGatewayId:InternetGatewayId, VpcId:Attachments[0].VpcId, OwnerId:OwnerId}' \
 | jq '.[]' | jq -rs '(.[0]|keys_unsorted),map([.[]])[]|@csv' | sort > igw.csv
```
igw.csvがカレントにできるので、それをダウンロード。
<br>

- NATゲートウェイの一覧出力
```shell-session
aws ec2 describe-nat-gateways --query 'NatGateways[].{Name:Tags[?Key==`Name`].Value|[0], NatGatewayId:NatGatewayId, VpcId:VpcId, SubnetId:SubnetId, NetworkInterfaceId:NatGatewayAddresses[0].NetworkInterfaceId}' \
 | jq '.[]' | jq -rs '(.[0]|keys_unsorted),map([.[]])[]|@csv' | sort > natgwlist.csv
```
natgwlist.csvがカレントにできるので、それをダウンロード。
<br>

- TransitGatewayの一覧出力
```shell-session
aws ec2 describe-transit-gateways --query 'TransitGateways[].{Name:Tags[?Key==`Name`].Value|[0], TGWID:TransitGatewayId, OwnerId:OwnerId, ASN:Options.AmazonSideAsn, AutoAcceptSharedAttachments:Options.AutoAcceptSharedAttachments, DefaultRouteTableAssociation:Options.DefaultRouteTableAssociation, AssociationDefaultRouteTableId:Options.AssociationDefaultRouteTableId, DefaultRouteTablePropagation:Options.DefaultRouteTablePropagation, PropagationDefaultRouteTableId:Options.PropagationDefaultRouteTableId, VpnEcmpSupport:Options.VpnEcmpSupport, DnsSupport:Options.DnsSupport, MulticastSupport:Options.MulticastSupport}' \
 | jq '.[]' | jq -rs '(.[0]|keys_unsorted),map([.[]])[]|@csv' | sort > tgwlist.csv
```
tgwlist.csvがカレントにできるので、それをダウンロード。
<br>

- TransitGateway アタッチメントの一覧出力
```shell-session
aws ec2 describe-transit-gateway-attachments --query 'TransitGatewayAttachments[].{Name:Tags[?Key==`Name`].Value|[0], TGWID:TransitGatewayAttachmentId, TGWAttachmentID:TransitGatewayAttachmentId, TGWID:TransitGatewayId, TGWOwnerID:TransitGatewayOwnerId, OwnerId:ResourceOwnerId, ResourceType:ResourceType, ResourceId:ResourceId, TGWRTBID:Association.TransitGatewayRouteTableId}' \
 | jq '.[]' | jq -rs '(.[0]|keys_unsorted),map([.[]])[]|@csv' | sort > tgwattchlist.csv
```
tgwattchlist.csvがカレントにできるので、それをダウンロード。
<br>

- TransitGateway ルートテーブルの一覧出力
```shell-session
aws ec2 describe-transit-gateway-route-tables --query 'TransitGatewayRouteTables[].{Name:Tags[?Key==`Name`].Value|[0], TGWRTBID:TransitGatewayRouteTableId, TGWID:TransitGatewayId, DefaultAssociationRouteTable:DefaultAssociationRouteTable, DefaultPropagationRouteTable:DefaultPropagationRouteTable}' \
 | jq '.[]' | jq -rs '(.[0]|keys_unsorted),map([.[]])[]|@csv' | sort > tgwrtblist.csv
```
tgwrtblist.csvがカレントにできるので、それをダウンロード。
<br>

- Elastic IPの一覧出力
```shell-session
aws ec2 describe-addresses  --query 'Addresses[].{Name:Tags[?Key==`Name`].Value|[0], PublicIp:PublicIp, NetworkInterfaceId:NetworkInterfaceId, PublicIpv4Pool:PublicIpv4Pool}' \
 | jq '.[]' | jq -rs '(.[0]|keys_unsorted),map([.[]])[]|@csv' | sort > elasticips.csv
```
elasticips.csvがカレントにできるので、それをダウンロード。
<br>

- VPCエンドポイントの一覧出力
```shell-session
aws ec2 describe-vpc-endpoints --query 'VpcEndpoints[].{Name:Tags[?Key==`Name`].Value|[0],ServiceName:ServiceName,VpcEndpointId:VpcEndpointId,VpcId:VpcId,VpcEndpointType:VpcEndpointType}' \
 | jq '.[]' | jq -rs '(.[0]|keys_unsorted),map([.[]])[]|@csv' | sort > vpcendpoint.csv
```
vpcendpoint.csvがカレントにできるので、それをダウンロード。
<br>

## もし他にいいコマンドがあったらここに追記予定
<br>

# 参考
【AWS CLI】ネットワーク関連のリソース一覧取得
https://blog.serverworks.co.jp/aws-cli-network#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89-%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E6%9C%89%E3%82%8A-4


jq と JMESPath を同時に覚える
https://www.techscore.com/blog/2019/09/30/jq-%E3%81%A8-jmespath-%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E8%A6%9A%E3%81%88%E3%82%8B/


【AWS CLI】Transit Gateway関連の情報取得編
https://blog.serverworks.co.jp/aws-cli-tgw

【AWS CLI】Transit Gatewayのルートテーブルの詳細出力編
https://blog.serverworks.co.jp/aws-cli-tgw-route-table

【AWS CLI】全Route TableのRoute情報を取得する方法
https://blog.serverworks.co.jp/aws-cli-desribe-route-table

tr - 文字の変換や削除 - Linuxコマンド
https://webkaru.net/linux/tr-command/