labunix's blog

labunixのラボUnix

aws-cliでのリージョン一覧の取得と、有効なリージョンの一覧を抽出

■aws-cliでのリージョン一覧の取得と、有効なリージョンの抽出
 「aws-region-search 」で、Webから取得したリージョン一覧に間違いがないことを確認したい。

$ aws --version
aws-cli/2.1.16 Python/3.7.3 Linux/4.19.0-13-amd64 source/x86_64.debian.10 prompt/off

$ aws ec2 describe-regions --all-regions | \
    jq -r '.Regions[] | [ .RegionName, .Endpoint, .OptInStatus ] | @tsv' | \
    sort -V > aws-region2.txt 

$ git clone https://github.com/labunix/aws;cd aws

$ ./aws-region-search 
Usage  : ./aws-region-search "[aws-cli]" jq-entry
Example: ./aws-region-search "aws codecommit list-repositories" .repositories[].repositoryName
Output : aws-region-list.txt

■以下と同じ結果となることを想定

$ aws ec2 describe-regions | jq -r '.Regions[].RegionName' > region-optin
$ grep -f region-optin aws-region.txt | sort -V
ap-northeast-1 アジアパシフィック(東京)
ap-northeast-2 アジアパシフィック(ソウル)
ap-southeast-1 アジアパシフィック(シンガポール)
ap-southeast-2 アジアパシフィック(シドニー)
ap-south-1 アジアパシフィック(ムンバイ)
ca-central-1 カナダ(中部)
eu-central-1 欧州(フランクフルト)
eu-north-1 欧州(ストックホルム)
eu-west-1 欧州(アイルランド)
eu-west-2 欧州(ロンドン)
eu-west-3 欧州(パリ)
sa-east-1 南米(サンパウロ)
us-east-1 米国東部(バージニア北部)
us-east-2 米国東部(オハイオ)
us-west-1 米国西部(北カリフォルニア)
us-west-2 米国西部(オレゴン)

$ grep -v -f region-optin aws-region.txt | awk '{if(NR==1){print $0}else{print $0 | "sort -V"}}'
コード 名前
af-south-1 アフリカ(ケープタウン)
ap-east-1 アジアパシフィック(香港)
ap-northeast-3 アジアパシフィック(大阪:ローカル)
eu-south-1 ヨーロッパ(ミラノ)
me-south-1 中東(バーレーン)

■Webから取得した一覧との差を確認する。

$ awk '!/コード/{print $1 | "sort | uniq -c | sort -k 1"}' aws-region.txt aws-region2.txt 
      1 ap-northeast-3
      2 af-south-1
      2 ap-east-1
      2 ap-northeast-1
      2 ap-northeast-2
      2 ap-south-1
      2 ap-southeast-1
      2 ap-southeast-2
      2 ca-central-1
      2 eu-central-1
      2 eu-north-1
      2 eu-south-1
      2 eu-west-1
      2 eu-west-2
      2 eu-west-3
      2 me-south-1
      2 sa-east-1
      2 us-east-1
      2 us-east-2
      2 us-west-1
      2 us-west-2

$ awk '!/コード/{print $1 | "sort -uV"}' aws-region.txt aws-region2.txt > aws-region3.txt

■aws-cliでは、大阪ローカルリージョン以外が出力されていることがわかる。

