share facebook facebook facebook twitter twitter menu hatena pocket slack

2020.01.07 TUE

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

木檜 和明

WRITTEN BY 木檜 和明

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をセキュリティグループに一括登録するワンライナー

木檜 和明

木檜 和明

遠くのクラウドと手元のIoTデバイス、両エッジをつないだものづくりがしたいと妄想中。Arduinoのコミュニテイやってます。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。