S3について広く浅くまとめてみた


# はじめに

今回、以下の公式ドキュメントを参考にS3ではどんな機能があるのかを書き出してみました

https://aws.amazon.com/jp/s3/features/

この記事を通して、S3ではどんなことができるのかを知っていただけると幸いです
一部の用語に対しては、理解のために使用したサイトのURLを埋め込んでいます

# 特徴

## ストレージ管理およびモニタリング

### ストレージ管理

- オブジェクトは[Prefix(ディレクトリのようなもの)](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/using-prefixes.html)で整理することが可能 
- S3 オブジェクトタグを用いてオブジェクトにタグを付与することが可能
- S3 バージョニングを使用するとS3に保存されている全てのオブジェクトのバージョンを保存・取得・復元が可能
- オブジェクト削除のため多要素認証(MFA)を設定することが可能

### モニタリング

- AWS コスト割り当てレポートを使用し、バケットタグにより集計された使用状況・コストを表示可能
- CloudWatchを使用し、請求アラートの設定が可能
- CloudTrailを使用し、アクティビティを追跡・レポートし、ワークフローやアラートをトリガーすることが可能
- S3 イベント通知を設定し、Lambdaを呼び出すことが可能

### [S3 バッチオペレーション](https://aws.amazon.com/jp/s3/features/batch-operations/)

- S3 バッチオペレーションを使用し、複数のオブジェクトに対して同時に以下を実施可能
    - バケット間のオブジェクトコピー
    - オブジェクトのタグ付け
    - アクセスコントロールの変更
    - 特定のストレージクラス(Glacier)にてアーカイブされたオブジェクトの復元Lambda関数の実行

### [S3 オブジェクトロック](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/object-lock-overview.html)

- Write Once Read Many(WORM)ポリシーの適用が可能
- バケットの設定でS3 オブジェクトロックを有効化する必要あり
    - バケットにPUTされたオブジェクトを自動で保護したい場合は、デフォルトのモードと期間を設定する必要あり
- リテンションモードというものがあり、以下から選択可能
    - ガバナンスモード：特定のIAMアクセス許可を持つAWSアカウントはS3 オブジェクトロックを削除できる = オブジェクトのバージョン削除ができる
    - コンプライアンスモード：rootアカウントを含むどのユーザも保護を削除できない

### [S3 レプリケーション](https://aws.amazon.com/jp/s3/features/replication/)

- オブジェクトを同一または異なるAWSリージョンにレプリケートできる
    - クロスリージョンレプリケーション(CRR)
        - 他のAWSリージョンにレプリケートする
    - セイムリージョンレプリケーション(SRR)
        - 同じAWSリージョンにレプリケートする
    - バッチレプリケーション
        - CRR・SRRはライブレプリケーションのため、バケットにオブジェクトが書き込まれる度にレプリケートされる
        - バッチレプリケーションは、既存のオブジェクトに対してレプリケートできる
- レプリケーション時間制御(S3 RTC)を用いて、レプリケーションアクティビティ(以下例)を可視化することが可能
    - レプリケーションを保留しているS3 APIの総数
    - レプリケーションを保留しているオブジェクトの合計サイズ
    - 最大レプリケーション時間
- レプリケートしたファイルへのアクセス
    - マルチリージョンアクセスポイントを使用しアクセスが可能
    - レプリケートなしと比べ、パフォーマンスを最大60%高速化可能
    - マルチリージョンアクセスポイントのフェイルオーバーコントロールを使用することで、データセットのフェイルオーバーも可能

## [ストレージ分析と洞察](https://aws.amazon.com/jp/s3/storage-analytics-insights/)

### S3 Storage Lens

- 組織全体の以下を可視化可能
    - オブジェクトストレージの使用状況
    - アクティビティの傾向
- 費用対効果の向上・データ保護の観点での推薦事項を作成
- メトリクスには有料版と無料版がある

### S3 ストレージクラス分析

- オブジェクト全体のアクセスパターンを可視化可能
- 最適なストレージクラスを判断するのに使用可能
- ストレージの使用状況をS3にエクスポート可能
    - エクスポートしたデータをQuickSightで可視化することも可能

### S3 インベントリ

