S3についてざっくりまとめ

## S3とは?
AWSが提供するオンラインストレージサービス。

手動でファイルをアップロードしたり、アプリのファイルの保存場所として使うだけでなく、AWSクラウドの各サービスのバックアップやアーカイブの保存場所としても使われている。

## 他のストレージサービスと比較して
- 同時に複数ファイルを転送する際に性能が低下しにくい
- 1回のファイル転送時のレイテンシやスループットは性能的に突出しているわけではない

## S3を使う方法いろいろ
- AWS SDK
    - 公式ライブラリ。各プログラミング言語でS3にアクセスできる
- AWS CLI
    - Linuxから操作。S3の操作をバッチにしたりテンプレートにする時などに使う
- マネジメントコンソール
- サードパーティー製GUIツール
- サービス連携
    - 他のAWSサービスのログの保存場所になったりする

## ファイルがS3にアップロードされるまでの流れ
`ユーザー` → `S3のエンドポイント(ロードバランサー)`→ `APIサーバー` → `BLOBストレージ(ファイル本体の操作)` and `メタデータストレージ(メタデータの操作)`

## 結果整合性
S3は、複数の場所にデータを複製することで、サービスの可用性と信頼性を高めている。
オブジェクトの新規作成はすぐに反映されるが、更新と削除は反映されるまでに少し時間がかかる。
このため、あるユーザーの更新内容を別のユーザーがすぐに反映しなければならないアプリケーションには、S3は向いていない。

## 用語
#### バケット
- オブジェクトの保存場所。AWSアカウント内に複数作成できる
- バケット名は、必ずグローバルに一意（ユニーク）にする
- バケット名は、バケット内のオブジェクトにアクセスする際のURLの一部として、そのまま利用できる

#### オブジェクト
- バケットに保存されているファイル本体
- 1つのバケットに格納できるオブジェクト数は無制限、ファイルサイズは5TBまで

#### キー
- オブジェクトの識別子
- オブジェクト名は「バケット名＋キー＋バージョン」の組み合わせで、必ず一意になる

#### メタデータ
- オブジェクトに付属する属性情報。名前と値のセット
- 「システム定義メタデータ」と「ユーザー定義メタデータ」がある

### バケットのアクセス管理
**まずは`IAMポリシー`や`バケットポリシー`でアクセス許可を設定し、これらでカバーできない特殊なアクセス許可を`ACL`で行う**
#### IAMポリシー
- IAMユーザーやIAMロールに対して、アクセス許可とアクセス拒否を設定する
- JSON形式のポリシードキュメントで、アクセス許可と拒否の条件を細かく制御できる
- バケットやオブジェクトにアクセスしてくるクライアント側（ツールなど）に対して、IAMポリシーを設定する（クライアントはIAMユーザーとしてアクセスするため、ユーザーに設定されるIAMポリシーが有効になる）

#### バケットポリシー
- バケットやオブジェクトに対して、アクセス許可とアクセス拒否を設定する
- JSON形式のポリシードキュメントで、アクセス許可と拒否の条件を細かく制御できる
- クライアントからアクセスされるバケットやオブジェクトに対して、ポリシーを設定したい場合に設定する

#### ACL（AccessControlList）
自分以外のAWSアカウントに対して、許可／拒否などを設定できる一覧表

- バケットやオブジェクトに対して、アクセス許可を設定する
- AWSアカウントと定義済みのアクセス許可リストを用いて、ポリシーをシンプルに記述できる
- IAMポリシーは、IAMユーザーやIAMロールに対して複数のポリシードキュメントを設定できる
- バケットポリシーは、バケットに対して1つのポリシードキュメントしか設定できないので、細かい設定をしたい場合にはACLを使う

IAMポリシー・バケットポリシーはjsonで設定する

