AWSを理解する[S3編]


概要

はじめに、この記事はAWS初学者が備忘録として作成しています。
ですが、私のような初学者のために少しでもなればと思い、公開しています。
不適切や、わかりにくい点を見つけた場合はご指摘頂ければ幸いです。

  1. ネットワークを構築する
  2. webサーバーソフトをインストールする
  3. webサーバーにWordPressをインストールする
  4. 通信の仕組みを理解する
  5. S3を使って公開する👈今ここ

S3を使って公開する際の要点

  1. S3バケットを作成する
  2. Static Website hosting機能を有効にする
  3. 匿名アクセスできるようにする(バケットポリシーの設定)
  4. 公開したいファイルをアップロードする

Static Website hosting機能についての補足

S3バケットにアクセスするときのURLのことをエンドポイントという
デフォルトではアクセス権限が付与されたユーザーしかwebサーバーとしてのS3にアクセスできないので、アクセスするにはパケットポリシーの設定を変更して、匿名アクセスできるようにする必要がある。

インデックスドキュメントとエラードキュメントを設定する

インデックスドキュメント: https://S3バケット名/や、http://S3バケット名/フォルダ名/フォルダ名/などのように、/で終わるURLを指定した時に返すファイルのこと

エラードキュメント: 指定したファイルが存在しないなど、何かしらのエラーが発生したときに返すページを構成するファイルです。(エラードキュメントの機能を使わない時でもこの機能は必須で、error.htmlを指定する)

リダイレクトルール: 特定のURLが指定された時に、別のURLにリダイレクトするための設定

リダイレクトルールの補足

コンテンツの一部が別のサーバーにある時に使う設定です。代表的な使い方は、S3とは別にプログラムを実行可能なWebサーバー(例えば、Apacheやnginxなどをインストールしたサーバー(EC2など))を構築しておき、/cgi-bin/などのURLパスが入力された時に、そちらにリダイレクトするという運用
リダイレクトルールを設定することで、ファイルの配信はS3、プログラムの実行は別のサーバーというような構成ができる。
また、リダイレクトではHTTPのステータスコードによってリダイレクトすることもできるので、ファイルが見つからないエラーが発生したときは、特定のページにリダイレクトという設定にもできる。

カスタムポリシーの設定

S3の既存のポリシーでは匿名アクセスを許可することはできないため、カスタムポリシーを設定する必要がある。
そのためにはまず、S3のアクセス許可から下記の項目のチェックを外す。

任意のパブリックバケットポリシーまたはアクセスポイントポリシーを介したバケットとオブジェクトへのパブリックアクセスとクロスアカウントアクセスをブロックする

カスタムポリシーはJSON形式のデータとして構成しなければならないが、全ユーザーに読み取り権限を与えるポリシーに限っては、設定用JSON形式データがAWSのドキュメント(下記のJSON)として公開されているので、バケット名を変更する必要がある

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": ["s3:GetObject"],
      "Resource": ["arn:aws:s3:::example-bucket/*"]
    }
  ]
}
  • Version: この設定構成のバージョン番号です。指定された通りの値を、そのまま使います(設定項目が改定されて、新しい項目が追加されたり、設定の書き方が変わったりするときは、このバージョン番号が変わる)
  • Sid: このポリシーの名称です。任意の名称
  • EffetctとPrincipal: Effectは許諾の種類、principalは誰に対するのか指定します。ここで指定されているAllowは許可、*は全ユーザーを示します。つまり、全ユーザーに対して許可という意味になります。
  • ActionとResource: Actionはどんな操作か、Resourceは何に対してかを指定します。Actionで指定されているs3:Getobjectは読み取りの操作を示している。Resourceで指定している*arn:aws:s3:::example-bucket/*'は、その対象です。

are:aws:s3:リージョン:アカウント:バケット名/パス名

「:」と書かれて何も書かれていない場所は指定しないという意味です。
また「*」は全てを意味します。つまり、この例では、リージョン、アカウントにかかわらず、example-bucketという名前のS3バケットの全てのパス(*)に対する操作をいう意味になります。

tips

独自ドメイン名でのアクセスや暗号化通信も見据えたWebサーバーの構成図

  • 独自ドメインを使用したい場合はS3のバケット名をwww.example.co.jpなどにした上でDNSサーバーの設定をする(S3のバケット名は後から変更できない)
  • S3バケットのWeb機能は暗号化に対応していなく、暗号化したい場合はS3の前段に適切に設定したCloudFrontを設置することで対応可能(https://でアクセスが可能になる)

  • CloudFront: コンテンツのキャッシュ機能を提供するサービス(暗号化の機能がある)