AWS WAFでCloudFront経由でのアクセスにIPアドレス制限を設定する 

CloudFrontを経由して、ELB→EC2に構築したWebサーバにアクセス可能なIPアドレスを制限したい場合、Webサーバ側で制限するか、CloudFrontのエッジロケーションのIPと許可したいIPをセキュリティグループで制限する方法を取っていました。
しかし、最近リリースされたAWS WAFを使えば、アクセス元のIPアドレスで制限を掛けられるようなので、試してみました。

# AWS WAFとは
AWSで提供している、Web Application Firewallです。
詳しくは以下の公式サイトを参照してください。
https://aws.amazon.com/jp/waf/

# 料金
リクエスト数に対する課金は100 万リクエスト単位なので、それ以下に収まるようなレベルであれば、設定するACLとルール数によって料金が変わってきます。
詳しくは以下の公式サイトを参照してください。
https://aws.amazon.com/jp/waf/pricing/

# 設定

## 準備
※事前にCloudFrontの設定が完了していることを前提とします。

AWS Management Consoleより、AWS WAFの画面に行き、"Get started"を選択します。
![Kobito.xpqlXD.png](https://qiita-image-store.s3.amazonaws.com/0/93640/e7447961-371e-6f83-6f00-858772cead2a.png "Kobito.xpqlXD.png")

![Kobito.26wuwC.png](https://qiita-image-store.s3.amazonaws.com/0/93640/46a8931b-8941-b44c-c467-4698163a1f57.png "Kobito.26wuwC.png")

## ACL名の設定
ACL Nameを入力します。
![Kobito.k2n3ow.png](https://qiita-image-store.s3.amazonaws.com/0/93640/347ee862-34a3-d0f6-6366-f73467c7d4f0.png "Kobito.k2n3ow.png")

## conditionの設定
今回はIP制限を掛けたいので、"Create IP match condition"を設定します。
![Kobito.3T7Eas.png](https://qiita-image-store.s3.amazonaws.com/0/93640/5d4fc25c-aca2-7550-f5de-eb609d2cfb86.png "Kobito.3T7Eas.png")

condition名を入れ、制限したいIPアドレスを入力します。
![Kobito.NA13Uq.png](https://qiita-image-store.s3.amazonaws.com/0/93640/7c90464c-789e-ea77-d1a1-2bae9ce23e4c.png "Kobito.NA13Uq.png")

## Ruleの設定
続いてRuleを設定します。"Create rules"を選択します。
![Kobito.WoIi2g.png](https://qiita-image-store.s3.amazonaws.com/0/93640/2e858676-f667-aabe-0471-a4e670bd8135.png "Kobito.WoIi2g.png")

Rule名を入れ、先ほど設定したconditionを選択します。
![Kobito.O3MlK2.png](https://qiita-image-store.s3.amazonaws.com/0/93640/bc1d240a-7cef-8e3c-ba3b-856bdc25706f.png "Kobito.O3MlK2.png")

続いて、Ruleにマッチした場合としなかった場合のActionを設定します。
今回は特定のIPアドレスのみを許可(それ以外は拒否)したいので、Order Noが振られている箇所のActionは"Allow"を、Default Actionの箇所は"Block all requests that don't match any rules"を選択します。
![Kobito.nXJL2g.png](https://qiita-image-store.s3.amazonaws.com/0/93640/4761d80c-5be0-da55-64b3-c5efb34d485c.png "Kobito.nXJL2g.png")

設定済みのCloudFrontを選択します。
![Kobito.93H2Lk.png](https://qiita-image-store.s3.amazonaws.com/0/93640/d3e990e6-5560-6b03-05b1-55520361db8f.png "Kobito.93H2Lk.png")

レビュー画面が表示されるので、内容を確認します。
![Kobito.QFBXnd.png](https://qiita-image-store.s3.amazonaws.com/0/93640/e4af88fb-a1e9-84de-0936-67d660ffd76e.png "Kobito.QFBXnd.png")

作成されたことを確認します。
![Kobito.uyQGUU.png](https://qiita-image-store.s3.amazonaws.com/0/93640/0d3fcc12-8465-3655-465c-522dfe9d568f.png "Kobito.uyQGUU.png")

# 動作確認
では、実際にアクセスして動作を確認します。
まず、許可されているIPアドレスから、CloudFrontを経由してWebサーバにアクセス出来ることを確認します。

成功後、以下の様なSampled requestsが確認出来ました。
Matches ruleが、設定したrule名になっています。
![Kobito.wtOvf0.png](https://qiita-image-store.s3.amazonaws.com/0/93640/8c503ce0-62b8-6cfb-d304-f8fa69a2337f.png "Kobito.wtOvf0.png")

また、許可しているIPアドレスからアクセスした場合は、Default Actionの方にマッチしています。
![Kobito.Qazp04.png](https://qiita-image-store.s3.amazonaws.com/0/93640/64abc788-6c51-9892-3cb6-ac8981b5435d.png "Kobito.Qazp04.png")

エラー画面は以下のような画面が返って来ました。

```bash
ERROR

The request could not be satisfied.

Request blocked.

Generated by cloudfront (CloudFront)
Request ID: hoge
```

特定のユーザーにのみ公開したい場合や、まだ開発中などで外部公開したくない場合などに便利そうです。