Amazon CloudFront(以下CloudFront)とEC2を用いてWebサービスなどを提供したい場合に、EC2へのHTTP(S)アクセスをCloudFrontからのみに絞りたい場合がある。
ただCloudFrontからのアクセスを簡単に指定する方法はなく、以下で公開されているCloudFrontのIPアドレスを個別にセキュリティグループに設定する必要がある。(記事執筆時点で67個)
- CloudFront エッジサーバーの場所と IP アドレス範囲 (Amazon CloudFront 開発者ガイド)
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
なお、セキュリティグループには登録数の上限があるので気を付けること。
- Amazon VPC の制限 (Amazon Virtual Private Cloud ユーザーガイド)
- Amazon VPC でセキュリティグループルールの制限を増やす (AWS ナレッジセンター)
参考サイト
- Amazon CloudFront (Amazon Web Services)
- AWS技術情報 (Qiita)