Amazon S3

##1.Amazon Simple Storage Service (S3)とは？##
容量無制限のオブジェクトストレージサービスです。



##2.特徴##

- データの保管、バックアップなどの用途に適している。
- httpsによるアクセスでデータの格納、参照、削除を行います。
- 自動的に三箇所以上のデータセンター(リージョン)に隔地保管されます。そのため、万が一AZが失われた場合でも、ファイルは適切な場所にあり、アクセス可能な高可用性に優れています。
- 耐久性は99.9%です。
- バケット内のオブジェクト数は無制限。1オブジェクトのサイズは5TB,1つのPUTでアップロード可能なサイズは5GMまで。 
- S3はNFSとしてマウントできません。（EFSを使いましょう。）
- 整合性モデルを採用している。S3でオブジェクトが更新されると、それらは結果整合性モデルとなります。 したがって、オブジェクトの更新が同じキーに対して行われると、次の読み取り要求が行われたときに更新されたオブジェクトがユーザーに返されるときにわずかな遅延が生じる可能性があります。
- １度にアップロードできる最大サイズは5GB。ただし、マルチパートアップロードをすることができる。
- １ファイルで保存可能な最大サイズは5TB。


参考：[AWS Black Belt Online Seminar 2017 Amazon S3](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-amazon-s3)



##3.ストレージクラス##

|ストレージクラス|用途|
|---|---|
|スタンダード|頻繁にアクセスされるデータ|
|インテリジェントな階層化|アクセスパターンが変化したり未知である、存続時間が長いデータ|
|標準 - IA|存続時間の長い、あまり頻繁にアクセスされないデータ|
|1 ゾーン -IA|存続時間の長い、あまり頻繁にアクセスされない非クリティカルなデータ|
|Glacier|数分から数時間の範囲で取り出したデータアーカイブの長期化|
|Glacier Deep Archive|データアーカイブの長期化 (取り出し時間は 12 時間以内)|
|低冗長化|アクセス頻度の高い、非クリティカルなデータ|

