Amazon S3

#Amazon S3（Amazon Simple Storage Service）とは?

**「S3はユーザがデータを安全に、容量制限なく、データ保存が可能な、オブジェクトストレージ」**


#利用シーン
過去のデータをS3に退避させる、加工する、別のデータストアにロードする、直接PUT/GETするなど

#Amazon S3の特徴
・容量無制限：1ファイル**最大５TB**
・高い耐久性：**99.999999999%**
・安価なストレージ：容量単価 **月額1GB/約3円**
・**スケーラブル**で安定した性能

#Amazon S3の用語
バケット：オブジェクトの保存場所、各AWSアカウントにでデフォルト**100個**まで作成可能、名前は**一意**である必要あり。
オブジェクト：データ本体、S3に格納されるファイルでURLが付与される。オブジェクト数は**無制限**。１オブジェクトサイズは**0から5TB**
キー：オブジェクトの格納URLパス
メタデータ：オブジェクトに付随する属性の情報
リージョン：バケットを配属するAWSのリージョン

#Data Consistency モデル
S3は高い可用性を実現するため、データの更新・削除には**Eventual Consistency Readモデル(結果整合性)**が採用されている。
なので、更新・削除の際は削除前のデータが参照される可能性がある。
読み込みの待ち時間が減るのがメリット

#ストレージクラス
**①STANDARD**：複数のAZにデータを複製。デフォルト
**②STANDARD-IA(標準低頻度アクセスストレージ)**：格納コスト安価。いつでもアクセス可能だが、データの読み出し容量に対して課金
**③INTELLIGENT_TIERING**：アクセス頻度の高いオブジェクトと低いオブジェクトを自動的に最適化するストレージクラス
**④ONEZONE_IA**：Single AZにデータを格納、可用性は低い
**⑤S3 Glacier(アーカイブ)**：低コストだが、データの取り出しにコストと時間を要する。
**⑥S3 Glacier Deep Archive**：最も低コストなコールドストレージ。取り出しには半日から2-3日かかる
**⑦低冗長化ストレージ(RRS)**：RRSはGlacierから取り出したデータの置き場所として利用

#アクセス管理
細かいバケットもしくわオブジェクトへのアクセス権の設定

**ユーザポリシー**
・IAM ユーザに対して,S3やバケットへのアクセス権限を設定
・AWSでこのユーザは何ができるか設定

**バケットポリシー**
・S3バケット毎にアクセス権限を指定
・クロスアカウントでのS3バケットアクセス権を付与する場合など。
・このS3リソースには誰がアクセスできるか設定

**ACL**
・各バケットおよびオブジェクトのアクセス権限を設定
・バケット単位ACLとオブジェクト単位のACLが存在
・ACLよりもユーザポリシーやバケットポリシーが優先される

アクセスの流れ
ユーザー→認証→リクエスト→認可→アクション→リソース

#Amazon S3 Block Public Access
**「アカウントレベル、もしくはバケットレベルであらかじめ意図せずバケットがパブリックアクセスになるのを防ぐ」**

**①BlockPublicAcls**：パブリックなACL設定、パブリックなオブジェクトのアップロードをさせない
**②IgnorePublicAcls**：パブリックなACL設定をしていても、それを無力化する
**③BlockPublicPolicy**：パブリックなバケットポリシーの設定をさせない
**④RestricPublicBuckets**：パブリックなバケットポリシーを持つバケットに対して、パブリックなアクセス、クロスアカウントでのアクセスを無力化する

#VPC　エンドポイント
**「プライベートサブネット内で稼働するサービスのため、NAT Gateway経由せずに直接S3と通信可能」**
・同一リージョンのみ、通信したいサブネットのルートテーブルに追加

#Pre-signed Object URL(署名付きURL)
**「AWS SDKを利用して生成される、署名されたURLを利用し、S3上のプライベートなオブジェクトに対して一定時間のアクセスを許可」**
・GETとPUTオペレーションで利用可能
・URLを生成したIAMユーザ/ロールの権限が用いられる
・バケット名、オブジェクトキー、HTTPメソッド、Expire時間を指定する

#Webサイトホスティング
静的なWebサイトをS3のみでホスティング可能

#暗号化によるデータ保護
**サーバーサイド暗号化**
・格納データの暗号化処理実施
・暗号化の種類
　**①SSE-S3**：AWSが管理する鍵を利用して暗号化
　**②SSE-KMS**：KMSの鍵を利用して暗号化
　**③SSE-C**：ユーザが提供した鍵を利用して暗号化
・デフォルト暗号化は暗号化を強制

**クライアントサイドの暗号化**
・暗号化プロセスはユーザ管理
・クライアントで暗号化したデータをS3にアップロード
・暗号化種類
　**①KMSで管理されたカスタマキーを利用して暗号化**
　**②クライアントが管理するマスターキーを利用して暗号化**

