AWS S3

## はじめに
AWSのストレージサービスの一つ、AWS S3 についての備忘録。

## AWSのストレージサービスについて

|サービス名|略称|ストレージタイプ|説明|コスト（1GBあたり/月）|備考|
|---|---|---|---|---|---|
|Elastic Block Store|EBS|ブロックストレージ|EC2にアタッチするためのボリューム。|凡用：0.12USD<br>コールドHDD：0.03USD||
|Elastic File System|EFS|ファイルストレージ|ファイル共有サービス。VPCに対してファイルシステムを構築し、AZごとにサブネットに対してマウントさせる。|標準：0.36USD<br>低頻度アクセス：0.0272USD|EFSの標準がストレージの中で最も費用が高い。|
|Simple Storage Service|S3|オブジェクトストレージ|データをオブジェクト単位で読み書きする。エンドポイントが作られるので、HTTPSなどでアクセスできる。|S3 を参照||

## S3

### 用語

|名称|説明|容量|
|---|---|---|
|バケット|オブジェクトの格納場所。<br>バケット名はグローバルでユニークにする必要がある。|無制限。自動で拡張される。|
|オブジェクト|S3に格納されるファイル形式。<br>オブジェクトごとにURLが発行される。|バケット内に保存可能なオブジェクト数は無制限。<br>1オブジェクトあたりのサイズは5TBまで。|

### ストレージタイプ

|ストレージタイプ|説明|耐久性|可用性|コスト（1GBあたり/月）|備考|
|---|---|---|---|---|---|
|STANDARD|頻繁に利用且つ大量のデータ保存向け。|99.999999999%|99.99%|0.025USD|※耐久性：データ損失リスクの指標。|
|STANDARD-IA|低頻度アクセス用。<br>STANDARDよりも安価だが、ONE ZONE-IAよりは高い。|99.999999999%|99.9%|0.019USD|※IA：Infrequent Access|
|ONE ZONE-IA|低頻度アクセス用。<br>Multi AZではないため、クリティカルではないデータ向け。<br>STANDARD-IAよりも安価。|99.999999999%|99.5%|0.0152USD||
|Glacier|アーカイブ用。<br>バックアップなどのデータ向け。<br>データの取り出しに時間がかかる。<br>ユースケースとして、30日や90日経過したらGlacierに移行してアーカイブするといった設定が可能。|99.999999999%|N/A|0.005USD|標準抽出：3〜5時間<br>迅速抽出：2〜5分|
|Glacier Deep Archive|アーカイブ用。<br>Glacierよりも安価だが、抽出にさらに時間がかかる。（12時間以内）|99.999999999%|N/A|0.002USD||
|Intelligent Tiering|アクセスパターンに基づいてコスト効率の高いストレージ階層に自動で移動してくれる機能。<br>アクセスが多いファイルはSTANDARDに、アクセスが少ないファイルはSTANDARD-IAに自動で振り分けられる。|99.999999999%|99.99%|STANDARD と STANDARD-IA の組み合わせ|アクセス頻度がわからない場合に設定することで、コストの最適化ができる。|

### ライフサイクル設定

|別ストレージタイプへの移行可否(○/×)|STANDARD|STANDARD-IA|Intelligent Tiering|ONE ZONE-IA|Glacier|Glacier Deep Archive|
|---|---|---|---|---|---|---|
|STANDARD|-|○|○|○|○|○|
|STANDARD-IA|×|-|○|○|○|○|
|Intelligent Tiering|×|×|-|○|○|○|
|ONE ZONE-IA|×|×|×|-|○|○|
|Glacier|×|×|×|×|-|○|
|Glacier Deep Archive|×|×|×|×|×|-|

### アクセス管理

|管理方法|説明|
|---|---|
|IAM ポリシー|内部のIAMユーザーやリソースに対しての権限管理。|
|S3 バケットポリシー|外部も含めたアクセス権限管理。|
|ACL（アクセスコントロールリスト）|オブジェクト単位でのアクセス権限管理。|
|Presigned URL（事前著名付きURL）|第三者にオブジェクトのURLを閲覧させる際に利用。<br>CLIやSDKで期限付きのURLを発行できる。|

### オブジェクトのアップロードと公開

|No.|操作|備考|
|---|---|---|---|
|1|バケットを作成|バケット名はグローバルでユニークにする|
|2|フォルダを作成||
|3|ファイルをアップロード||
|4|オブジェクトを公開する|オブジェクトアクション > 公開する|
|5|バケットのブロックパブリックアクセスをオフにする|バケット > アクセス許可 > ブロックパブリックアクセス (バケット設定)|

### バケットのバージョニング
　- バケット > プロパティ から設定
　- 同じファイルを更新してアップロード → バージョン管理ができる
　- 更新してアップロードしたオブジェクトは、再度公開する必要がある
　- 削除バージョンを削除することで、削除を取り消せる
![スクリーンショット_2021-02-28_23_31_09（3）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917499/4d3ed084-fddf-805f-356e-21858f8afca4.png)

### Intelligent-Tiering Archive

プロパティ > Intelligent-Tiering Archive 設定

Intelligent-Tiering: STANDARD, STANDARD-IA
Intelligent-Tiering Archive: Archive Access(Glacier), Deep Archive Access(Glacier Deep Archive)
![screencapture-s3-console-aws-amazon-s3-bucket-test-202102282323-property-int-tiering-config-create-2021-02-28-23_43_12-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/917499/07bad9f2-e9a4-672d-1a51-1f8a5f5a91f7.png)

### イベント通知

プロパティ > イベント通知

S3のアクションをトリガーに以下サービスに連携できる。
　- Lambda
　- SNS
　- SQS

ユースケースとしては、
オブジェクトがアップロードされたら、LambdaでファイルのメタデータをDBへ保存や、
オブジェクトが削除されたら、SNSでメール通知など。

### 静的ウェブサイトホスティング

S3を静的ウェブサイトとして使用したい時の設定。

|No.|操作|備考|
|---|---|---|---|
|1|プロパティ > 静的ウェブサイトホスティング||
|2|index.html と error.html を作成||
|3|No.2のファイルをアップロード||
|4|バケットポリシーを編集||

```Json:バケットポリシー例
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "任意の文字列",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "バケットARN/*"
        }
    ]
}
```