コンテンツにスキップ

S3@AWSリソース

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. S3とは:Simple Storage Service

クラウドオブジェクトストレージとして働く。


02. セットアップ

コンソール画面の場合

設定項目 説明
バケット バケットに関して設定する。
バッチオペレーション
アクセスアナライザー


プロパティ

特にプロパティには、以下の項目がある。

設定項目 説明 補足
バージョニング ファイルのバージョン管理を行う。ファイルの変更や削除が行われた場合、過去の状態を履歴として残しておける。 もし旧バージョンにロールバックしたい場合、それより新バージョンのファイルを削除すると良い。バージョンが繰り上がり、旧バージョンのファイルが最新版になる。
サーバーアクセスのログ記録
静的サイトホスティング
オブジェクトレベルのログ記録
デフォルト暗号化 S3バケットに保管するファイルの暗号化方法を設定する。 オススメはサーバーサイド暗号化であり、S3バケットにファイルをアップロードするタイミングでこれを暗号化する。また一方で、ダウンロード時にファイルを復号化する。
https://zenn.dev/amarelo_n24/articles/3d252c27cfb98e
オブジェクトのロック
Transfer acceleration
イベント
リクエスタ支払い


リクエスト制限

特にリクエスト制限には、以下の項目がある。

設定項目 説明 補足
ブロックパブリックアクセス パブリックネットワークがS3にリクエストを送信する時の許否を設定する。 ・ブロックパブリックアクセスを無効にすると、項目ごとの方法 (ACL、バケットポリシー、アクセスポイントポリシー) によるアクセスが許可される。もし他のAWSリソースからのリクエストを許可する場合は、ブロックパブリックアクセスを無効化した上でバケットポリシーに許可対象を定義するか、あるいはブロックパブリックアクセスでは拒否できないIAMポリシーをAWSリソースに設定する。
・ブロックパブリックアクセスを全て有効にすると、パブリックネットワークからの全アクセスを遮断できる。
・特定のオブジェクトで、アクセスコントロールリストを制限した場合、そのオブジェクトだけはパブリックアクセスにならない。
バケットポリシー IAMユーザー (クロスアカウントも可) またはAWSリソースがS3へにリクエストを送信するためのポリシーで管理する。 ・IAMポリシーとアクセスコントロールリストの両方が設定されている場合には、IAMポリシーが勝つ。
https://dev.classmethod.jp/articles/s3-acl-wakewakame/
・ブロックパブリックアクセスを無効にしたうえで、IAMユーザー (クロスアカウントも可) やAWSリソースがS3にリクエストを送信するために必要である。ただし代わりとして、IAMポリシーをAWSリソースに紐付けることによりも、アクセスを許可できる。
https://awesome-linus.com/2020/02/04/s3-bucket-public-access/
・ポリシーを紐付けできないCloudFrontやALBなどでは、自身へのアクセスログを作成するために必須である。
アクセスコントロールリスト IAMユーザー (クロスアカウントも可) がS3にリクエストを送信する時の許否を設定する。 ・バケットポリシーと機能が重複する。
・IAMポリシーとアクセスコントロールリストの両方が設定されている場合には、IAMポリシーが勝つ。
https://dev.classmethod.jp/articles/s3-acl-wakewakame/
・仮にバケット自体のブロックパブリックアクセスを無効化したとしても、特定のオブジェクトでアクセスコントロールリストを制限した場合、そのオブジェクトだけはパブリックアクセスにならない。
CORSの設定


レスポンスヘッダー

▼ レスポンスヘッダーの設定

設定できるヘッダー 説明 補足
ETag コンテンツの一意な識別子。クライアントサイドキャッシュの検証に使用される。 全てのコンテンツにデフォルトで設定されている。
Cache-Control Expiresと同様に、ブラウザにおけるキャッシュの有効期限を設定する。 全てのコンテンツにデフォルトで設定されている。
Content-Type コンテンツのMIMEタイプを設定する。 全てのコンテンツにデフォルトで設定されている。
Expires Cache-Controlと同様に、ブラウザにおけるキャッシュの有効期限を設定する。ただし、Cache-Controlの方が優先度が高い。
Content-Disposition
Content-Encoding
x-amz-website-redirect-location コンテンツのリダイレクト先を設定する。


