【AWS】小学生でもわかる！S3(Simple Storage Service)の機能を徹底解説！！


叡智に富んだ読者様、ご機嫌用よう。
すぎちゃんです🐈

SAAの資格更新のためcloud licenseでひーひー言いながら知識を深めていますが、機能面がやや複雑で正答率が伸び悩んでおります。

https://cloud-license.com/

さて今回は、私自身の備忘録も兼ねてS3についてまとめていこうと思います。

学習者の皆様はご存じかと思われますが、S3に関連する機能・サービスはかなり数が多く覚えるのも大変です💦

なので以下６つの[フレームワーク](https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/framework/the-pillars-of-the-framework.html)の柱に分けて解説していきます。

:::note info
- 🔧：運用上の優秀性
- 🔏：セキュリティ
- 👮：信頼性
- 🏋️‍♂️：パフォーマンス効率
- 👛：コスト最適化
- 🌏：持続可能性
:::

各機能に各柱の絵文字を紐づけながらの解説となるので、直感的に覚えやすいと思われます。
また上に行けば行くほどAWSの資格試験によく出る（と個人的に思ってる）のでしっかりと抑えておきましょう🐈
（独断と偏見で並べているので、何か意見があればコメントください💦）


## 👛Amazon S3 ストレージクラス
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/229e526c-5e93-4414-bee7-e7d10ec8ceb0.png" width="400"/>


### 1. S3 Standard
皆さまが一番お目にかかるであろうストレージクラスがなんといっても「S3 Standard」。

**99.999999999%(イレブンナイン)の耐久性を誇り、99.99%の可用性**が保証された最もスタンダードなストレージクラスです。


