AWSソリューションアーキテクトへの道　-Amazon S3のポイントまとめ-

勉強用メモ。

# Amazon S3まとめ


## 概要
安価かつ高い耐久性を持つオンラインストレージサービス
ピーク時は秒間150万アクセス。

- 容量無制限
- インフラ、電源気にしないでOK
- 保存するデータは自動で暗号化することも可能
- 高い耐久性（99.999999999%）
- 安価な従課金（例：1GB/月）

### データ転送
全てのデータ転送（ＩＮ）は課金されない
データ転送（ＯＵＴ）に課金される。使う容量が増えれば増えるだけ価格はディスカウントされる。
ＡＷＳリージョン間データ転送またはCloudFrontでのデータ転送は$0.090/GB


## 特徴
- 高いスケーラビリティ
- 高い信頼性、堅牢性
- セキュア
- 高速
- 低価格


## 主な用途
- コンテンツの保存と配信
- 大規模データ分析のストレージ・データオリジナル
- バックアップ、ディザスタリカバリ

## 用語
- バケット  
　オブジェクトの保存場所。各アカウントで最大100個まで。名前がユニークな必要有り。
- オブジェクト  
　AmazonS3 に置くファイルでURLが付与される。バケット内には、無制限にオブジェクトを置くことが可能。1オブジェクトのサイズは5TBまで。
- キー  
　オブジェクト毎に付与されるユニークなキー
- ACL（アクセスコントロールリスト）  
　バケットとオブジェクトへのアクセスを管理できる。


## 使い方
- ファイルのPUT/GET/DELETE/LIST
- サードパーティツールでFTPライクに利用
- SDKで様々な言語から利用可能


## Amazon S3の機能
- マルチパートアップロード
　巨大なオブジェクトを複数のチャンク（ある程度のまとまり）に分割してアップロード
　各チャンクは5GB以下
　チャンクがアップロードされたら単一オブジェクトに結合

- Webサイト機能
　静的なWebサイトのホスティングをS3で実現。ファイルをアップロードしてWebサイト機能を有効にするだけ。
　データが消える心配なし
　スケールするWebサーバが構築の必要なくすぐ使える
　可用性も非常に高くWebサーバのマネージなど必要ない


- バージョニング
　ユーザーによる誤操作による削除防止に有効
　オブジェクトをバージョン管理下に置く
　　保存、検索、リストアが可能。バージョニング中はオブジェクトは削除されない
　　課金はバージョニング分かかる


- サーバアクセスログ
　AmazonS3バケットへのアクセスログを保存。デフォルトでは出力しない
　API/SDKで設定可能
　アクセスログのデリバリでは課金なし。アクセスログの保存で課金。ただしいつでも削除可能。
　アクセスログへのアクセスについては若干の課金あり。


- S3セキュリティ機能
　AmazonS3の認証機構
　認証のないアクセスからはデータは確実に保護
　オブジェクトは全てフルコントロール可能
　特定ユーザーに対して権限を与えることももちろん可能

AWS Identity and Access Management (IAM)
　アカウント内で複数ユーザーを作成し、セキュリティクレデンシャルや権限を付与することが可能
　IAMはIAMユーザーレベルでのコントロールが可能
　アクセスポリシー言語を記述可能

AmazonS3バケットポリシー
　AmazonS3バケットレベルのポリシーベースコントロール
　バケットオーナーだけが適用可能
　　バケットレベルでのAllow/Deny
　　バケット内のオブジェクトの権限のDeny
　　バケットオーナーがオブジェクトオーナーだった場合のみオブジェクトに適切な権限を与える
　アクセスポリシー言語を記述可能
　　JSON　Format

AmazonS3 Access Control List
　バケットからオブジェクトへのコントロール
　バケットのACLをオブジェクトは継承しない
　ACLは100個作成可能
　　Owner
　　Email
　　Any AWS account
　　Anyone
　パーミッション
　　READ
　　WRITE
　　READ_ACP
　　WRITE_ACP
　　FULL_CONTROL