$ grep -f aws-region{3,,2}.txt | \
    awk -F"[ :\t]" '{a[$2]=a[$2]" "$0}END{for(n in a){gsub("  *|\t|:"," ",a[n]);gsub("aws-region2*.txt","",a[n]);print a[n],n}}' | \
    awk '{if(NF<5){print "* "$0}else{print "  "$0}}'
    eu-west-2 欧州(ロンドン)  eu-west-2 ec2.eu-west-2.amazonaws.com opt-in-not-required eu-west-2
    eu-north-1 欧州(ストックホルム)  eu-north-1 ec2.eu-north-1.amazonaws.com opt-in-not-required eu-north-1
    eu-west-3 欧州(パリ)  eu-west-3 ec2.eu-west-3.amazonaws.com opt-in-not-required eu-west-3
    us-west-1 米国西部(北カリフォルニア)  us-west-1 ec2.us-west-1.amazonaws.com opt-in-not-required us-west-1
    us-east-1 米国東部(バージニア北部)  us-east-1 ec2.us-east-1.amazonaws.com opt-in-not-required us-east-1
    ap-east-1 アジアパシフィック(香港)  ap-east-1 ec2.ap-east-1.amazonaws.com not-opted-in ap-east-1
    us-west-2 米国西部(オレゴン)  us-west-2 ec2.us-west-2.amazonaws.com opt-in-not-required us-west-2
    us-east-2 米国東部(オハイオ)  us-east-2 ec2.us-east-2.amazonaws.com opt-in-not-required us-east-2
    eu-south-1 ヨーロッパ(ミラノ)  eu-south-1 ec2.eu-south-1.amazonaws.com not-opted-in eu-south-1
    sa-east-1 南米(サンパウロ)  sa-east-1 ec2.sa-east-1.amazonaws.com opt-in-not-required sa-east-1
    ap-northeast-1 アジアパシフィック(東京)  ap-northeast-1 ec2.ap-northeast-1.amazonaws.com opt-in-not-required ap-northeast-1
    ap-northeast-2 アジアパシフィック(ソウル)  ap-northeast-2 ec2.ap-northeast-2.amazonaws.com opt-in-not-required ap-northeast-2
    ap-south-1 アジアパシフィック(ムンバイ)  ap-south-1 ec2.ap-south-1.amazonaws.com opt-in-not-required ap-south-1
*   ap-northeast-3 アジアパシフィック(大阪 ローカル) ap-northeast-3
    eu-central-1 欧州(フランクフルト)  eu-central-1 ec2.eu-central-1.amazonaws.com opt-in-not-required eu-central-1
    ap-southeast-1 アジアパシフィック(シンガポール)  ap-southeast-1 ec2.ap-southeast-1.amazonaws.com opt-in-not-required ap-southeast-1
    ap-southeast-2 アジアパシフィック(シドニー)  ap-southeast-2 ec2.ap-southeast-2.amazonaws.com opt-in-not-required ap-southeast-2
    me-south-1 中東(バーレーン)  me-south-1 ec2.me-south-1.amazonaws.com not-opted-in me-south-1
    ca-central-1 カナダ(中部)  ca-central-1 ec2.ca-central-1.amazonaws.com opt-in-not-required ca-central-1
    eu-west-1 欧州(アイルランド)  eu-west-1 ec2.eu-west-1.amazonaws.com opt-in-not-required eu-west-1
    af-south-1 アフリカ(ケープタウン)  af-south-1 ec2.af-south-1.amazonaws.com not-opted-in af-south-1

■OptInStatusは3つのステータスを出力する。

$ cat region-dict 
opt-in-not-required オプトイン不要(有効)
opted-in オプトインしている(有効)
not-opted-in オプトインしていない(無効)

$ awk '{print $NF | "sort -uV"}' aws-region2.txt
not-opted-in
opt-in-not-required

■無効の条件を追加すると以下のようになる。

$ grep -f aws-region{3,,2}.txt | \
    awk -F"[ :\t]" '{a[$2]=a[$2]" "$0}END{for(n in a){gsub("  *|\t|:"," ",a[n]);gsub("aws-region2*.txt","",a[n]);print a[n],n}}' | \
    awk '{if(NF<5|| $(NF-1) ~ /^not-opted-in$/){print "* "$0}else{print "  "$0}}'
    eu-west-2 欧州(ロンドン)  eu-west-2 ec2.eu-west-2.amazonaws.com opt-in-not-required eu-west-2
    eu-north-1 欧州(ストックホルム)  eu-north-1 ec2.eu-north-1.amazonaws.com opt-in-not-required eu-north-1
    eu-west-3 欧州(パリ)  eu-west-3 ec2.eu-west-3.amazonaws.com opt-in-not-required eu-west-3
    us-west-1 米国西部(北カリフォルニア)  us-west-1 ec2.us-west-1.amazonaws.com opt-in-not-required us-west-1
    us-east-1 米国東部(バージニア北部)  us-east-1 ec2.us-east-1.amazonaws.com opt-in-not-required us-east-1
*   ap-east-1 アジアパシフィック(香港)  ap-east-1 ec2.ap-east-1.amazonaws.com not-opted-in ap-east-1
    us-west-2 米国西部(オレゴン)  us-west-2 ec2.us-west-2.amazonaws.com opt-in-not-required us-west-2
    us-east-2 米国東部(オハイオ)  us-east-2 ec2.us-east-2.amazonaws.com opt-in-not-required us-east-2
