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作成
Restrict Bucket Accessを指定して、CloudFrontからのみS3バケットにアクセスできるようにします。
Origin Access Identifyがない場合は新規作成します。
10分ほど時間がかかります。ダッシュボードのStateがIn ProgressがDeployedになったら完了となります。
In Progressのままでも次の作業に進めるので、そのまま進めます。
AWS WAFを使ってアクセス制限
参考
https://dogmap.jp/2015/10/27/post-3205/dogmap.jp
この時点でS3には直接アクセス不可で、CloudFront経由でしかアクセスできない静的ファイル置き場が完成しています。
しかし、CloudFrontのパブリックドメインやIPが分かれば誰でもアクセスできてしまう状態です。
そこでAWS WAFを使ってアクセス制限を付けます。
まずはACLの名前とCloudWatchの名前を適当につけます。
続いて特定のIPレンジを指定します。指定したIPレンジからしかアクセスできないようにします。
Create rulesボタンを押して下のようにルールを作成します。
ルールにマッチするリクエストに対するアクションの設定をします。
最後に上で作成したCloudFrontを指定します。
これで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することもできないようになっているので、アクセス制限は意図したとおりになっているはずです。