AWSエンドポイントのIPアドレス帯域をAPIで取得する(今はS3のみ)

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。
企業のLANからAWSの各サービスにアクセスしたいというとき、ルーターやプロキシなどによって制限がかかっている場合がよくあります。これらの制限を解除するためには、ドメイン単位ないしIPアドレス帯域単位で許可設定を追加する訳ですが、ドメインはおおむね不変なのに対しIPアドレス帯域はそれなりの頻度で追加・更新されるため、メンテナンスをどうするか考慮が必要です。

少し前に、AWSエンドポイントのIPアドレス帯域一覧がJSONファイルとして公開され、それをダウンロードし解析するのが現在の一般的な対応ですが、先日のVPCエンドポイントのリリース時にひっそりと追加されたDescribePrefixLists APIによる取得方法を今回はご紹介します。

実行例

標準のEC2 APIですので、AWS SDK経由や直接APIをコールしても良いですが、AWS CLI(バージョン1.7.27以降)を利用するのがお手軽です。(AWS SDK JavaScriptの実装は横田の記事の例があります。若干先走ってますがw) aws ec2 describe-prefix-listsコマンドが対応します。

$ aws ec2 describe-prefix-lists --region ap-northeast-1
{
    "PrefixLists": [
        {
            "PrefixListName": "com.amazonaws.ap-northeast-1.s3",
            "Cidrs": [
                "54.231.224.0/21"
            ],
            "PrefixListId": "pl-61a54008"
        }
    ]
}
$

PrefixLists.Cidrsがそれです。PrefixLists.PrefixListNameからS3の東京リージョンのIPアドレス帯域が54.231.224.0/21であることがわかります。

全リージョン分を取りたいのであれば、Mac/Linuxのbashシェルのfor文などで繰り返すのが簡単です。Mac/Linuxのsortコマンドにパイプしてソートもしてみましょう。

$ for REGION in us-east-1 us-west-1 us-west-2 eu-west-1 eu-central-1 ap-northeast-1 ap-southeast-1 ap-southeast-2; \
do aws ec2 describe-prefix-lists --output text --region $REGION --query 'PrefixLists[].Cidrs'; done | sort -n
54.231.0.0/17
54.231.128.0/19
54.231.160.0/19
54.231.192.0/20
54.231.224.0/21
54.231.232.0/21
54.231.240.0/22
54.231.252.0/24
$

簡単に取れましたね。

注意・制限事項

注意、制限事項をまとめておきます。

  • 本来の用途ではない使い方なので、正確性は保証されません
  • 現時点ではAmazon S3のみ
  • VPCエンドポイントが有効でないリージョン(サンパウロ)ではエラーになる

DescribePrefixLists APIは、VPCエンドポイント向けのセキュリティグループ設定のために用意されたAPI(VPCから外向き通信を許可するターゲットの取得)なので、VPCエンドポイントに対応するサービスしか情報として取れず、インターネットからの接続を想定したものでもありません。実用上は特に問題ありませんが、本来はそういうものと留意いただくのが良いと思います。

まとめ

AWS CLIや各言語向けSDKで割と簡単に呼べる作りになっているので応用範囲は広いと思います。ホワイトボックスなネットワーク機器と構成管理ツールの組み合わせ(例えばネットワールドさんのPuppetソリューションとか)などに組み込めたりするかなぁと妄想しています。現時点では対応サービスがS3しかない状況ですが、今後の対応サービスの追加に期待したいところですね。