前回は、CloudFront+WAFを利用して、開発環境等のIP制限を実装する方法をご紹介しました。
引き続き今日は、S3へのアクセスを「特定のIPアドレス」または「CloudFrontからのみ」許可する設定をご紹介します。
CloudFront+S3のセットで利用する際は、
CloudFrontからのみ、S3へアクセス可能とする場合が多いのではないでしょうか。
ただその場合だと、同一名称でファイルを上げ直した時に、キャッシュが残って困る事があるかと思います。
(この点については、query stringを付けた運用をしているのであれば気にならないと思いますが・・・)
そんなときは、今回ご紹介する方法を試してみて下さい。
S3へ直接アクセスが可能になるため、毎度キャッシュを消さなくても良いことが運用上のポイントです。
なお、今日ご紹介する方法は単独でもいいですし、前回の内容と組み合わせて使うことも可能です。
それではさっそく設定方法を見ていきましょ~ ✧(・ㅂ・)و
前提
CloudFront + S3 の構成。
開発者は、S3、CloudFrontの両方へ直接アクセス可能にしたい。
ユーザは、CloudFront経由でしか画像にアクセスできないようにしたい。
アクセス制限の対象となるCloundFrontとS3は、それぞれ事前に作成済みである。
運用イメージは以下の通り。
手順概要
必要な手順は大まかに以下の2つです。
1. [AWS CloudFront] Origin Access Identity の設定
2. [AWS S3] IPアドレスベースのbucket policyを追加
手順詳細
1. [AWS CloudFront] Origin Access Identity の設定
AWSコンソールにログインし、「Services」->「CloudFront」をクリックします。
次に、アクセス制限をかけたいS3とセットになっているCloudFront Distributionを選択して、Origins の「Edit」をクリックします。
Origin Settings
AWS CloudFrontからのみアクセスできるように、一意の Access Identity(ID) を追加します。
Restrict Bucket Access: Yes を選択します。
※ ここをYesとすると、これ以降の2項目が表示されるようになります。Origin Access Identity: Create a New Identity を選択します。
※ CloudFrontからのアクセスであることを示す一意のIDです。
ここでは新規作成していますが、
他のCloudFront Distributionで作成したIDを使いまわすことも可能です。Grant Read Permissions on Bucket: Yes,Update Bucket Policy を選択します。
※ S3 bucket policyに、自動でAccess Identity(ID)を追記してくれます。
Noを選ぶと、手動追加となり不便です。
特に理由が無ければYesを選びましょう。
問題なければ、下段のYes Editをクリックして反映させましょう。
なお、設定変更直後はStatusがIn Progressとなり、この間は設定が反映されていません。
しばらく(20~40分程度)して反映完了すると、StatusがDeployedになります。
2. [AWS S3] IPアドレスベースのbucket policyを追加
続いて、S3のbucket policy設定です。
AWSコンソールにログインし、「Services」->「S3」をクリックします。
次に、アクセス制限をかけたいBucketを選択して、
Permissionsの「Bucket Policy」をクリックします。
「CloudFront Origin Access Identity」の bucket policy
この時点で、以下のようにPrincipal: CloudFront Origin Access Identityのpolicyが自動で追加されていると思います。
{ "Sid": "2", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <一意のID>" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::test.s3.hoge.com/*" },
IPアドレスベースのbucket policy
続いて、特定のIPアドレスからのアクセスを許可するように、ポリシーを追加します。
{ "Sid": "Allow-from-specific-IP-only", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3::test.s3.hoge.com/*", "Condition": { "IpAddress": { "aws:SourceIp": [ "<許可するIPアドレス/サブネットマスク>" ] } } }
問題なければ、Saveしましょう。設定は即時反映されます。
以上で設定は完了です。
これで、「特定のIPアドレス」または「CloudFrontからのみ」アクセスが許可される形となります。
いかがでしたか。
ちなみに、S3 bucket policyに「CloudFrontのIP & 特定IP」を記載する方法でもアクセス制限の実現は可能です。
ただしこの場合、CloudFrontのIPが動的に変わるため、適当なタイミングでIPリストの更新をする必要があり、少々不便です。
今回ご紹介した方法では、
EffectがAllowどうしのポリシーを複数束ねることで、or条件として使うことができる特性を利用し、IPリストの手動更新を不要としています。
S3 bucket policyは考え方に少々クセがあって、慣れるまでは難しいかなと個人的には感じています。
ということで次回はS3のbucket policy(評価順序等)について書いてみたいと思います。
興味を持って頂けたらぜひまた読んでみて下さい!
それでは~ (・о・) /