EC2とECSのレコードを全てCSVに出力する


環境

  • Linux Mint 20 Ulyana
  • aws-cli/2.0.41
  • jq 1.6

前回の続きです。

前回AWS Route53のレコードをCSVに出力するシェルスクリプトを作ったので、同様にEC2・ECSの情報を出力するシェルスクリプトを作ってみます。

EC2

以下のようなシェルです。
region一覧は固定で持っているので、今後増減があった場合は手動で修正が必要です。

#!/bin/bash

#region一覧
regionList=(
us-east-2
us-east-1
us-west-1
us-west-2
af-south-1
ap-east-1
ap-south-1
ap-northeast-3
ap-northeast-2
ap-southeast-1
ap-southeast-2
ap-northeast-1
ca-central-1
cn-north-1
cn-northwest-1
eu-central-1
eu-west-1
eu-west-2
eu-south-1
eu-west-3
eu-north-1
me-south-1
sa-east-1
)

echo '"AvailabilityZone", "Name", "PublicDnsName","PublicIpAddress","PrivateDnsName","PrivateIpAddress"'

for region in ${regionList[@]}; do
    EC2List=`aws ec2 describe-instances --region ${region} --output json --query 'Reservations[].Instances[]'`
    EC2ListLen=`echo $EC2List | jq length`

    for i in $( seq 0 $(($EC2ListLen - 1)) ); do
        EC2=`echo $EC2List | jq .[$i]`
        avZone=`echo $EC2 | jq -c -r '.Placement.AvailabilityZone // ""'`
        priDns=`echo $EC2 | jq -c -r '.PrivateDnsName // ""'`
        priIp=`echo $EC2 | jq -c -r '.PrivateIpAddress // ""'`
        pubDns=`echo $EC2 | jq -c -r '.PublicDnsName // ""'`
        pubIp=`echo $EC2 | jq -c -r '.PublicIpAddress // ""'`
        
        Tags=`echo $EC2 | jq -c -r '.Tags'`
        TagsLen=`echo $Tags | jq length`

        name='None'
        for j in $( seq 0 $(($TagsLen - 1)) ); do
            tag=`echo $Tags | jq .[$j]`
            key=`echo $tag | jq -c -r '.Key'`

            if [ "$key" = "Name" ]; then
                name=`echo $tag | jq -c -r '.Value // ""'`
                break
            fi
        done

        echo "\"${avZone}\",\"${name}\",\"${pubDns}\",\"${pubIp}\",\"${priDns}\",\"${priIp}\""
    done
done

このシェルではEC2のドメインやIPアドレスを取得していますが、そこは必要に情報に置き換えても良いです。

ECS

以下のようなシェルです。

#!/bin/bash
echo '"ClusterArns", "IPAddress"'

ClusterArnsList=`aws ecs list-clusters --output json --query 'clusterArns'`
ClusterArnsListLen=`echo $ClusterArnsList | jq length`
for i in $( seq 0 $(($ClusterArnsListLen - 1)) ); do
    clusterArns=`echo $ClusterArnsList | jq .[$i]`
    clusterArns=${clusterArns//\"/}
    TaskArnsList=`aws ecs list-tasks --cluster $clusterArns --output json --query 'taskArns'`
    TaskArnsListLen=`echo $TaskArnsList | jq length`

    for j in $( seq 0 $(($TaskArnsListLen - 1)) ); do
        taskArns=`echo $TaskArnsList | jq .[$j]`
        taskArns=${taskArns//\"/}

        Tasks=`aws ecs describe-tasks --cluster ${clusterArns} --tasks ${taskArns} --output json --query 'tasks'`
        TasksLen=`echo $Tasks | jq length`

        for k in $( seq 0 $(($TasksLen - 1)) ); do
            task=`echo $Tasks | jq .[$k]`

            TaskDetails=`echo $task | jq -c -r '.attachments[].details'`
            TaskDetailsLen=`echo $TaskDetails | jq length`

            for l in $( seq 0 $(($TaskDetailsLen - 1)) ); do
                taskDetail=`echo $TaskDetails | jq .[$l]`
                name=`echo $taskDetail | jq -c -r '.name'`

                if [ "$name" = "privateIPv4Address" ]; then
                    ipaddress=`echo $taskDetail | jq -c -r '.value'`
                    break;
                fi
            done
            echo "\"${clusterArns}\",\"${ipaddress}\""
        done
    done
done

こちらもECSのIPアドレスを出力しています。必要な情報に差し替えてください。