#バージョン管理機能
・誤操作による削除対策に有効
・バケットに対して設定
・同じキー名でアップロードすると前のバージョンが残る
・バージョニングにより保管されているオブジェクト分も課金
・ライフサイクルと連携し保存期間も指定可能
・削除した場合、古いバージョンのオブジェクトも削除する

#S3 Object Lock(WORM機能)
**「WORMモデルでのオブジェクト保存を提供する。そのオブジェクトに対する一定期間の上書き、または削除ができないようにする。」**
・Object Lockの有効化をバケット単位で設定
・保護モード及び、保持期間ハナケット単位、またはオブジェクト格納時に明示指定する
・保持期間とは、削除できない状態の有効な期間
 2種類の保護モードがある
**①コンプライアンスモード**
rootアカウントでも削除できない
**②ガバナンスモード**
特別な権限でWORM保護されたオブジェクトの削除が可能

#クロスリージョンレプリケーション
**「異なるリージョン間のS3バケットオブジェクトのレプリケーションを実施」**
・バケットに対するオブジェクトの作成、更新、削除をトリガーに非同期でレプリケーション実施
・対象元のバケットはバージョニングの機能を有効にする必要あり
・レプリケーション、レプリケーション先でのストレージクラスの指定の必要あり

#ライフサイクル管理
**「バケット内のオブジェクトに対して、ストレージクラスの変更や、削除処理自動化」**
・バケット全体もしくはPrefixに対して、オブジェクトの更新日をベースに日単位で指定が可能
・ライフサイクルを利用してIAに移動できるのは**128KB以上**のオブジェクトのみでそれ以外はIAに移動されない
・MFA deleteが有効なバケットにはライフサイクル設定不可

#S3 Glicierへのアーカイブと復元
**アーカイブ**
・オブジェクトのデータはS3 Glacierに移動
・オブジェクトを直接S3 Glacierに直接PUT可能
・S3のデータ削除することで、S3 Glacier側のデータも削除される
・S3にはオブジェクト名とメタデータのみが保管

**オブジェクトの復元**
・オブジェクト毎に復元
・復元後の3上での保持期間の変更も可能
・復元にかかる時間について、３種類から選択可能
　**①Expedited**：少数のファイルについて、緊急のアクセスを要する場合に取得
　**②Standard**：3-5時間の間にファイルを取得
　**③Bulk**：5-12時間の間にファイルを取得する最も低価格で、大量のデータを取得

#S3 Analytics
**「STANDARD-IAとS3 Glacierどちらにいつ移動すればいいのかを解決するために、データのアクセスパターンを可視化」**
・目的のバケットに対して、分析フィルターを定義
・結果が出るまで、フィルター作成してから24〜48時間ほど待つ
・青が格納量、紫がどれだけそのデータが読まれたかを示す

#S3 インベントリ
**「S3に入っているオブジェクトのリストを、一気にCSVまたはORCファイルで取得する」**

#S3 バッチオペレーション
**「数千、数百万個、数十億のオブジェクトに対するAPIアクションを一括実行」**

#S3 イベント通知
**「バケットにてイベントが発生した際に、Amazon SNS、SQS、Lambdaに対して通知することでシームレスなシステム連携が可能」**
・S3からの実行権限の付与
　①SNS及びSQSはそれぞれのポリシーに対してS3からの実行権限を付与
　②Lambdaに関しては、Lambdaが利用するIAM RoleにS3の権限を付与
・イベントでの通知内容
　**①共通情報(リージョン、タイムスタンプなど)
　②リクエスト情報(Request ID、Request Souece IDなど)
　③バケット情報(バケット名、バケットARNなど)
　④オブジェクト情報(オブジェクトキー、オブジェクトサイズなど)**

#Amazon CloudWatchによるメトリクス管理
バケットに対するストレージメトリクスは**日単位**
オブジェクトに対するリクエストメトリクスは**分単位**

#パフォーマンス最適化
・大きなサイズのファイルを快適に、ダウンロード、アップロード
・**目安100MB**のファイルのアップロードを快適にしたい場合マルチパートアップロード機能
・S3にアップロードする際に、ファイルを複数のチャンクに分割して並列アップロードを実施

#S3Transfer Acceleration
・AWSのマネージドバックボーンネットワークを活用した高速ファイル転送手法
・全世界に149箇所あるAWSのエッジネットワークから、最適化されたAWSのネットワーク経由して、高速にAmazon S3とのデータ転送を実現
・S3 バケットに対してAccelerationを有効化

#S3 Select
・S3に格納されているオブジェクトに対して、SQL式似て、一部分のみを抽出できる
・アプリケーションが、S3 Selectを利用して、オブジェクトの一部分のみを取得する
　①Input：フォーマットはCSV、JSON,、圧縮、暗号化
　②Output：CSV、JSON
　③SDK：Java、Python、Ruby、Go、NET、JavaScript