【AWS】【SAA対策】S3

# S3(Simple Storage Service)
## サービス概要
スケーラビリティ、データ可用性、セキュリティ、およびパフォーマンスを提供する、容量無制限のオブジェクトストレージサービス。
データを整理して、細かく調整されたアクセス制御を設定できる。
99.999999999% (9 x 11) の耐久性を実現するように設計。

## 特徴
- 複数のシステムにまたがる S3 オブジェクトをすべて自動的に作成して保存しており、99.999999999% (9 x 11) のデータ耐久性を実現するように設計。
- データアクセスレベルをサポートする S3 ストレージクラスにデータを保存することで、コスト削減。
- S3 ストレージクラス分析＝アクセスパターンに基づき、低コストのストレージクラスに移動する必要のあるデータを検出し、S3 ライフサイクルポリシーを設定して転送を実行。
- S3 Intelligent-Tiering＝アクセスパターンが変化するデータか、パターンが不明なデータを格納することもできる。これにより、オブジェクトはアクセスパターンの変化に応じて階層化されるため、コストは自動的に抑えられる。
- Block Public Access＝バケットレベルまたはアカウントレベルで、すべてのオブジェクトへのパブリックアクセスをブロックできる
- S3 Access Points＝共有データセットを使用するアプリケーションに個別のアクセス許可を付与できるため、データアクセスの管理が容易になる。
- Amazon Athena を使用して標準のSQL式でS3データを照会し、Amazon Redshift Spectrumを使用してAWSデータウェアハウスおよびS3リソース全体に格納されているデータを分析可能。
- データ転送による課金はS3からの送信のみで、アップロードなど受信は無料。*同一リージョン内通信はすべて無料。
- リクエスト数による課金は、GETとPUTは料金が発生する。（GET<PUT）。DELETEは無料。
- 署名付きURL
 - 署名付きURLの作成者がそのオブジェクトへのアクセス許可を持っている場合、署名付きURLを使用して、URL で識別されるオブジェクトにアクセスすることができる。
 - ユーザー/顧客が特定のオブジェクトをバケットにアップロードできるようにする必要があるが、AWS セキュリティ認証情報またはアクセス許可を持つことを求めない場合に有用。
 - 署名付き URL を作成するときは、セキュリティ認証情報を提供し、次にバケット名、オブジェクトキー、HTTP メソッド (オブジェクトのアップロードの PUT)、および有効期限の日時を指定する。
 - AWS SDK for Java または AWS SDK for .NET のプログラムを使用して、署名付き URL を生成可能。AWS Explorer を使用して、コードを記述せずに署名付きオブジェクト URL を生成することも可能。

## 種類やタイプ
#### ストレージクラス
|       ストレージクラス         |     データ格納料金      |   データ読み取りの即時性        |主な用途|ユースケース|
|:-----------------|:------------------|:-------------------|:-------------------|:-------------------|
| 標準            |  最初の50TB\$0.023/GB。次の450TB \$0.022/GB、500TB～ $0.021/GB |        即時        |アクセス頻度の高いデータ|コンテンツ配信、ビッグデータ分析など、幅広いユースケース|
| 標準-IA          |  $0.0125/GB |      即時       |アクセス頻度は低いが、必要時にすぐにアクセスが必要なデータの長期保存| データのバックアップ等|
| Intelligent-Tiering        | 高頻度層：標準と同様。低頻度:標準-IAと同様 |        即時        |アクセスパターンが予測不能または変化し、必要時にすぐにアクセスが必要なデータの長期保存|アクセスパターンが予測できないコンテンツ配信など|
|1ゾーン-IA      |  $0.01/GB |        即時        | 	アクセス頻度が低く、クリティカルではないデータの長期保存|サムネイル画像、データのセカンダリバックアップ等|
|Glacier        | $0.004/GB |        数分から数時間        |アクセス頻度が非常に低く、必要時にすぐにアクセスが基本不要なデータの長期保存|長期アーカイブ(緊急性の高いアクセスあり)|
|Glacier Deep Archive       |  $0.00099/GB |        12時間以内        |アクセス頻度が非常に低く、必要時にすぐにアクセスが不要なデータの長期保存|長期アーカイブ(緊急性の高いアクセスなし)|



