【AWS】Cloudfront経由でS3に格納されたファイルを確認してみる

3 min read読了の目安(約3400字

こんにちは。
CloudFront使っていますか。
個人的にCloudFrontは、AWS-Solution Architectの資格試験勉強中によく見たサービスで、名前と役割については知っていましたが、実際使ってみたことはありませんでした。
構築自体は簡単でしたが、ハマったところもあったので、備忘も兼ねて記事にしました。

対象読者

  • AWS初心者の方
  • AWS認定試験(SAAなど)を勉強中の方

前提条件

  • AWSアカウントを所持していて、AWSコンソールにログインできること

本書の目的

  • AWS Cloudfront経由でS3に格納された画像ファイルを確認する

  • 下記画像のように、S3への直接アクセスは制限し、CloudFront経由でのみアクセス許可する
    ※矢印はhttps接続を表す

構築手順

1. S3バケットを作成する

  • S3管理コンソールから「バケットを作成」をクリックする

  • 任意のバケット名、リージョンを選択する(今回はap-northeast-1リージョンを選択)

※下記項目のチェックは入れておく(デフォルトでチェックされている、バケットのパブリックアクセスをブロック)

  • 一番下の「バケットの作成」をクリックし、S3バケットが作成できたことを確認する

2. S3にファイルをアップロードする

  • S3管理コンソールから、前の手順で作成したS3バケットを選択し、「アップロード」をクリックする

  • 「ファイルを追加」から任意の画像ファイルを選択し、画面下の「アップロード」をクリックする。

  • 画像がアップロードできたことを確認する

※ブラウザからS3上のファイルにアクセス(オブジェクトURLにアクセス)すると、下記のようにアクセスがブロックされ、バケットのパブリックアクセスがブロックされていることが確認できる

3. CloudFrontディストリビューションを構築する

  • CloudFront管理コンソールの「Destributins」から、「Create Destribution」をクリックする

  • 「Get Started」をクリックする

  • 下記画像を参考に、各情報を入力し(赤枠以外はデフォルトでOK)、一番下の「Create Destribution」をクリック

  • CloudFront管理コンソールの「Destributins」にアクセスし、Statusが「Deployed」、Stateが「Enable」となっていることを確認する

4. ブラウザからアクセス

  • ブラウザから下記のURLにアクセスする
"CloudfrontのDomainName"/"S3のファイル名"
  • アクセスできることを確認

ハマった点

  • 上記の手順通りやったのにアクセスできない!!!!

原因

Amazon S3 オリジンで Amazon CloudFront ディストリビューションを使用する場合、CloudFront はリクエストをデフォルトの S3 エンドポイント ( s3.amazonaws.com) に転送します。デフォルトの S3 エンドポイントは、us-east-1 リージョンにあります。バケットを作成後 24 時間以内に Amazon S3 にアクセスする必要がある場合は、このディストリビューションのオリジンドメイン名を変更します。ドメイン名には、バケットのリージョンのエンドポイントを含める必要があります。例えば、バケットが us-west-2 にある場合は、オリジンドメイン名を awsexamplebucketname.s3.amazonaws.com から awsexamplebucket.s3.us-west-2.amazonaws.com に変更することができます。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-http-307-response/

上記を要約すると、

  • デフォルトのS3エンドポイントは「us-east-1」にあり、CloudFrontディストリビューションもデフォルトでは「us-east-1」のS3を参照するため、他のリージョン[1]でS3バケットを作成した場合、リージョンの変更の伝播に時間がかかる。
  • 変更がus-east-1に反映されるまでしばらくアクセスできない減少が起きる。
  • しばらく待てばアクセスできるようになりますが、すぐにアクセスしたい場合、CloudFrontのOrigin Domain Nameを選択するときに下記のように書き換えるとアクセスができる。
"バケット名".s3-"リージョン名".amazonaws.com

入力例)
ashitest-s3-bucket.s3-ap-northeast-1.amazonaws.com

まとめ

  • S3+CloudFront連携は結構簡単に実装できる
  • リージョンサービスならではの仕様について理解しておかないとハマる

参考文献

https://dev.classmethod.jp/articles/sap-exam-study-1-2/

https://qiita.com/sakuraya/items/add2cb7ced954215fb03
脚注
  1. 今回はap-northeast-1で作成 ↩︎