AWS WAF で CloudFront 環境にIPアドレス制限を設定する

本番環境で CloudFront を使用しているため、ステージング環境でも CloudFront を適用したいとかって要望は多々あると思います。
ただ、ステージング環境なんで全体に公開はしたくない、IPアドレス制限とかかけたいってなりますよね。
そんな時、今までは署名付きURLとか署名付き Cookie とかで対応せざるを得ませんでした。

参考URL

結構、めんどくさい。

そんな、僕達のために 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」をクリック。

AWS WAF 1

最初の画面では Web ACL の名前と、それに紐付いた Cloud Watch のメトリクス名を指定する画面が表示されます。
適当に入力して「Next」をクリック。

AWS WAF 2

Create Conditions とか言われます。
今回は IP アドレス制限したいので「Create IP match condition」をクリック。

AWS WAF 3

IP match condition を作成する画面が表示されます。
Name を指定して、「Add an IP address or range」をクリックして許可したい IP アドレスを追加していきます。
全部終わったら「Create」をクリック。
前の画面に戻るので「Next」をクリック。

AWS WAF 4

Create Rules とか言われるので、「Create Rule」をクリック。

AWS WAF 5

Name と CloudWatch metric name を入力後、Rules を作成します。

Rules は以下のように作りましょう。

  • does
  • originate from an IP address in
  • 「前の画面で作った IP match condition」

そんで、「Create」をクリック。

AWS WAF 6

いま作った 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」をクリック。

AWS WAF 7

いま、作成した Web ACL の設定確認画面が表示されるので内容確認して「Confirmed and Create」をクリック。
これで Web ACL ができました。

次に CloudFront にこの Web ACL を適用します。

AWS CloudFront 1

作成済みの Destribution 選んで「General」タブで「Edit」をクリック。

AWS CloudFront 2

「AWS WAF Web ACL」って項目があるので、そこで先ほど作成した Web ACL を選択して「Yes, Edit」をクリック。
あとは Deploy が終わるのを待つだけです。

マネージメントコンソールでポチポチするだけで簡単に設定できちゃいましたねー。

コメントを残す

メールアドレスが公開されることはありません。