- ストレージの管理・オブジェクトレベルの分析が可能
- S3 インベントリを使用して、以下が確認可能な日次or週次のレポートが生成可能
    - バケット名
    - キー名
    - 最終変更日
    - オブジェクトサイズ
    - ストレージクラス
    - オブジェクトの暗号ステータス
    - レプリケーションステータス など
- S3 インベントリの使い方：https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/configure-inventory.html

## [ストレージクラス](https://aws.amazon.com/jp/s3/storage-classes/?nc=sn&loc=3)

- オブジェクトストレージサービスであり、ファイルやデータをオブジェクトとして格納する
- 各オブジェクトはユニークなKey(URLのような形式)を持つ

### Standard

- 汎用的なもの

### S3 [Intelligent-Tiering](https://aws.amazon.com/jp/s3/storage-classes/intelligent-tiering/)

- 特徴
    - アクセスされているオブジェクトをアクセスしやすいディレクトリに持ってくることで費用を削減する
- 種類
    - 自動アクセス階層
        - 30日間連続してアクセスされなかったオブジェクトを低頻度アクセス階層に移動してコストを40%節約する
        - 90日間アクセスされなければ、自動アーカイブインスタントアクセス階層に移動して押すとを68%節約する
        - アクセスされたオブジェクトは高頻度のアクセス階層に戻される
        - 128KB未満のオブジェクトは自動階層化の対象にならず、常に高頻度アクセス階層に置かれる
    - オプトイン非同期ディープアーカイブアクセス階層
        - 自動アクセス階層に+αのような立ち位置
        - 非同期ディープアーカイブアクセス階層は設定でアクティブ化することができる
        - オンにした場合は、180日間アクセスされなかったオブジェクトをディープアーカイブ階層に移動し、コストを最大95%節約する
        - 他の階層と同様にアクセスされると高頻度アクセス階層に置かれる
    - 両方のオプトイン非同期アーカイブアクセス階層
        - 自動アクセス階層に+αのような立ち位置
        - 非同期アーカイブアクセス階層とディープアーカイブアクセス階層は設定でアクティブ化することができる
        - 90日間アクセスされなければアーカイブアクセス階層に移動され(自動アクセスのアーカイブインスタントアクセス階層をバイパス)、コストを71%節約する
        - 180日間かセスされなければ、アーカイブディープアーカイブアクセス階層に移動され、最大95%のコストを節約する
        - 他の階層と同様にアクセスされると高頻度アクセス階層に置かれる

### Standard-Infrequent Access

- アクセス頻度が低いが必要に応じてすぐに取り出すことが必要なデータに適している
- S3 Standardに比べコストが低い

### 1 Zone-Infrequent Access

- S3 Standardなどでは少なくとも3つのAZゾーンにデータを保存するが、1 Zone-IAでは1つのAZに保存するため、S3 Standard-IAよりも20%コストが低い

### [Glacier](https://aws.amazon.com/jp/s3/storage-classes/glacier/?refid=8d98c589-9147-4a41-90cf-1482c5989bc1&trkcampaign=aws-innovate-apj)

- 特徴
    - ユースケースに合わせて、アーカイブストレージクラスを選択し、パフォーマンスを調整することが可能
    - コストが安い
        - 特定のアクセスパターンに対応しているので、大量のデータを保管してもコストを抑えることが可能
    - 全てのS3機能をサポートしている
- 種類
    - Glacier Instant Retrieval
        - 四半期に1回アクセスされ、ミリ秒単位の取り出しが必要な長寿命データに対してS3 Standard-Infrequent Accessよりも最大68%コストを下げる
    - Glacier Flexible Retrieval
        - 1年に1~2回アクセスされ、非同期で取り出されるアーカイブデータに対して、S3 Glacier Instant Retrievalよりも最大10%コストを下げる
        - コスト・アクセス時間・無料の一括検索とのバランスをとる
    - Glacier Deep Archive
        - 1年に1回未満しかアクセスせず、非同期で取り出される長寿命のアーカイブデータに対して、S3 Glacier Flexible Retrievalよりも最大75%コストを下げる
        - 最もコストの低いストレージ
- ユースケース
    - 長期的なバックアップの保持
    - アーカイブデータの保存


:::note 
S3 ストレージクラス診断チャート
- https://dev.classmethod.jp/articles/should_i_choice_s3_storage_class/
:::

### AWS Outposts

