やーまんぶろぐ

気が向いた時にだけ書くブログ

CDP:Cache Distributionパターンの構成にAWS WAFを組み合わせてアクセスを制限する方法

静的コンテンツの配信性能を高めるために、S3とCloudFrontを組み合わせて、CloudFrontから静的ファイルを配信するCDP:Cache Distributionパターンは良く知られていると思います。

CDP:Cache Distributionパターン - AWS-CloudDesignPattern

このCDP:Cache DistributionパターンにAWS WAFを組み合わせてアクセスを制限する方法をメモしておきます。

事前準備

IAMに権限付きユーザを作成

S3とCloudFrontとWAFを操作するIAMユーザを作成します。

作成履歴

S3バケット作成

S3に直接アクセスさせたくないので、バケットポリシーを変更しないでそのまま作成します。

ブラウザからtest-bucketバケットを作成しました。詳細は割愛します。

CloudFront作成

参考
dev.classmethod.jp

Restrict Bucket Accessを指定して、CloudFrontからのみS3バケットにアクセスできるようにします。
Origin Access Identifyがない場合は新規作成します。

f:id:yamano3201:20160512003927p:plain

10分ほど時間がかかります。ダッシュボードのStateがIn ProgressがDeployedになったら完了となります。
In Progressのままでも次の作業に進めるので、そのまま進めます。

AWS WAFを使ってアクセス制限

参考
dogmap.jp

この時点でS3には直接アクセス不可で、CloudFront経由でしかアクセスできない静的ファイル置き場が完成しています。
しかし、CloudFrontのパブリックドメインやIPが分かれば誰でもアクセスできてしまう状態です。

そこでAWS WAFを使ってアクセス制限を付けます。

まずはACLの名前とCloudWatchの名前を適当につけます。
f:id:yamano3201:20160512004159p:plain

続いて特定のIPレンジを指定します。指定したIPレンジからしかアクセスできないようにします。
f:id:yamano3201:20160512004301p:plain

Create rulesボタンを押して下のようにルールを作成します。
f:id:yamano3201:20160512004900p:plain

ルールにマッチするリクエストに対するアクションの設定をします。
f:id:yamano3201:20160512004940p:plain

最後に上で作成したCloudFrontを指定します。
f:id:yamano3201:20160512005103p:plain

これでAWS WAFの設定まで完成です。

動作確認

awsコマンドの初期設定

動作確認の前に初期設定をしておきましょう。
configureを実行すると以下4項目が順番に表示されるので入力してください。
また、CloudFrontの設定をtrueにしておきます。

aws configure

AWS Access Key ID [None]: xxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxx
Default region name [None]: xxxxxxxxxx
Default output format [None]: json

aws configure set preview.cloudfront true

ファイルをS3にsyncする

syncによるファイルのアップロードはCloudFrontを経由せずS3に直接行います。アクセスキーとシークレットアクセスキーで制限しています。

1行目がS3にsyncするコマンドです。ローカルディレクトリとS3バケットを指定します。
2行目でCloudFrontにあるキャッシュを削除しています。CloudFrontのIDを指定します。

aws s3 sync test-dir s3://test-bucket/
aws cloudfront create-invalidation --distribution-id XXXXXXXXXXX --paths '/*'

CloudFrontのキャッシュを削除しているのは、S3の変更をCloudFrontに反映させるためです。
キャッシュが削除されるのに10分ほどかかるので、CloudFront経由でファイルの変更を確認するためには10分ほど待ちましょう。

CloudFront経由でS3からファイルをGET

CloudFrontに付いているパブリックドメインでGETしましょう。WAFで指定したIPからしかGETできないことを確認しましょう。
また、S3から直接GETすることもできないようになっているので、アクセス制限は意図したとおりになっているはずです。

最後に

CDP:Cache Distributionパターンの構成にAWS WAFを組み合わせてアクセスを制限する方法を書きました。

気が向いたら、また書きます。