ソリューションアーキテクト対策_S3あれこれ篇

## はじめに
試験勉強した際のメモを自分用に記事化。
内容は公式やBlack Beltの写経ですので目新しいことはありません:pray:


## S3のライフサイクル管理
一定期間が経過したオブジェクトのストレージクラス変更や削除を自動的に行うルールを設定できる。

ex.アプリケーションのログをS3に蓄積、半年間は頻繁に確認するがそれ以降はほとんど利用しない。ただし取り出しは12h以内が望ましい。

### 設定方法
・バケット全体やPrefixに設定する
・オブジェクト更新日を基準にして日単位で指定し、毎日0:00UTCにキューを実行
・最大1000ルール
・IAに移動できるのは128KB以上のオブジェクト
・MFA　Deleteが有効だと設定不可

### 設定例を3つほど
一定期間が経過後に自動アーカイブしたい場合は、S3(Standard)からGlacierへアーカイブするよう設定する

一定期間が経過後にで自動で安価な保存場所へデータを移動させたい場合は、S3(Standard)からS3(Standard-IA)に移動させる

一定期間が経過後に自動で削除したい場合は、S3(Standard)のデータを一定期間で削除するようライフサイクルを設定する


## S3で静的なWebサイトを作る
### S3にホスティングしてWebサイトを作る時のデメリット
httpsできない。ただしS3とCloudFrontを組み合わせれば実現できる。

### 静的なサイトのパフォーマンスを向上させたい時は
・Route53をS3の静的ウェブホスティングに設定する
・Route53を利用してエイリアスレコードを作成し、ドメインのホストゾーンに追加。S3バケットにマッピングする


### S3のパフォーマンスを向上させるには
オブジェクトキー名に日付などのPrefixを利用する。
日付ベースでアップロードを分散することで、パフォーマンスを自動的に向上することができる。


### S3の整合性
S3は強い整合性モデルを使用しているため、新規登録、更新、削除全てにおいて、反映に誤差が生じることはない。
オブジェクトの更新が同じキーで行われたとしても同じ。


### S3のオブジェクト削除の対策
誤った操作による削除を防ぐためには、以下の対応が有効。
- バケットのバージョニング機能を有効化する
- 削除時にMFAを必須とするよう設定を行う(S3 MFA Delete)

データ削除を不可にする設定は、バケット作成時の初期設定でのみ可能。
IAMで制御もできるがロールとポリシーではなくIAMユーザーでのみ制御が可能。


### S3のクロスリージョンレプリケーションについて
リージョン間を跨ぐクロスリージョンレプリケーションにより耐障害性を高める。
- オブジェクトの作成・更新・削除をトリガーにレプリケーションを行う(GUI, CLIどちらでもおk)
- 事前にバージョニング機能を有効にする必要がある
- 双方向レプリケーションも可能。ただしデフォルトではない
- データ通信費用が発生する


### S3のストレージクラスを3種類(要暗記)
- Standard
重要性が低く、頻繁にアクセスするデータを大量に保存するのに向いてる。複数箇所にデータを複製する。デフォルトのやつ。

- Standard-IA
IAはInfrequency Accessの略。低頻度アクセスデータ向けのストレージクラス。
OneZone-IAより重要かつアクセスが頻繁ではないマスターデータ向け。
Standardより安価だがOneZone-IAよりは高い。Glacierよりも高い。取り出しは即時。

- OneZone-IA
単一箇所にデータを保存するためお安い。
ログファイルやバックアップのコピーなどのマスターではない再生可能なデータを低価格に保存するのに向いている。取り出しは即時。

ちなみにGlacierのFlexible Retrivalとは通常のGlacierのことを指す。

- RRS
低冗長化ストレージのこと。現在は非推奨。


### ストレージクラス分析とは
S3の適切なデータを適切なストレージクラスに移行したい場合は、ストレージクラス分析を使う。
ストレージアクセスパターンを分析し、適切なデータを適切なストレージクラスに移行すべきタイミングを判断できる。


### S3 Access Analyzerとは
AWSアカウントの外部からアクセスできるリソースを特定し、解析するサービスのこと。


