Amazon CloudFront(以下CloudFront)とEC2を用いてWebサービスなどを提供したい場合に、EC2へのHTTP(S)アクセスをCloudFrontからのみに絞りたい場合がある。

ただCloudFrontからのアクセスを簡単に指定する方法はなく、以下で公開されているCloudFrontのIPアドレスを個別にセキュリティグループに設定する必要がある。(記事執筆時点で67個)

IPアドレス一つひとつをAWS CLIやマネジメントコンソール上で設定するのは大変なので、以下のワンライナーを使えば簡単にセキュリティグループに一括登録することができる。

なお、必要なツールとしてcurl、jq、awkはあらかじめインストールしておくこと。またここではEC2のTCP/80ポートへの接続許可とする。

$ sg="sg-xxxxxxxxx"
$ curl http://d7uri8nf7uskq.cloudfront.net/tools/list-cloudfront-ips \
| jq -r '.[][]' \
| awk '{printf("echo %s;aws ec2 authorize-security-group-ingress --group-id %s --protocol tcp --port 80 --cidr %s\n",$1,"'${sg}'",$1)}' \
| sh

以下、一つのコマンド毎に説明する。
⦿ CloudFrontのIPアドレス取得(JSONフォーマット)

$ curl http://d7uri8nf7uskq.cloudfront.net/tools/list-cloudfront-ips
{"CLOUDFRONT_GLOBAL_IP_LIST": ["144.220.0.0/16", ... , "34.232.163.208/29"]}

⦿ そこからjqでIPアドレスのみ取り出す

$ ... | jq -r '.[][]'
144.220.0.0/16
:
34.232.163.208/29

⦿ awkを使ってそのIPアドレスをAWS CLIでセキュリティグループに登録する構文を作る(時間がかかるので最初にIPアドレスをechoしておく)

$ ... | awk '{printf("echo %s;aws ec2 authorize-security-group-ingress --group-id %s --protocol tcp --port 80 --cidr %s\n",$1,"'${sg}'",$1)}'
echo 144.220.0.0/16;aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxxx --protocol tcp --port 80 --cidr 144.220.0.0/16
:
echo 34.232.163.208/29;aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxxx --protocol tcp --port 80 --cidr 34.232.163.208/29

⦿ これをshで実行する

$ ... | sh
144.220.0.0/16
:
34.232.163.208/29

なお、セキュリティグループには登録数の上限があるので気を付けること。

参考サイト

元記事はこちら

CloudFrontのIPをセキュリティグループに一括登録するワンライナー