- AWS Outpostsを使用し、オンプレでS3を構築することが可能
- オンプレの恩恵を受けることが可能

## アクセス管理

- デフォルトでは作成したS3リソースにのみアクセス可能
- IAMを使用して以下のように権限を付与可能
    - Deprecated：アクセス制御リスト(ACL)：ユーザに対しオブジェクト毎に権限を付与する
    - バケットポリシー：ユーザに対しバケット毎に権限を付与
    - S3 アクセスポイント：アプリケーション単位のデータセットに毎に権限を付与
    - クエリ文字列認証：一時的なURLにより時間制限付きのアクセス権限を付与
- S3リソースへのアクセスを一覧表示する監査ログもあり

## セキュリティ

- 暗号化
    - アップロード・ダウンロード共に暗号化をサポート
    - アップロード時は新規データに関してデフォルトで暗号化
- Amazon Macieを使用して、S3に保存されている機密データを検出・保護することが可能
- AWS PrivateLink for S3を使用しオンプレミスとS3間でプライベート接続が可能

### [S3 ブロックパブリックアクセス](https://aws.amazon.com/jp/s3/features/block-public-access/)

- S3バケットとオブジェクトに対しパブリックアクセス権を付与しないためのサービス
    - パブリックアクセス：バケットポリシーなどで付与された外部から接続可能な権限
- AWSアカウントまたはバケット単位で設定可能
- 新しいバケットに対しデフォルトで有効になっている

### S3 Object Ownership

- ACLを無効にし、バケットに含まれる全てのオブジェクトの権限をバケット所有者に変更する
    - 権限の管理を整理する

### [IAM Access Analyzer for S3](https://aws.amazon.com/jp/iam/features/analyze-access/)

- 最小権限のための手伝いをする
- ポリシー生成により、ログに記録されたアクセスアクティビティに基づいたポリシーが生成可能
- ポリシー検証では、ポリシーチェックにより新規・既存のポリシーに対し問題がないかを検証可能
- パブリック及びクロスアカウントからアクセスが可能になる権限が付与されると警告し、意図した権限付与かを確認する
- ラストアクセス情報により、未使用の権限を調整する
    - また、不要なIAMエンティティの削除も可能
- 検証結果をCSVとしてダウンロードすることが可能

## データ処理

### [Amazon S3 Object Lambda](https://aws.amazon.com/jp/s3/features/object-lambda/)

- S3 GET, HEAD, LISTリクエストに対して独自のコードを実行し、アプリケーションに返されるデータに処理を加えることが可能

### クエリ

- S3 Select(S3用のクエリ)
    - パフォーマンス：最大400%向上
    - コスト：最大80%削除
    - オブジェクトサイズ：最大 5TB
- Amazon Athena・Amazon Redshiftから直接S3にクエリ可能

## データ転送

- ハイブリッドクラウドストレージ：
    - [AWS Storage Gateway](https://aws.amazon.com/jp/storagegateway/)
- オンラインデータ転送：
    - [AWS DataSync](https://aws.amazon.com/jp/datasync/)：一般的
    - [AWS Transfer Family](https://aws.amazon.com/jp/aws-transfer-family/)：シームレスなファイル転送が可能
    - [Amazon S3 Transfer Acceleration](https://aws.amazon.com/jp/s3/transfer-acceleration/)：長距離ファイルの転送が速くなる
    - [AWS Snow Family](https://aws.amazon.com/jp/snow/)：ネットワーク容量に制限があるような場合に使用する
- AWS パートナーネットワーク(APN)のサードパーティと連携することも可能

## パフォーマンス

- 以下をサポート
    - 1秒あたり少なくとも3,500のデータ追加リクエスト
    - 1秒あたり5,500のデータ取得リクエスト
- パフォーマンスガイドライン
    - https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/optimizing-performance-guidelines.html
- パフォーマンスデザインパターン
    - https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/optimizing-performance-design-patterns.html
- 整合性について
    - https://aws.amazon.com/jp/s3/consistency/

# 最後に

普段から使っているAWSサービスでも改めてドキュメントを読んでみると知らない機能がたくさんあり、多くの発見がありました
他のサービスについても同じようにドキュメント読んで、どんな機能があるのかを把握しておこうと思います！

(今回、qiita-cliとneovimで執筆してみました。とても書きやすい上に公開等もしやすかったです)