> これはAmazon S3に1万個のオブジェクトを保存したとして、そのうちの1つが障害によって失われるのに平均で1000万年ほどかかるレベル。
>
>引用元： [PublicKey](https://www.publickey1.jp/blog/10/amazon_s399999999999.html)

オブジェクトの取り出しも**瞬時**に行われ、3AZ以上にオブジェクト保存するという冗長性にも優れております。



📌**用途**：YouTubeみたいな動画配信サービスのサムネイル画像


### 2. S3 Inteliegnt-Tiering
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/e5819b50-22d3-4fcf-873a-725976d87eaa.png" width="400"/>

次に紹介するのが、**S3 Inteligent-tiering**。

他のメンバーより比較的若めですが、お財布のことを考えて**オブジェクトを自動的に仕分けてくれる**頼もしい存在です。

自動で頻繁に使うデータは取り出し時間が早い倉庫(S3 Standardなど)、反対にあまり使わないデータはGlacierなどのあまり保管コストのかからない倉庫に移してくれます。

取り出しにかかる遅延はなく、アクセスパターンが読めないデータや、コスト削減をしたい場合に適しています。

📌**用途**：たまに見る会社のドキュメント

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/intelligent-tiering-overview.html


### 3. S3 標準-低頻度アクセス(S3 Standard-IA)

 S3 Standard-IA（標準 - 低頻度アクセス）は、たまにしか使わないけれど、すぐに取り出せるようにしたいデータを保存するためのストレージクラスです。

 S3 Standard（標準）よりも保存コストが安いですが、**データを取り出すときの料金が少し高くなります。**

 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/eb02ddf3-bb19-4851-8b42-b99d7b2b1f37.png" width="70"/>「取り出ししたいんやったらちょっとばかしお金もらいまっせ💰」

長期間保存するが、アクセス頻度が少ないバックアップデータやログファイルの保管に向いています。



📌 **用途**： 1ヶ月に1回だけ見るレポートファイル・バックアップ

 :::note info
**メリット**
- すぐにオブジェクトを取り出すことができる
- S3 Standardよりも保存コストが安い
:::

 :::note alert
**デメリット**
- 取り出し料金が少しかかる
:::

### 4. S3 ワンゾーン-低頻度アクセス(S3 One Zone-IA)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/375ca4ce-ce5c-4bce-94df-14fd91ec7727.png" width="70"/>「ログデータを保管したいけど費用も節約したい！そんな時には僕に任せてね♪」


S3 One Zone-IA（ワンゾーン - 低頻度アクセス）は、**1つのAWSアベイラビリティゾーン（AZ）のみでデータを保存する低コストのストレージクラス**です。


S3 Standard-IAよりさらに安価ですが、**AZに障害が発生するとデータが失われるリスクがあります**。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/f4522aea-5221-4a4d-81fb-bc8707bf8433.png" width="70"/>「安く済むけど可用性は保証してあげられないんだ・・・。」



バックアップの別コピーや、一時的なデータ保管など、復元可能なデータ向けに適しています。



📌 **用途**：
 ログ等のすぐ消してもいいけど、一応取っておきたいファイル

 :::note info
**メリット**
- 安価に保存できる。S3 Standardの6割のコストがかかる。
:::


 :::note alert
**デメリット**
- AZ障害によりデータを失うリスクがある。
:::


### 5. Glacier

AWS Glacierは**アクセス頻度が少ないオブジェクトをコスト効率良く保管できるストレージクラスです**。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/fdd26902-80bf-4092-9449-01a36019588b.png" width="70"/>「ボクの氷室を使えばコストを**8割削減できるんだよ！**」

Glacierは以下３つのストレージクラスに細分化することができます。

- Glacier Instant Retrieval
- Glacier Flexible Retrieval
- Glacier Deep Archive

下にいけばいくほどコストを抑えることができますが、取り出し時間がかかります。

![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/91258b22-2cd9-4cc9-af2f-2e4ce1fa23f3.png)

📌**用途**：10年前の書類、昔の監視カメラの映像


https://aws.amazon.com/jp/s3/storage-classes/glacier/

 :::note info
**メリット**：
- あまり使用されないオブジェクトを安価に保存できる。
:::


 :::note alert
**デメリット**
- 取り出し時間が5~12時間と長時間に及ぶ。
:::


## 🔏バケット・オブジェクトACL

バケットACL（アクセスコントロールリスト）とオブジェクトACLは、**S3バケットやその中のオブジェクトに対するアクセス権限を細かく制御するための仕組みです**。

:::note warn
2021年に非推奨になってしまっているので、今後S3をいじる機会があればバケットポリシーを使用しましょう！
(引用元：[S3のACLの非推奨になったのでBucketPolicyへ移行してみた](https://dev.classmethod.jp/articles/s3-acl-bucketpolicy/))
:::


### バケットACL
バケットACLは、S3バケット自体へのアクセス権限を設定します。

例えば、バケット内のすべてのオブジェクトに対するアクセス許可や、読み取り、書き込みの権限を設定できます。

バケットACLはバケットに対して直接設定され、バケット内のすべてのオブジェクトに適用される基本的なアクセス制御です。

### オブジェクトACL

オブジェクトACLは、個別のS3オブジェクトに対するアクセス権限を設定します。

これにより、特定のオブジェクトだけに対してアクセス制御を行ったり、バケット内の他のオブジェクトとは異なるアクセス許可を設定することができます。

オブジェクトACLは、バケットの設定とは別に、各オブジェクトごとに独立して管理されます。

:::note info
**メリット**
必要に応じて特定のユーザーやグループに対するアクセス権限を付与することが可能

:::
:::note alert
**デメリット**
IPアドレス・ユーザー単位でのアクセス制御はできない（きめ細かに制御したい場合はバケットポリシーを推奨）

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/543bbf3b-b73b-4b22-9ea4-a3bf6310ae62.png)
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/272d2e6e-1a75-4f9f-bf3f-276a3a07e5cf.png)
> 引用元：[S3のアクセスコントロールリスト(ACL)の基礎を学ぼう](https://dev.classmethod.jp/articles/amazon-s3-acl-basics/)


:::


## 🔏バケットポリシー

バケットポリシーは、S3のバケットに対して「**どんな人がどんな操作をしていいか**」を細かく決めるルールのことです。

これを使うと、バケット内のすべてのファイルに対して一気にアクセスのルールを設定することができます。

前述のバケット・オブジェクトACLとは違い、**ユーザー・IPアドレス単位、さらには特定のポリシーの有無に基づいてきめ細かなアクセス制御を実現できます**。

### ちょっと複雑な例


![スクリーンショット (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/e2ac0b03-f026-4954-b810-4c96c057bc93.png)

例えば、`SystemAdministrator`ポリシーを持っているユーザーには、`PutObject`（オブジェクトのアップロード）を許可する設定をしたい場合、次のようにバケットポリシーを記述できます

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::your-bucket-name/*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalPolicyName": "SystemAdministrator"
                }
            }
        }
    ]
}
```

このバケットポリシーでは、ユーザーが`SystemAdministrator`ポリシーを持っている場合にのみ、PutObjectアクションを許可します。




## 👮バージョニング

![スクリーンショット (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/14774972-6f1c-4e78-93dc-5149cc34b7df.png)


### 1. 上書きしてしまっても安心
バージョニングを設定すると、うっかり文書を上書きしてしまった場合でも、過去のバージョンに戻すことができるので安心です。変更履歴が保存されているので、どの時点でどんな状態だったかも簡単に確認できます。

### 2. 誤削除も復元可能
もし誤ってオブジェクトを削除してしまった場合でも、バージョニングが有効なら削除フラグがつけられた状態で復元可能です。削除フラグを外せば、簡単にオブジェクトを元に戻すことができます。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/Versioning.html

:::note info
**メリット**
- 上書きをしてしまってもすぐに元のバージョンに戻せる
- うっかり削除しても復元可能
:::

:::note alert
**デメリット**
- ストレージコストが増える
- 管理が煩雑になる可能性がある
:::


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

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication.html

クロスリージョンレプリケーション（CRR：Cross-Region Replication）を用いると、あるリージョンのS3バケットに保存されたオブジェクトを、**別のリージョンのS3バケットに自動的に複製することができます**。

### 特徴

![スクリーンショット (21).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/4e4a119a-d121-498f-a5d4-26b48ea3da53.png)


#### 1. データの冗長性と耐障害性向上
クロスリージョンレプリケーションを使うことで、オブジェクトを複数のリージョンにバックアップとして保持でき、1つのリージョンで障害が発生した場合でも、他のリージョンからデータを取り出すことができ、システム全体の耐障害性が向上します。

#### 2. 地理的な分散による低遅延

特定の地域でユーザーがアクセスする場合、その地域に近いリージョンにデータを複製することで、アクセス遅延を最小限に抑えることができます。これにより、ユーザー体験が向上します。


### 注意点

- クロスリージョンレプリケーションは、バケットのバージョニングを有効にする必要があります。
- レプリケーションは、最初にアップロードされたオブジェクトを対象に実行され、その後に行われる変更（例: 更新や削除）は、設定したルールに基づいて反映されます。

## 🔏Origin Access Control

https://aws.amazon.com/jp/blogs/news/amazon-cloudfront-introduces-origin-access-control-oac/

AWS CloudFrontを使って、**S3バケットのファイルへのアクセスを制限するための機能です**。これにより、CloudFrontを経由してS3のファイルにアクセスできるようにし、直接S3にアクセスすることを防ぐことができます。

### 1. 安全性を高める
![スクリーンショット (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/e69959d2-e196-432a-bc0b-3931ec2256cb.png)

OACを使うことで、S3バケットのファイルを、CloudFrontを通じてのみアクセスできるように制限します。これにより、悪い人が直接S3にアクセスしてファイルをダウンロードするのを防げます。

### 2. CloudFrontとS3の連携

![スクリーンショット (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/3ca34a1d-294b-400d-9b07-f8f0e9e17ae9.png)

CloudFrontがS3からファイルを配信する際に、OACがアクセスを制御します。CloudFrontを通じてアクセスする際は、事前に設定された権限に基づいて許可されます。

### 3. 設定が簡単

 OACを設定すると、CloudFrontを通じてのアクセスだけが許可され、S3のファイルを安全に管理できます。

## 🔏署名付きURL

URLに特別な鍵（署名）をつけることで、特定の人だけが一時的にファイルを見たりダウンロードできるように制限できます。

でも、この鍵はとっても高性能で、時間がたつと自動的に効果が消えてしまいます！ 🔑✨

期限が切れたら、新しい鍵を作らない限りアクセスはできません。

つまり、「**一定時間だけ見せたい！**」 というときに便利な仕組みです！

### 📌**用途**
- 会員だけが見られる画像や動画を配信するとき
- 特定の人だけにファイルをダウンロードしてほしいとき
- 一時的にファイルを公開したいけど、ずっと公開したくないとき

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html



:::note warn
**注意点**
この特別な鍵（署名付きURL）は、**URLを知っている人なら誰でもアクセスできるという特徴があります。**
そのため、他の人に流布してしまうと、受け取った本人以外もアクセスできてしまうので、慎重に扱いましょう！
:::


## 🔏オブジェクトロック

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/object-lock.html

S3には「リテンションモード」「リーガルホールド」という2人の頑固なおじさんが住み着いています。
彼らはS3に保管されているオブジェクトを改ざんから守ってくれる心強い存在です。

![スクリーンショット (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/77b2e3e1-4bf5-49fd-8402-eb837705f58d.png)



### リテンションモード

まずはこちらのリテンションモードさん。
企業のセキュリティレベルによりおじさんの**頑固さ**を調整することが可能です。
**頑固さ**は次の２つから選ぶことができます。

1. ガバナンスモード
1. コンプライアンスモード

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/22d66171-daae-4af0-a070-c5f5445c7983.png" width="70"/>「**ワシが決めた期間は、絶対にオブジェクトを触らせないぞ？**」


#### ガバナンスモード
ちょっと頑固オヤジ。
特定の権限を持つユーザーが特別な操作をすれば、**データの削除や変更が可能です。**

普通のユーザーは設定された期間中はデータを削除・変更できませんが、`s3:BypassGovernanceRetention`権限を持っていれば制限を回避できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/61c03f1c-59a6-9cce-de1a-d5f712c4281c.jpeg" width="70" height="70">「この紋所(`s3:BypassGovernanceRetention`権限)が目に入らぬか！？」

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/22d66171-daae-4af0-a070-c5f5445c7983.png" width="70"/>「うむ！この権限を持ってるなら編集しても削除しても構わんぞ？😤(少しだけ優しい)」

完全にロックされるコンプライアンスモードより柔軟性があり、データの保護と管理のバランスを取りたい場合に適しています。

#### コンプライアンスモード
超頑固オヤジ。

一度設定すると保持期間内は**誰であってもオブジェクトの編集・削除ができません**。

**rootユーザーであっても削除や変更が不可能**で、法規制や企業のコンプライアンス要件に従ってデータを完全に保護するよ用途に適しています。

コンプライアンスモードを解除するにはAWSのカスタマーサポートに連絡する必要があります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/22d66171-daae-4af0-a070-c5f5445c7983.png" width="70"/>「期間内はRootユーザーであろうが絶対に変更させん！肩を叩きければ運営を呼ぶんじゃ！💢🔥」

### リーガルホールド

リーガルホールドさんを味方につけると、**オブジェクトを無期限で削除や上書きから守ってくれます！**

例えば…
「誰かに勝手に自分の写真をアップロードされた！」
「ディープフェイクで悪意のある画像を作られた！」

そんな時、投稿が削除されてもリーガルホールドさんが証拠を守り続けてくれるので、加害者を訴えるときの強い味方になります。

でも、ずっと居座る頑固者ではなく、`s3:PutObjectLegalHold`の権限を持っている人なら解除してお休みしてもらうことも可能です。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/61c03f1c-59a6-9cce-de1a-d5f712c4281c.jpeg" width="70" height="70">：「お疲れ様です！ゆっくり休んでください！」
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/c7c4d555-9053-4039-9b6f-ae800b0b1d69.png" width="70">：「権限がない者の命令は聞けぬ！」

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/61c03f1c-59a6-9cce-de1a-d5f712c4281c.jpeg" width="70" height="70">：「ごめんなさいいいいいい！🙇」

## 🏋️‍♂️S3バッチオペレーション

https://aws.amazon.com/jp/s3/features/batch-operations/

![スクリーンショット (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/d6b6fda5-e2ff-4aff-8ee0-2daae1a61e7c.png)


バッチオペレーションを有効化するとS3バケットに保存されている数十億のオブジェクトを一括で処理することができます。

バッチオペレーションで可能な操作は以下の通りです。

- オブジェクトのコピー
- AWS Lambda関数の呼び出し
- すべてのオブジェクトタグの置換
- すべてのオブジェクトタグの削除
- アクセスコントロールリストの置換
- オブジェクトの復元
- S3オブジェクトロックの保持
- S3オブジェクトロックのリーガルホールドの有効化・解除

これにより、例えば大量のオブジェクトを**リーガルホールドの監視下に置く指示**をバッチオペレーションで一度に行えます。

### 利用条件

バッチオペレーションを利用するには、次の条件を満たす必要があります

:::note warn
`batchoperations.s3.amazonaws.com` からの信頼ポリシーにロールをアタッチすること
:::

これにより、S3のバッチオペレーションを利用するためのアクセス権限が正しく設定されます。

バッチオペレーションは大量データの管理を効率化し、手動で行うには時間がかかる作業を自動化する強力なツールです！

## 🏋S3 Transfer Acceleration

https://aws.amazon.com/jp/s3/storage-classes/intelligent-tiering/

Amazon S3の機能で、**インターネットを介してデータをより高速にアップロードできるようにするための仕組みです**。

この機能を使うと、特に距離が遠い地域からのアップロードを高速化でき、ユーザーの体感速度を向上させることができます。

### 1. グローバルなエッジロケーション

S3 Transfer Accelerationは、AWSのグローバルなエッジロケーションを利用して、データをより速く転送します。ユーザーがデータをアップロードする際、最寄りのエッジロケーションを利用し、その後S3のバケットにデータが転送されます。

### 2. 高速化の仕組み

通常、インターネット上のデータ転送は、途中で多くのネットワークを経由するため、遅延が発生することがあります。Transfer Accelerationでは、AWSの最適化されたネットワークパスを使うことで、これらの遅延を減少させ、高速な転送を実現します。


:::note info
**メリット**
- 遠隔地から高速にデータをアップロードできる
- 数クリックでTransfer Accelerationを有効化できる
:::

:::note alert
**デメリット**
- 追加料金が発生する。転送するデータ量と距離に応じて課金されるのでなるべくお財布と相談すること👛
:::


## 🔧Amazon S3 イベント通知

S3イベント通知は、S3バケット内で特定のアクション（例：オブジェクトの作成や削除）が発生した際に、自動的に通知を送る仕組みです。

この通知を使うことで、リアルタイムでアクションに対する反応を設定できます。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/EventNotifications.html

### 📌用途
#### 画像アップロード通知
新しい画像がS3にアップロードされた際に、Lambda関数をトリガーして画像のサイズをチェックし、自動で圧縮したり、画像処理を行う。

##### バックアップ削除通知
バックアップデータが削除された際にSNSを使って管理者に通知を送信。

### 設定できるイベントアクション
S3イベント通知でトリガーできるイベントは次の通りです。

> - 新しいオブジェクトの作成イベント
> - オブジェクトの削除イベント
> - オブジェクトイベントの復元
> - 低冗長化ストレージ (RRS) オブジェクトの紛失イベント
> - レプリケーションイベント
> - S3 ライフサイクルの有効期限イベント
> - S3 ライフサイクルの移行イベント
> - S3 Intelligent−Tiering 自動アーカイブイベント
> - オブジェクトのタグ付けイベント
> - オブジェクト ACL PUT イベント

### 通知先
![スクリーンショット (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/e0ac3fab-7573-40f9-ae42-9143682f05ee.png)


#### Amazon SNS (Simple Notification Service)
SNSを利用して通知を他のシステムやアプリケーションに伝えることができます。

#### AWS Lambda
Lambda関数をトリガーして、自動でデータ処理を行ったり、カスタムアクションを実行することができます。

#### SQS (Simple Queue Service)
SQSに通知を送ることで、非同期処理を管理し、システムの負荷を分散させることができます。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/EventNotifications.html

## 👛S3ストレージレンズ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/dc9ca94e-6ae0-4b7c-b426-3c81d798db7a.png)


S3 ストレージレンズは、**S3バケットに保存されているデータの利用状況やコストを分析するためのツールです**。

これを使うと、S3のストレージにどれくらいのデータが保存されているか、どのデータがよく使われているか、無駄なデータがあるかなどを詳細に把握できます。

### 1. データの利用状況を見える化
S3 ストレージレンズを使うと、**S3に保存されたデータの使い方をグラフやレポートで確認できます**。例えば、どのファイルが最も多く使われているのか、どれくらいの容量が使われているのかが一目でわかります。

### 2. コスト管理 
どのデータが多くのストレージ容量を消費しているかを確認できるので、無駄なデータを削除したり、必要ないデータを圧縮してコストを削減する手助けになります。

### 3. セキュリティと最適化
ストレージレンズは、アクセスされていないデータを特定し、そのデータの保持ポリシーやアクセスルールを見直すための情報も提供します。これにより、セキュリティと運用の最適化ができます。

## まとめ

S3は、スケーラブルで高耐久性を持つストレージサービスで、さまざまなデータ管理機能を提供します🍅

データの保存からアクセス制御、セキュリティ機能、コスト管理まで、S3は企業のあらゆるニーズに対応できる柔軟性を持っています。

また、イベント通知📨や自動化機能など、効率的な運用をサポートし、無駄なコスト削減👛や運用負担の軽減にも貢献します！