*   eu-south-1 ヨーロッパ(ミラノ)  eu-south-1 ec2.eu-south-1.amazonaws.com not-opted-in eu-south-1
    sa-east-1 南米(サンパウロ)  sa-east-1 ec2.sa-east-1.amazonaws.com opt-in-not-required sa-east-1
    ap-northeast-1 アジアパシフィック(東京)  ap-northeast-1 ec2.ap-northeast-1.amazonaws.com opt-in-not-required ap-northeast-1
    ap-northeast-2 アジアパシフィック(ソウル)  ap-northeast-2 ec2.ap-northeast-2.amazonaws.com opt-in-not-required ap-northeast-2
    ap-south-1 アジアパシフィック(ムンバイ)  ap-south-1 ec2.ap-south-1.amazonaws.com opt-in-not-required ap-south-1
*   ap-northeast-3 アジアパシフィック(大阪 ローカル) ap-northeast-3
    eu-central-1 欧州(フランクフルト)  eu-central-1 ec2.eu-central-1.amazonaws.com opt-in-not-required eu-central-1
    ap-southeast-1 アジアパシフィック(シンガポール)  ap-southeast-1 ec2.ap-southeast-1.amazonaws.com opt-in-not-required ap-southeast-1
    ap-southeast-2 アジアパシフィック(シドニー)  ap-southeast-2 ec2.ap-southeast-2.amazonaws.com opt-in-not-required ap-southeast-2
*   me-south-1 中東(バーレーン)  me-south-1 ec2.me-south-1.amazonaws.com not-opted-in me-south-1
    ca-central-1 カナダ(中部)  ca-central-1 ec2.ca-central-1.amazonaws.com opt-in-not-required ca-central-1
    eu-west-1 欧州(アイルランド)  eu-west-1 ec2.eu-west-1.amazonaws.com opt-in-not-required eu-west-1
*   af-south-1 アフリカ(ケープタウン)  af-south-1 ec2.af-south-1.amazonaws.com not-opted-in af-south-1

■有効なリージョンの一覧を抽出

$ grep -f aws-region{3,,2}.txt |  \
   awk -F"[ :\t]" '{a[$2]=a[$2]" "$0}END{for(n in a){gsub("  *|\t|:"," ",a[n]);gsub("aws-region2*.txt","",a[n]);print a[n],n}}' |  \
   awk '{if($(NF-1) !~ /^not-opted-in$/&& $1 !~ /ap-northeast-3/){print $1,$2}}'  | sort -V
ap-northeast-1 アジアパシフィック(東京)
ap-northeast-2 アジアパシフィック(ソウル)
ap-southeast-1 アジアパシフィック(シンガポール)
ap-southeast-2 アジアパシフィック(シドニー)
ap-south-1 アジアパシフィック(ムンバイ)
ca-central-1 カナダ(中部)
eu-central-1 欧州(フランクフルト)
eu-north-1 欧州(ストックホルム)
eu-west-1 欧州(アイルランド)
eu-west-2 欧州(ロンドン)
eu-west-3 欧州(パリ)
sa-east-1 南米(サンパウロ)
us-east-1 米国東部(バージニア北部)
us-east-2 米国東部(オハイオ)
us-west-1 米国西部(北カリフォルニア)
us-west-2 米国西部(オレゴン)

$ grep -f aws-region{3,,2}.txt |  \
   awk -F"[ :\t]" '{a[$2]=a[$2]" "$0}END{for(n in a){gsub("  *|\t|:"," ",a[n]);gsub("aws-region2*.txt","",a[n]);gsub("大阪 ローカル","大阪:ローカル",a[n]);print a[n],n}}' |  \
   awk '{if($(NF-1) ~ /^not-opted-in$/|| $1 ~ /ap-northeast-3/){print $1,$2}}'  | sort -V
af-south-1 アフリカ(ケープタウン)
ap-east-1 アジアパシフィック(香港)
ap-northeast-3 アジアパシフィック(大阪:ローカル)
eu-south-1 ヨーロッパ(ミラノ)
me-south-1 中東(バーレーン)