バケットポリシーの例

▼ S3のARNについて

ポリシーでは、S3のARでは、『arn:aws:s3:::<バケット名>/*』のように、最後にバックスラッシュアスタリスクが必要。

▼ ALBのアクセスログの保存を許可

パブリックアクセスが無効化されたS3に対して、ALBへのアクセスログを保存したい場合、バケットポリシーを設定する必要がある。

バケットポリシーには、ALBからS3へのログ書き込み認可スコープを実装する。『"AWS": "arn:aws:iam::582318560864:root"』では、582318560864はALBアカウントIDと呼ばれ、リージョンごとに値が決まっている。

これは、東京リージョンのアカウントIDである。

*実装例*

{
  "Version": "2012-10-17",
  "Statement":
    [
      {
        "Effect": "Allow",
        "Principal": {"AWS": "arn:aws:iam::582318560864:root"},
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::<バケット名>/*",
      },
    ],
}

▼ CloudFrontのファイル読み出しを許可

パブリックアクセスが無効化されたS3に対して、CloudFrontからのルーティングで静的ファイルを読み出したい場合、バケットポリシーでCloudFrontの識別情報を設定する必要がある。

補足として2022/08/31時点で、オリジンアクセスアイデンティティを識別情報として使用する方法は非推奨になり、オリジンアクセスコントロールが推奨になった。

*実装例*

{
  "Version": "2008-10-17",
  "Id": "PolicyForCloudFrontPrivateContent",
  "Statement":
    [
      {
        "Effect": "Allow",
        "Principal":
          {
            "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <オリジンアクセスアイデンティティのID番号>",
          },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::<バケット名>/*",
      },
    ],
}

▼ CloudFrontのアクセスログの保存を許可

執筆時点 (2020/10/08) では、パブリックアクセスが無効化されたS3に対して、CloudFrontへのアクセスログを保存できない。

よって、危険ではあるが、パブリックアクセスを有効化する必要がある。

# ポリシーは不要

▼ Lambdaからのリクエストを許可

バケットポリシーは不要である。

代わりとして、AWS管理ポリシーの『AWSLambdaExecute』が紐付けられたロールをLambdaに紐付ける必要がある。

このポリシーには、S3への認可スコープの他、CloudWatchログにログを作成するための認可スコープが設定されている。

{
  "Version": "2012-10-17",
  "Statement":
    [
      {
        "Effect": "Allow",
        "Action": ["logs:*"],
        "Resource": "arn:aws:logs:*:*:*",
      },
      {
        "Effect": "Allow",
        "Action": ["s3:GetObject", "s3:PutObject"],
        "Resource": "arn:aws:s3:::*",
      },
    ],
}

▼ 特定のIPアドレスからのリクエストを許可

パブリックネットワーク上の特定のIPアドレスからのリクエストを許可したい場合、そのIPアドレスをポリシーに設定する必要がある。

{
  "Version": "2012-10-17",
  "Id": "S3PolicyId1",
  "Statement":
    [
      {
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::<バケット名>/*",
        "Condition": {"IpAddress": {"aws:SourceIp": "*.*.*.*/32"}},
      },
    ],
}


CORS設定

▼ 指定したドメインからのGET送信を許可

[
  {
    "AllowedHeaders": ["Content-*"],
    "AllowedMethods": ["GET"],
    "AllowedOrigins": ["https://example.jp"],
    "ExposeHeaders": [],
    "MaxAgeSeconds": 3600,
  },
]


署名付きURL

▼ 署名付きURLとは

認証/認可情報をパラメーターに持つURLのこと。

S3では、署名付きURLを発行し、S3への認可スコープを外部のユーザーに一時的に付与する。