CloudFrontを用いたWebアプリの構成にしている場合、接続元のクライアントのIPを正確に取得するにはCloudFrontのIP範囲を把握して管理しておく必要があります。
しかしCloudFrontのIP範囲は変更されるので、それを検知して都度対応する必要があるので少々面倒です。
なのでこの作業を簡略化したいと思います。
CloudFrontのIPを設定すると何ができるか
CloudFrontのIPをnginxのset_real_ip_from
に設定することで信頼できるIPだと判断されるので、接続元クライアントのIPがREMOTE_ADDR
で判断できるようになります。そのためX_FORWARDED_FOR
で判断することをせずに済み安全になります。
IP範囲の変更をどうやって検知するか
Amazon SNSで通知してくれるものもありますが、今回はhttps://ip-ranges.amazonaws.com/ip-ranges.json
を定期的に確認することで対応します。
プルリク自動作成までのステップ
1. 公開されているIP範囲がnginxのconfと差分があるか確認
2. 差分があればプルリクを作成
やることはこれだけなのでGithubActionを使用して実現してみます。
GithubAction
jobs:
update-if-ip-changed:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: checkout master
uses: actions/checkout@v2
with:
ref: master
- name: update CloudFront IPs
id: update-cloudfront
env:
FILE_PATH: path/to/set_real_ip_fromを記述するファイル
run: |
curl https://ip-ranges.amazonaws.com/ip-ranges.json \
| jq -r '.prefixes | map(select(.service == "CLOUDFRONT")) | sort_by(.ip_prefix)[] | .ip_prefix' | awk '{print "set_real_ip_from " $1 ";"}' > $FILE_PATH
- name: create PullRequest
uses: peter-evans/create-pull-request@v3
with:
title: 'CloudFrontのIP範囲が変わったのでnginxに設定する'
commit-message: 'feat: CloudFrontのIPをset_real_ip_fromで設定'
branch: automated/update-cloudfront-ips
base: master
delete-branch: true
reviewers: |
hoge
fuga
IP範囲を取得する際にsort_by(.ip_prefix)[]
をすることで、管理しているIP範囲と差分が発生した時になるようにしています。
またステップがこれだけ簡易化できたのは、peter-evans/create-pull-requestのおかげです。このアクションが、コミットしてプルリク作成までを全て担ってくれるので、特にこちらで差分確認などの制御をする必要がありませんでした。(とても感動しました。)
動作確認
※動作確認のため、適当なIP範囲を設定しておきました。
無事に正しいIP範囲に変更するプルリクが作成されました。
最後に
作業的なプルリク作成って意外とあると思うのでpeter-evans/create-pull-requestこちらを使用すると色々できるかもしれません。
他にも、リリースイメージ作成時にイメージタグ更新のプルリクを自動で作成することをこのアクションを使用して行なっています。
ぜひ何かに使ってみてはいかがでしょうか。