### マルチパートアップロードAPIとは
ファイルを小分けにしてアップロードできるAPI。
S3へのアップロードの際にファイルが大きい場合は、マルチパートアップロードAPIを使うとファイルを小分けにしてアップロードできる。


### S3の暗号化について。暗号化キー篇
- SSE-S3
S3で管理された暗号化キーにより実施されるサーバーサイド暗号化のこと。
所有者であるAWSアカウントID以外からのアクセスを拒否する。暗号化と複合化をS3が自動で実施してくれる。

- CSE(Client Side Encryption)
ユーザーが独自の暗号化キーを利用して暗号化したオブジェクトをS3に保存して、暗号化キーの生成＆管理はクライアントで実行する形式。

- KMS
暗号化キーの作成と管理をマネージド型サービスで提供する。AWSのサービス。

- SSE-C
ユーザーが管理する鍵により暗号化を実施する。ユーザーが用意した暗号化キーでSSE-Cを利用する形。


### S3の暗号化について
S3バケットに対して暗号化キーによるサーバサイド暗号化を有効化すると、オブジェクトはS3バケットに保存される前に自動で暗号化され、アクセス時に複合される。
関連するログも暗号化されるので別途設定は不要。
もし設定が必要な場合はバケット作成後も追加で実行できる。


### S3の暗号化が一部失敗してしまう時は
- バケットポリシーの設定に問題がある
例えば、
「バケットポリシーでヘッダに暗号化情報がないPUTは拒否する」設定をしているなら、該当するヘッダを持つPUTはデータの暗号化に失敗する。

- デフォルト暗号化を実施すると
バケット全体が暗号化される。なので一部だけ暗号化するとかはできない。

- SSE-KMSの暗号化キー指定に問題がある？
仮に問題があったとしても、キー自体に問題がある場合は全体的な暗号化に失敗する。
一部とかではない。

- データ保存自体の障害で一部暗号化に失敗するとか？
そういうのもない。この場合はデータ保存に失敗してPUTが停止している、とかになる。


### S3のバケットポリシーでよく忘れること
s3:GetObjectは、オブジェクトの読み込み処理。
なのでこのポリシーがアタッチされていると静的ホスティングを有効化できる。


### 静的Webホスティングの実現順序
①ブロックパブリックアクセスを無効化する。パブリックなアクセスを有効にする。
②バケットポリシーでバケットの読み取り許可を設定する
③Index.htmlなどのインデックスドキュメントをバケットの内に保存する
④静的Webホスディングの設定画面でIndex.htmlなどのインデックスドキュメントを設定し、有効化する


### S3で静的WebサイトをホストするときのURL(暗記)
バケット名が先頭に来る。それより後は固定。
https://bucket-name.s3-website-Region.amazonaws.com


### S3のデータ保護について
オブジェクトをロックする機能があるのでそれを使う


### S3のデータ解析について
以下のAWSサービスを用いてS3に格納されているデータの解析が可能。

- S3 Select(Glacier Select)
S3の内部機能。S3内で直接クエリを実行し、データを取得できる。
S3内でシンプルなSQLを使用してオブジェクトからデータを抽出・検索・取得する。
簡単なことが対象で、ビッグデータ分析とかはできない。

## 例：AアカウントのS3にBアカウントの利用を許可するには
IAMユーザーポリシー、バケットポリシーの両方が必要。
なので、

①IAMユーザーポリシーでS3へのアクセス権限を付与
②バケットポリシーでバケットのアクセス権をjsonで設定。IAMユーザーやBアカウントを指定する

この手順でBアカウントからAアカウントへのS3へアクセスし、ReadやWriteができるようになる。

また、以下の機能も存在する。
・ACL：オブジェクト単位でアクセス権を設定
・事前署名付きURL：インターネット上の第３者にURLを閲覧させることが可能
(AWS SDKで生成した事前署名付きURLで、S3オブジェクトURLにアクセスできる権利を一定期間付与する)

## S3の容量について
容量は無制限。保存するオブジェクト数も無制限。
ただし1オブジェクトの最大サイズは5TBで、マルチパートアップロードを利用してS3にオブジェクトをアップロードする場合も最大サイズは5TB。

1つのPUT操作でアップロードできるオブジェクトの最大サイズは5GBなので混同しないこと。


## おわりに
量多くて折れそうですが頑張る！

以上です。