## 類似サービスとの比較
|                  |   S3        |    EBS        |  EFS |Glacier|
|:-----------------|:------------------|:-------------------|:-------------------|:-------------------|
| 概要     | 	オブジェクトストレージ、安価で高信頼性のストレージ、インターネットからもアクセス可能|ブロックレベルのファイルストレージ、EC2のローカルストレージ|共有ファイルストレージ|低価格、長期保管ストレージ|
| 場所           | リージョン |       AZ      |リージョン|リージョン|
| 自動複製            |   複数AZ  |       AZ内3か所       |複数AZ||
| 暗号化            |  設定する必要あり。SSE-S3/KMS/C。  |  ボリューム作成時に暗号化。既存ボリュームの暗号化不可。（使用中ボリュームを暗号化＝スナップショットを取得し、新規に暗号化ボリュームを作成し、リストア。      |保管中、転送中のデータを暗号化。暗号化のキーはKMSにて管理可。|AES-256で自動で暗号化|

## ベストプラクティス
- S3バケットのクロスリージョンレプリケーションにより、リージョン全体に及ぶ大規模災害に対して、データを保護できる。（基本的にはリージョン外コピーはしない。）
- S3は大量ストレージ容量、コスト効率、拡張性、耐久性に優れている。
- オンプレミスでストレージが不足した際に、AWS Storage Gatewayを利用し、低レイテンシアクセスでS3と接続できる。
- クロスオリジンリソース共有（CORS）は別のドメインにあるリソースとの通信の設定。これを利用し、クライアントのウェブアプリケーションから別ドメインにあるS3リソースに対するアクセスを選択的に許可できる。
- S3の読み書きリクエスト性能の向上にはプレフィックスに日付順の名前を使用する。（以前のガイドラインではオブジェクトプレフィックスをランダム化し、各オブジェクト名の日付の前にハッシュキーをつける。）
- S3 API利用時のセキュリティ強化にはAPI認証情報を保存するのではなく、利用アプリケーションにIAMロールを割り当てる。
- S3バケットのオブジェクトを誤って削除しないように、MFA削除/バージョニング/IAMロールの有効化をすることができる。
- S3の暗号化には3つがある。
 - SSE-S3:デフォルト暗号化設定可。
 - SSE-KMS:デフォルト暗号化設定可。証跡管理可能。
 - SSE-C3:ユーザによる暗号化キー管理。独自のキー設定可能。
- S3のオブジェクトをライフサイクル全体にわたり、コスト効率よく保存するためには、S3バケットのライフサイクルポリシーを使用し、ファイルをGlacierに転送する。
- S3ストレージクラスの中で、即時に取り出せるが、煩雑なアクセスはなく、高可用性と費用対効果の高い要件を満たすのは標準-IA。1ゾーン-IAはさらに低コストだが、可用性の面で標準-IAに劣る。
- 署名付きURLは通常AWSへのアクセスを許可しない場合に、期間限定的にアクセス許可をする際に利用する。
- 標準-IAは低頻度アクセス用だが、すぐに読み込みが可能かつ安価なため、重要なデータの保存にも適している。
- S3バケットのイベント機能を利用することで、Lambda関数と連携が可能となる。(ex.S3バケットにファイルがアップロードされたらイベント通知が発行され、Lambda関数を呼び出し、DynamoDBへデータ書き込み等)
- 読み/書きトラフィックに対して、アクセスパフォーマンスを最大化する際、以前はプレフィックスの文字列をランダムにするといった対策があったが、現在はデフォルトの設定のままで問題はない。
- Glacierのデータ最低保持期間は90日間のため、30日だけの保管の場合やかつ低頻度アクセスといった場合、GlacierよりS3 標準-IAのほうがコスト効率は良い。


## 参考例
## 用語
- PUTメソッド：リソースの更新、リソースの作成
- GETメソッド：リソースの取得
- DELETEメソッド：リソースの削除