- データの暗号化  
サーバサイド暗号化  
　マネージメントコンソールから実行する  
　GUIツールで実施する  
　コードで実施する

　クライアントサイド暗号化
　　GUIツールで実施する
　　コードで実施する


- オブジェクトの期限付き保存
　バケット単位でオブジェクトの生存期間を指定可能
　Prefix単位
　期間・日付で指定可能

- CORS対応
　CORS（Cross Origin Resource Sharing）
　クロスドメインでリソースの取得が可能
　より簡単にリソースの共有が可能


- Webページリダイレクト
　リダイレクトルールを渡して条件を満たす場合のみリダイレクト



- S3-Glacier連携機能
Amazon Glacier ・・・ きわめて低コストのストレージサービス。ストレージのセキュリティ、耐久性、柔軟性を特徴としており、
データのバックアップやアーカイブに最適。Amazon Glacier では、1か月あたり 0.01 USD/GBという低額で安心してデータを保管可能。
Amazon Glacier を利用すると、ストレージの運用と規模拡大/縮小に伴う管理作業を AWS に任せることができるので、
容量計画、ハードウェア準備、データレプリケーション、ハードウェア障害の検出と修復、時間のかかるハードウェア移行を解決。

　S3に格納されたファイルを自動的にGlacierに退避
　AWSで安価な階層化ストレージを実現
　ルールベースで一定期間経過したS3上のファイルを自動的にGlacier退避
　インデックス情報はS3で管理
　簡単な操作でGlacierに退避されたファイルをS3上に取り出し可能（3-5時間）
　Glacierに退避されると格納コストが1/10



## 上手く利用するポイント
- パフォーマンス  
　ネーミングルールが大事  
　先頭部分にランダム文字列を入れる  
　オブジェクトをハッシュ名にする  
　エポック秒のリバースを追加する  
　ランダム文字列はLISTと相性が悪い  
　LISTしたい=グルーピングしたい形で保存

　大量のPUTをする場合は、エラーコードに注意
　503が帰ってきたらクライアント側でも送信側でも少し軽減する（エクスポネンシャルバックオフ）

　できるだけマルチパートアップロード推奨
　AWSCLIなど最近のツールでは自動的にマルチパートアップロードに切り替わります
　各SDKにもマルチパートアップロード機能ついております
　マルチパートアップロードでのサイズ設定はバランスの見極めが大事
　小さいチャンクサイズでの大量アップロードはコネクションオーバーヘッドで利点が損なわれる
　巨大すぎるファイルサイズでもマルチパートアップロードの利点とならない
　帯域が太い場合は25-50MBチャンクくらいを最初の設定値とする
　モバイルやより帯域に懸念がある場合、10MB程度を最初の設定値とする

レンジGETによるGETの高速化
　レンジGETを利用すれば、マルチスレッド環境ではより高速にダウンロード可能
　CloudFrontはレンジGETをサポート
　マルチパートでのアップロード時と同じチャンクサイズを利用する

マルチパートアップロードでのHTTPS利用時
　ファイルの暗号化はCPUに負荷がかかるためCPUインテンシブ
　AmazonS3では、AES-256を推奨。デフォルトも同じ値
　Intel AES-NIハードウェアを利用すれば暗号化パフォーマンス向上が見込める




## AmazonS３を通じて実現したいこと
- お客様がデータを安心して預けられるサービスの提供

　　　AmazonS3上のデータは常に安全に保管
　　　AmazonS3内データはいつでも取得可能
　　　AmazonS3内データを常に保存可能
　　　AmazonS3内へのデータアクセスは完璧にコントロールできる
　　　データ保存が低価格で実現できる  


  



参考資料：
http://aws.amazon.com/jp/documentation/
http://adsj-contents.s3.amazonaws.com/meister-blackbelt/AWS_BlackBeltTechWebinar2014-S3-public.pdf