詳細な違いは [Amazon S3 Storage Classes](https://aws.amazon.com/jp/s3/storage-classes/) のサイトにある表を見てみましょう。

[Amazon S3 の低冗長化ストレージ](https://dev.classmethod.jp/cloud/amazon-s3-rrs/)についても見ていきましょう。
重要度が高くないデータを保管する場合に使います。
例えば、ユーザーはイメージを1回画像をダウンロードすると、その後再び画像をダウンロードすることはめったにない場合に、
RRSに保存して、ライフサイクルポリシーで24時間後に削除するとか。
しかし、RRSの利用はコストを抑えることはできるが、推奨はされていない。

**Glacier Deep Archive**
2018年11月に新しくリリースされた。
Glacier よりもコストが低く、全てのストレージクラスで最も低コスト。
最小保存期間は180日で、最低180日よりも前にオブジェクトを削除した場合、180日分課金される。
復元オプションの標準取り出しで12時間以内、一括取得で48時間以内待つ必要がある。
詳しくは⬇︎のページが参考になる。
[[新機能]S3で新しいストレージクラス Glacier Deep Archive が使えるようになりました](https://dev.classmethod.jp/cloud/aws/s3-deep-archive/)


##4.アクセス方法##
以下の通り3通りあります。

- AWS マネージメントコンソール
- AWS CLI (コマンド)
- AWS SDK (プログラム)



##5.用語##

- オブジェク:格納するデータとのこと
- バケット:管理単位
- キー：アクセスする　オブジェクトの格納URLパス

キーでアクセスして　→ オブジェクトをバケットに保管するイメージです。



##6.使用例##

- 静的コンテンツの配信
![スクリーンショット 2019-03-03 19.21.10.png](https://qiita-image-store.s3.amazonaws.com/0/280929/7d15c423-45dc-7106-6af0-17c3ccc40e96.png)

- ログなどのエクスポート先
![スクリーンショット 2019-03-03 19.23.07.png](https://qiita-image-store.s3.amazonaws.com/0/280929/c8e47ce1-da31-20a7-ff36-37e1085d1bfa.png)

- バッチ連携用のファイル置き場
![スクリーンショット 2019-03-03 19.24.13.png](https://qiita-image-store.s3.amazonaws.com/0/280929/26a9dab1-ca17-8226-e53f-993957b15ae8.png)

- 静的Webホスティング
![スクリーンショット 2019-03-03 19.25.16.png](https://qiita-image-store.s3.amazonaws.com/0/280929/ed02c48f-1f80-f9eb-b1b5-bb7344286b44.png)



##7.料金##
お預かりした分のみの従量課金がされます。

3つの観点から計算されていきます。

- ストレージクラスによって基本的に料金がが定まってきます。
- S3バケットに保存されたオブジェクトの数とサイズ。
- S3のオブジェクトに発生するリクエストの数、タイプ(GETとかPUT...)が料金の発生するする根拠になります。
- S3リージョンから送信されるデータ量。





##8.バージョニング##
同じバケット内でオブジェクトの複数のバリアントを保持する手段です。
バージョニングが有効なバケットでは、オブジェクトを誤って削除または上書きしても復元できます。
利用する上で重要ではあるが、課金額は２倍になるので注意！

参考：[バージョニングの使用](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Versioning.html)



##9.ライフサイクルポリシー##
別のストレージクラスにオブジェクトを移行するタイミングを定義します。
たとえば、作成後 30 日目に STANDARD_IA ストレージクラスにオブジェクトを移行し、作成後 1 年目に GLACIER ストレージクラスにオブジェクトをアーカイブするよう選択することができます。

＊Amazon Glacier
リアルタイムのアクセスが不要（取り出し・復元に3-5時間かかってもよい）な場合は、Amazon Glacierも検討する。
Amazon Glacierは低コストのアーカイブサービスであり、低頻度アクセスのデータに最適です。
S3はバケットの中にファイル単位で大量のデータを保存し、必要があればすぐにデータを取り出すことができますが、Glacierはアップロードこそ高速かつ簡単におこなうことができるものの、ダウンロードには時間がかかります。
参考：[オブジェクトのライフサイクル管理](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/object-lifecycle-mgmt.html)

[Amazon Glacier ハンズオン](https://qiita.com/leomaro7/items/8f7a2b4043c79adc24dc) でも触ってみました。

なお、Glacier→s3に復元するには以下の方法を使用します。
[AWS CLI を使用して Amazon Glacier ストレージクラスから S3 オブジェクトを復元する方法を教えてください。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/restore-s3-object-glacier-storage-class/)

S3とGlacierの比較のまとめ

||s3|Glacier|
|---|---|---|
|データ量|無制限|無制限|
|レイテンシー|頻繁にアクセス|長期保存|
|オブジェクト最大サイズ|5TB|40TB|
|アクセスコスト|高|低|
|リクエスト|PUT COPY POST LIST GET|アップロード　取り出し|
|取り出しコスト|低|高|
|暗号化|サーバ側の暗号化を開始する必要がある|デフォルトで暗号化|


**設定**
1.名前スコープ
ルール名 と プレフィックス/タグのみを対象にするか設定できます。	
![スクリーンショット 2019-05-03 14.16.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/0a5fb414-19d1-b59d-7e6a-42012db5b01e.png)

2.移行
何日経過したら移行するといったルールを設定します。
現行バージョン（最新のバージョン）もしくは以前のバージョン（現行以外の過去のバージョン）を指定できます。
![スクリーンショット 2019-05-03 14.22.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/00e98256-d8f6-1133-bfd5-fc388e911e36.png)

3.有効期限
時間が経過したら削除するといった設定です。
現行バージョンは失効して、前のバージョンに戻る、
以前のバージョンは完全に削除されるといったことになります。
![スクリーンショット 2019-05-03 14.29.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/e8c2036e-4e77-0f91-9c92-05be43db046b.png)


4.確認

##10.クロスリージョンレプリケーション##

- あるリージョンのS3バケットに保存したデータが、別のS3リージョンに自動的にレプリケートされるように設定できます。
- 別アカウントへレプリケーションすることも可能です。
- レプリケーションを設定した後のオブジェクトのみレプリケートされます。（レプリケーションを設定する以前のものはレプリケートされません。）

ドキュメント：[クロスリージョンレプリケーション](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/crr.html)
やってみた系：[クロスリージョンレプリケーション - S3](https://qiita.com/leomaro7/items/5df379375cd3325ab299)

##11.リンク・その他##

[AWS S3デフォルト暗号化をやってみた](https://qiita.com/leomaro7/items/ac2263f07a3635bd6359)
[S3のプロパティの活用](https://qiita.com/leomaro7/items/77a1080aca5baeaeca5b)

**Amazon Macie**
Amazon Macie は、機械学習によって AWS 内の機密データを自動的に検出、分類、保護するセキュリティサービスです。
Amazon S3 に保存されたデータを保護するために Amazon Macie を利用できるようになった。
参考：[S3 用 Amazon Macie のご紹介](https://aws.amazon.com/jp/about-aws/whats-new/2017/08/introducing-amazon-macie/)


##12. S3のセキュリティ##

- バケットポリシー：S3バケットに対するアクセス権限を設定できる。

[ポリシージェネレーター](https://awspolicygen.s3.amazonaws.com/policygen.html)を使えば簡単に作成することができる。

- 暗号化
大きく分けて2つあります。

 - クライアントサイド暗号化（ユーザー側）:AWS側で不正に暗号化が行われていないかセキュアになりますが、鍵の管理やプログラムが複雑になり、手間がかかります。データをクライアントサイドで暗号化し、暗号化されたデータをAmazon S3にアップロードできます。この場合は、暗号化プロセス、暗号化キー、および関連ツールを管理します。
 - サーバーサイド暗号化（AWS側）:プログラム上での暗号化、復号化の処理が不要となり、手間がかかりません。オブジェクトをデータセンターのディスクに保存する前にAmazon S3で暗号化し、オブジェクトをダウンロードするときに復号化するように要求します。

- ロギング
ログを残し、そのログが改ざんされていないか保証することも重要です。
Cloud Trailに記録することで実現可能ですが、S3でGet/Putを行うような使い方をしている場合、ログの量が多くなるため、課金も多くなります。
そのため、何を守りたいのか用途に合わせて、適切に記録させることが重要です。

- セキュアなファイルを配置する際のアクセス方法
S3にアクセスできる人、システムを絞ることが重要です。

 - S3のパブリックアクセスを可にし、誰からでもアクセス可能にする。
 - S3にアクセス権限が付与されたIAMユーザーのアクセスキー、シークレットキーをEC2に配置し、S3にアクセスする。
 - S3にアクセス権限が付与されたIAMロールをEC2に付与し、S3にアクセスする。

3つ目が推奨される使い方です。


##13. パフォーマンスの向上##
要求率が高い場合は、オブジェクト名の前にハッシュキーまたはランダムな文字列を使用できます。 
そのような場合、オブジェクトを格納するために使用されるパーティションはより良く分散され、オブジェクトに対するい読み書き性能を向上させることができます。。
[ワークロードが急増したときに S3 バケットのパフォーマンスを向上させるには、どうすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-bucket-performance-improve/)

※現在は、パフォーマンスを向上させるためにプレフィックスの命名をランダム化する必要はなくなり、プレフィックスに日付順の名前を使用できるようになりました。
[ベストプラクティスの設計パターン: Amazon S3 パフォーマンスの最適化](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/optimizing-performance.html)


##14. S3で有効期限付きの署名付きURLを作成する##

以下は、署名付きURLが発行され、600秒、アクセス可能となる。

```
aws s3 presign s3://バケット名/ファイル名 --expires-in 600
```

[presign](https://docs.aws.amazon.com/cli/latest/reference/s3/presign.html)


##15.オブジェクトのアップロード##

1 回の PUT オペレーションでアップロードできるオブジェクトの最大サイズは 5 GB です。
マルチパートアップロード API を使用すると、最大 5 TB の大容量オブジェクトをアップロードできます。
[マルチパートアップロード](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UploadingObjects.html)


##16.リクエスタ支払い##

- データのアクセスにかかるコストを、バケット所有者ではなくてデータへのアクセス者が支払うことが出来るようになる。

https://dev.classmethod.jp/articles/amazon-s3-requester-pay/



##17.リンク##
[S3バケットを削除する（バージョニングが有効になっている場合の動作）](https://qiita.com/leomaro7/items/5566a38a1d446470e2e8)
[S3 バケットポリシーいろいろ](https://qiita.com/leomaro7/items/3d77328c04322efe608e)
[Amazon S3 が AWS PrivateLink をサポート](https://qiita.com/leomaro7/items/162024b2ddec25e121ca)