```json:サンプル
{
  "Version":"2012-10-17",
  "Id":"PolicyForCloudFrontPrivateContent",
  "Statement":[
    {
      "Sid":" Grant a CloudFront Origin Identity access to support private content",
      "Effect":"Allow",
      "Principal":{"CanonicalUser":"CloudFront Origin Identity Canonical User ID"},
      "Action":"s3:GetObject",
      "Resource":"arn:aws:s3:::examplebucket/*"
    }
  ]
}
```
`Action`: 許可または拒否したいアクション。ワイルドカード(`*`)も使える
`Effect`: Allow or Deny
`Resource`: ポリシーを適用したいバケットやオブジェクト。Amazonリソースネーム（ARN、AWSリソースを一意に識別するAWS共通の記法）を使って指定する。
`Principal`: 許可または拒否するプリンシパル(AWSアカウント、IAMユーザー、IAMロールなど)をARNで指定。
別に全部が必須ってわけじゃない。必要なものだけ記述。

#### ポリシーの優先順位
- デフォルト拒否
  - 何も設定がないと全てのアクセスが拒否される
- 許可は、デフォルト拒否よりも優先される
  - バケットポリシーまたはIAMポリシーのどちらかにアクセス許可の設定があれば、アクセスは許可される
- 明示的拒否は、許可よりも優先される
  - バケットポリシーとIAMポリシーのどちらかにアクセス拒否の設定があれば、アクセスは拒否される
- ポリシーの評価順序は、重要ではない
  - バケットポリシーとIAMポリシーをすべて評価したうえで、上の論理で判定される
- ポリシーによる拒否は、ACLによる許可より優先される
  - ACLによる許可を併用する場合でも、バケットポリシーとIAMポリシーの拒否は優先される

#### ブロックパブリックアクセス
S3には、アカウントレベルもしくはバケットレベルでバケットのパブリックアクセスを防止する「ブロックパブリックアクセス」という機能がある。
この機能を使うと、ACLやバケットポリシーでのアクセス設定にかかわらず、最優先でパブリックアクセスを禁止したり、パブリックアクセスの許可を設定できないように制御できる。
デフォルトでONになっているので、ACLやバケットポリシーを設定する時は、まずこれをOFFにする。
## 保管時のデータの暗号化
S3では、

- アップロードされたデータをデータセンター内のディスクに保存する直前に暗号化し、
- データのダウンロードがリクエストされた時、クライアントがダウンロードする前にデータを復号化

することができる。
上記の暗号化は、デフォルトの設定だと、クライアント側が暗号化をリクエストした時にしかされない。
`デフォルトの暗号化 > サーバー側の暗号化 > 有効にする`を設定すると、全てのファイルが暗号化される。

## webサイトのホスティング
静的サイトのホスティングはS3単体でもできる。
ただし

- DOS攻撃などにさらされるリスクがある
- S3のWebサイトホスティング機能はHTTPS通信をサポートしていない
- AWSアカウント全体のブロックパブリックアクセスを無効化しなければならない

ため、実際に単体でホスティングすることはまず無い。

実際は
`S3` + `CloudFront` + `Route53`でホスティングすることが多い。

## バージョニング
ファイルの変更をトラッキングして、変更前と変更後のファイルを別々のバージョンとして格納し、比較や復元ができる。
デフォルトはオフなので、使いたい時は自分で有効化する必要がある。
バージョニングを使うと、過去のバージョンのファイルも普通に1オブジェクトとして課金対象になる。

## ライフサイクル管理
「ライフサイクル管理」は、バケット内のオブジェクトに対し、定期的に行うアクションを自動化できる機能。

- バージョニングが有効化されているバケットのファイルは、最新バージョン以外のバージョンを1日経過後に削除する
- アプリケーションログなど参照期間が限られるファイルは、一定期間経過したら削除する
- アクセス頻度の低くなった古いファイルやドキュメントは、一定期間経過したら、より安価なストレージクラスに変更する
- アーカイブ目的で復元予定が低いデータは、定期的にGlacierにアーカイブする

など