本番環境で CloudFront を使用しているため、ステージング環境でも CloudFront を適用したいとかって要望は多々あると思います。
ただ、ステージング環境なんで全体に公開はしたくない、IPアドレス制限とかかけたいってなりますよね。
そんな時、今までは署名付きURLとか署名付き Cookie とかで対応せざるを得ませんでした。
参考URL
- CloudFront を使用してプライベートコンテンツを供給する
- AWS CloudFrontでプライベートコンテンツを配信 – Qiita
- CloudFront+S3で署名付きURLでプライベートコンテンツを配信する | Developers.IO
… 結構、めんどくさい。
そんな、僕達のために re:Invent 2015 に合わせるように発表された新サービス AWS WAF という救世主が現れましたよ。
この記事では AWS WAF を使用して、IP アドレス制限された CloudFront ネットワークを作成する方法をざっくり解説してみます。
AWS WAF では、IP Address や SQL Injection、String matching と言った Rules を作成し、その Rules を元に Web ACLs を作成します。
この Web ACLs を CloudFront の設定に適用することで、Rules にマッチしたリクエストを許可 or 拒否してくれる用に設定することが可能です。
まずは、AWS のマネージメントコンソールから AWS WAF を開きましょう。
Web ACLs が何も設定されていない場合は「Get Started」とかって表示されます。
クリックするとチュートリアルが表示されるので、次に進みましょう。
すでに設定されている場合は、Web ACLs の一覧が表示されるので「Create Web ACL」をクリック。
最初の画面では Web ACL の名前と、それに紐付いた Cloud Watch のメトリクス名を指定する画面が表示されます。
適当に入力して「Next」をクリック。
Create Conditions とか言われます。
今回は IP アドレス制限したいので「Create IP match condition」をクリック。
IP match condition を作成する画面が表示されます。
Name を指定して、「Add an IP address or range」をクリックして許可したい IP アドレスを追加していきます。
全部終わったら「Create」をクリック。
前の画面に戻るので「Next」をクリック。
Create Rules とか言われるので、「Create Rule」をクリック。
Name と CloudWatch metric name を入力後、Rules を作成します。
Rules は以下のように作りましょう。
- does
- originate from an IP address in
- 「前の画面で作った IP match condition」
そんで、「Create」をクリック。
いま作った Rules にマッチするリクエストに対してのアクションを設定するので、上図の用に設定しましょう。
「If a request matches all of the conditions in a rule, take the corresponding action」の Action は allow
「If a request doesn't match any rules, take the default action」の Default action は Block all requests that don't match any rules
これで、許可された IP アドレス以外からのリクエストに対しては接続拒否してくれます。
設定したら「Next」をクリック。
いま、作成した Web ACL の設定確認画面が表示されるので内容確認して「Confirmed and Create」をクリック。
これで Web ACL ができました。
次に CloudFront にこの Web ACL を適用します。
作成済みの Destribution 選んで「General」タブで「Edit」をクリック。
「AWS WAF Web ACL」って項目があるので、そこで先ほど作成した Web ACL を選択して「Yes, Edit」をクリック。
あとは Deploy が終わるのを待つだけです。
マネージメントコンソールでポチポチするだけで簡単に設定できちゃいましたねー。