【AWS】Amazon S3 を徹底的にまとめてみた！

# はじめに
AWSのクラウドストレージである**Amazon S3**は、**AWS上にファイルを保存する際に第一の選択肢となる**サービスです。その普及度の高さから進化も早く、最新機能も含めた全体像の理解は労力が掛かります。

そこで備忘録も兼ねて、**2023年4月時点での機能および使用法**を、初学者でも理解しやすいことを心掛けてまとめました。

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/fad0eef9-254a-aa28-96e9-dc635856fad1.png">

**網羅度**にこだわってまとめたので、「**S3の全体像を理解したい！**」という方は、ぜひご一読頂ければと思います。

また、**S3のセキュリティとバックアップ機能**は**別記事**にまとめたので、よければこちらもご参照ください。

https://qiita.com/c60evaporator/items/ee7def3632eaf493409f

# Amazon S3とは
「Amazon Simple Storage Service」の略です。後ろの3つの単語の頭文字が全て`S`なので、`S3`と略しているようです。

S3は端的に言うと**クラウド上にファイルを保存する**ためのサービスで、Googleドライブのようなオンラインストレージと似ていますが、**オブジェクトストレージ**と呼ばれるやや特殊な形式での保存法を採用しています。
オブジェクトストレージの特徴は以下で分かりやすく解説されていますが、**データの検索性が高い**ことや、OSへの依存性が低いことがメリットのようです。

https://www.fujitsu.com/jp/products/computing/storage/lib-f/tech/beginner/object-storage/

S3はSDKやAPIによるプログラムからのアクセス、ライフサイクルによるファイル保管コスト削減、静的Webサイトホスティングやデータレイク機能等、単なるストレージの枠を超えた**多機能**さが特徴で、AWSの根幹をなすサービスの一つです。

<img width=960 src="https://d1.awsstatic.com/s3-pdp-redesign/product-page-diagram_Amazon-S3_HIW.cf4c2bd7aa02f1fe77be8aa120393993e08ac86d.png">

※画像は[AWS公式](https://aws.amazon.com/jp/s3/)より

## EBSやEFSとの違い
AWSでよく使用されるストレージサービスとして、S3以外に**EBS** (Elastic Block Strage)と**EFS** (Elastic File System)が挙げられるため、これらの違いを考えてみます。

S3は[静的サイトのホスティング](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#静的webサイトのホスティング)に使用される事からも分かるように、それだけで**独立したサービスとして動作する**ストレージであり、クラウドサービスとして独立しているという観点から、DropBoxやGoogleドライブのような存在とみなすと分かりやすいかと思います。

**EBSやインスタンスストア**はOSのイメージが入っていることから分かるように、**EC2インスタンスと一緒に動作する事が前提**となっており、通常のPCで言うと内蔵HDD(SSD)に相当します。

また、もう一つAWSでよく使用されるストレージに[**EFS**](https://aws.amazon.com/jp/efs/)が挙げられ、こちらはEBSのようにEC2にマウントでき、かつ**複数のEC2インスタンスやFargateコンテナから共有ができる**ため、オフィス内の共有ドライブ、すなわち**NASに近い存在と言えます** (捉え方によってはS3とEBSの中間的な存在とみなせる)。またEFSはLambdaやFargate等のEC2以外のコンピューティングサービスでも使用できます。

その他、冗長化やデータの保持形式、コストにも**以下のような差**があります
(KMSによる暗号化ができる等、共通点もあります)

||動作形態|デフォルトの冗長化方法|データ保持形式|東京リージョンでの料金 (1GB・月あたり)|
|---|---|---|---|---|
|**S3**|単独のサービスとして動作|複数AZで冗長化|[オブジェクトストレージ](https://www.redhat.com/ja/topics/data-storage/file-block-object-storage#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%81%A8%E3%81%AF)|0.025USD (S3標準), 0.005USD (Glacier Instant)|
|**EBS**|EC2インスタンスと一緒に動作|単一AZ内で冗長化|[ブロックストレージ](https://www.redhat.com/ja/topics/data-storage/file-block-object-storage#%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%81%A8%E3%81%AF)|0.12USD(gp2 SSD), 0.018USD(sc1 HDD)|
|**EFS**|EC2インスタンスにマウントされる事が多いが、他サービスからも利用可能|複数AZで冗長化|[ファイルストレージ](https://www.redhat.com/ja/topics/data-storage/file-block-object-storage#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%81%A8%E3%81%AF)|0.36USD (標準), 0.0272USD(低頻度)|

上記を見れば分かるように、価格面を見ると**S3はコストパフォーマンスの良いストレージ**と言えるでしょう


# S3の仕組みと各種機能
S3の仕組みと各種機能について、以下のセクションに分けて解説します

- [**S3の構造**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3の構造)
- [**S3の種類 (ストレージクラス)**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3の種類-ストレージクラス)
- [**S3のセキュリティ機能**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3のセキュリティ機能)
- [**バックアップとバージョン管理**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バックアップとバージョン管理)
- [**S3の分析機能 (データレイク)**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3の分析機能-データレイク)
- [**静的Webサイトのホスティング**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#静的webサイトのホスティング)
- [**その他のS3関連機能**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#その他のs3関連機能)

長いですが、**読了する頃には**「**S3[完全に理解した！](https://togetter.com/li/1268851)**」と言えるような記事を目指したいと思います。

以下、詳細を解説します。

## S3の構造
S3では**バケット、オブジェクトの階層構造**でデータを管理します。

またバケットやオブジェクトは仮想化されたサーバ内での構造を表していますが、これら仮想システムが実際に動作する**物理サーバの位置**は、**リージョン、AZ**（アベイラビリティゾーン）により指定する事ができます。

以上を踏まえて、S3のデータ格納構造の概念図を下記します（あくまで概念図であり、厳密な物理構造を表さない事にご注意ください）

**・S3のシステム概念図**
![s3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/650f3df3-bcac-b160-ecb9-dcfb7ecd7cef.png)

それぞれ解説します。

### リージョン
データが実際に保存される地理的な位置を表します。
全世界に数十個のリージョンが存在しますが、日本からの使用頻度が高いリージョンは以下となります。

**・主なリージョン**

|リージョン名|英名|場所|特徴|
|---|---|---|---|
|アジアパシフィック (東京)|ap-northeast-1|日本 東京都|日本国内からの利用では第一の選択肢となる|
|アジアパシフィック (大阪)|ap-northeast-3|日本 大阪府|西日本からの通信遅延（レイテンシ）が少ないが、機能が限定されている（例：[Transfer Acceleration](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#transfer-acceleration)が使用不可）|
|アジアパシフィック (シンガポール)|ap-southeast-1|シンガポール|アジアで最初のリージョン|
|米国東部 (バージニア北部)|us-east-1|米国 バージニア州　　　　|世界で最初のリージョン、費用が安めでサービスが豊富。日本からは通信遅延大|

### アベイラビリティゾーン（AZ）
1つのリージョンは、実は地理的に離れた複数のデータセンターから構成されています。
実際の位置は公開されていませんが、例えば品川区と江東区にサーバが分散されているようなイメージです。

この個々のデータセンターのことをアベイラビリティゾーンを呼び、複数のアベイラビリティゾーンを跨いだ構成（マルチAZ）とすることで、リージョンを跨いだ場合と同様に可用性向上およびデータの消失対策に繋げられます

S3においては、**基本的には3つ以上のAZ間でのレプリケーション**(相互バックアップ)を実施する**マルチAZ構成**となっており、[後述の1ゾーンIA](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3-1ゾーンia)のみ（[参考](https://aws.amazon.com/jp/s3/faqs/)）シングルAZ構成となっています

### バケット
バケットとは、**S3内のファイルを管理する基本単位となるストレージ**を表し、**全世界で一意の名前を付与**する必要があります。

この**バケット単位**で、後述の[**バージョン管理**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バックアップとバージョン管理)や[**セキュリティの設定**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3のセキュリティ機能)が行われます

バケットの中にはさらにフォルダを階層状に作成する事ができ、最下層に[後述のオブジェクト](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクト)が配置されます。
ただし、厳密にはS3にはフォルダ構造は作成されず、ユーザが整理しやすいよう[**「プレフィックス」により仮想的なフォルダ構造**を表現](https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-prefix-nested-folders-difference/))しています (ざっくり用語を理解するのであれば、**S3におけるフォルダ = プレフィックス**とみなしてOKです。以後本記事で「フォルダ」と書いてあれば、「プレフィックス」と同義で使用されていると認識頂ければと思います)

https://dev.classmethod.jp/articles/amazon-s3-folders/

**詳しい機能と設定方法は、後述の[バケットの設定](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケット-1)を参照ください**

### オブジェクト
**オブジェクト**は、端的に言うと**ファイル1つ1つ**を表しています。
画像ファイル(.jpg, .png等)や表データ(.csv, .xlsx)等、普段見かけるファイル(値)に**以下の要素(エレメント)を付与したもの**が、S3内で保管されるオブジェクトとなります。

|エレメント名|概要|
|---|---|
|キー|フォルダ名も含めたオブジェクトのパス (例: 「◯.jpg」「フォルダ名/○.csv」)|
|値|データそのもの(画像ファイルや表データ等)|
|バージョンID|バージョン管理用のID|
|メタデータ|オブジェクトに関する情報を保存するための属性値(名前と値のペア)|
|サブリソース|オブジェクト固有の追加情報を保存する|
|アクセスコントロールの情報|[ACL](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#aclによるアクセス制御)や[バケットポリシー](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#バケットポリシー-リソースベースのポリシー)等のアクセス制御情報|

詳細は以下を参照ください

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

#### ・オブジェクトにアクセスするためのパス
オブジェクトのパスは、以下のような階層構造で表されます (前述のようにフォルダ名は「プレフィックス」とも呼ばれ、複数階層とすることも、フォルダを作成しないことも可能です)

```
バケット名/フォルダ名/オブジェクト名
```
このオブジェクトにアクセスするには、主に以下の**キー**、**S3 URI**、**オブジェクトURL**、**ARN**と呼ばれる表記法が使用されます。

##### キー

フォルダ名とオブジェクト名を合わせて「キー」と呼び、バケット内でオブジェクトを一意に特定する際に使用されます。

```:キーの構文
フォルダ名/オブジェクト名
```

##### S3 URI

[CLI](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#cli)等でオブジェクトにアクセスする際に使用されます。[こちらの例](https://qiita.com/c60evaporator/items/e1fd57a0263a19b629d1#シナリオ4-mlflow-with-remote-tracking-server-backend-and-artifact-stores)のように、Python等のスクリプトからのアクセスでもよく利用されます。

```:S3 URIの構文
s3://バケット名/フォルダ名/オブジェクト名
```

##### オブジェクトURL
HTTPリクエスト(REST API)でオブジェクトにアクセスする際に使用されます

```:オブジェクトURLの構文
https://バケット名.s3.リージョン名.amazonaws.com/フォルダ名/オブジェクト名
```

##### Amazon リソースネーム (ARN)
[IAMポリシー](https://qiita.com/c60evaporator/items/0121399880625cc1de51#can-access-whatの管理-ポリシー)での指定時(Resourceフィールド)等、AWS内の他のリソースからの指定によく使用されます。

```:ARNの構文
arn:aws:s3:::バケット名/フォルダ名/オブジェクト名
```

## S3の種類 (ストレージクラス)
S3へのデータ格納方法には以下のような種類 (**ストレージクラス**)があります（[参考](https://aws.amazon.com/jp/s3/storage-classes/)）

下に行くほど可用性や通信遅延等の性能が低下しますが、その分価格が安くなります
（デフォルトのS3標準が、最も高機能だが高価格）

|名称|耐久性|可用性|可用性SLA|通信遅延|概要|
|---|---|---|---|---|---|
|S3 標準|99.999999999%|99.99%|99.9%|ミリ秒|デフォルト|
|S3 標準IA|99.999999999%|99.9%|99%|ミリ秒|S3標準より安価だが可用性がやや落ちる。アクセス頻度が低いファイル向け|
|S3 Intelligent-Tiering|99.999999999%|99.9%|99%|ミリ秒|オブジェクトのアクセス頻度に合わせ階層を自動切替|
|S3 1ゾーンIA　　|99.999999999%|99.5%|99%|ミリ秒|標準IAのシングルAZ版。より安価だが耐障害性も低下|
|S3 Glacier Instant Retrieval|99.999999999%|99.9%|99%|ミリ秒|安価だが最低料金期間が長め|
|S3 Glacier Flexible Retrieval|99.999999999%|99.99%|99%|分or時間単位|安価だがデータの取出に時間かかる|
|S3 Glacier Deep Archive|99.999999999%|99.5%|99%|分or時間単位|安価だがデータの取出に時間かかる|

ストレージクラスはバケット単位での設定ではなく、バケット作成後に**フォルダ** (プレフィックス)**単位**、または**オブジェクト単位**で**設定**できます。
どのストレージクラスを選ぶかは、以下のフローチャートが参考になります ([後述の**S3のコスト**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3とコスト)も参照ください)

https://dev.classmethod.jp/articles/should_i_choice_s3_storage_class/

以下、それぞれのストレージクラスについて解説します

### S3 標準
**デフォルトで選択される**ストレージクラスです。
「標準」と名前がついていますが、**最も高機能で高価格**なクラスとなっています

複数のAZに冗長化されており、それ以外にも様々な工夫により、99.99%という高い可用性を実現しています。

### S3 標準IA
可用性が99.9%とS3標準よりやや低いですが、それ以外はほぼ同等の機能(複数AZでの冗長化等)を持ったタイプです。

可用性以外のS3標準との差として、**データ保存の料金が安い**代わりに、**30日最低料金やデータ取出料金**が設定されている事が挙げられます。
保管コストが安くアクセスコスト高いという特性から、**アクセス頻度が低く**、かつ**ある程度長期保管が想定される**ファイルの格納に向いています。

### S3 Intelligent-Tiering
**アクセス頻度に合わせ**、「高頻度にアクセスするファイル→高性能だが料金の高い階層」「アクセス頻度の低いファイル→低性能だが料金の低い階層」というように**階層を自動で振り分ける**、賢い(Intelligentな)ストレージクラスです。
これにより使用頻度に応じて**コストとパフォーマンスのバランスを自動で調整**する事ができます。

具体的には、以下の階層を自動で遷移します ([参考](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/intelligent-tiering-overview.html))

- **高頻度アクセス階層**: S3標準と同等
- **低頻度アクセス階層**: 30日以上アクセスがないと移行。S3標準IAに相当
- **インスタントアクセス階層**: 90日以上アクセスがないと移行。S3 Glacier Instant Retrievalに相当 
- **アーカイブアクセス階層**: 90-730日以上アクセスがないと移行。S3 Glacier Flexible Retrievalに相当 (オプション)
- **ディープアーカイブアクセス階層**: 180-730日以上アクセスがないと移行。Glacier Deep Archiveに相当 (オプション)

ディープアーカイブアクセス階層のみオプションで、有効化するためにはバケット作成時に指定する必要があります。
また低頻度アクセス、インスタントアクセス階層はファイルにアクセスがあると自動的に高頻度アクセス階層に戻されますが、アーカイブ、ディープアーカイブアクセス階層は[階層を戻すための操作](https://docs.aws.amazon.com/AmazonS3/latest/userguide/restoring-objects.html)が必要です。

なお、Intelligent-Tieringと似た機能に「ライフサイクルルール」が挙げられますが、詳細は[こちら](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#ライフサイクルルール)を参照下さい

#### ・Intelligent-Tiering Archive 設定
S3 Intelligent-Tieringのアーカイブアクセスおよびディープアーカイブアクセス階層はオプションのため、有効化するためには[バケットの設定](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケット-1)から事前に設定を行う必要があります。

以下のように、両階層の有効無効と、その階層に移行するまでの日数 (連続してこの日数アクセスされないオブジェクトが移行)を指定する事ができます。

<img width=540 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/16dd4198-34c5-94ec-c863-062516a9ea69.png">

### S3 1ゾーンIA
S3 標準IAから、複数AZでの冗長化を抜いたものに相当します。
料金は標準IAよりも安いですが、冗長化されていないために消えると困るファイルは置かない方が無難です。

**アクセス頻度が低く**、かつ可用性やデータの消失対策の必要性が低い用途に向いています

### S3 Glacier Instant Retrieval
可用性99.9%や複数AZでの冗長化等、**S3標準IAと似た機能**を持っていますが、最低料金期間が90日と長く、より**長期保存が前提となるファイルの保存**に向いたクラスと言えます。

[公式ドキュメント](https://aws.amazon.com/jp/s3/storage-classes/#Instant_Retrieval)では、各種バックアップや医療用画像等、「**アクセス頻度は低いが、いざという時すぐにアクセスできる必要のあるファイル**」の保存に向いていると書かれています。

基本的にはコストパフォーマンスの良いストレージクラスですが、[後述のようにGETやPOSTリクエストによるアクセスコスト](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3とコスト)は高めなのでご注意ください。

### S3 Glacier Flexible Retrieval
S3 Glacier Instant Retrievalと名前が似ていますが、最大の差は**データの取り出しに数分〜数時間掛かる**事です。
よって、**すぐにアクセスできる必要のある用途には向きません**。

その分料金は安く設定されているので、**古いバージョンのバックアップの保管**等に向いています

なお、本クラスでのデータ取り出し方法には、数分で取り出せるが料金が高めの「迅速取り出し」と、3〜5時間を要するが料金が安めの「標準取り出し」、最大12時間を要するが料金が最安の「大容量取り出し」の3種類が存在します。

### S3 Glacier Deep Archive
S3 Glacier Flexible Retrievalよりもさらに取り出し時間が長く、最大12時間程度かかってしまいます。
よって、**すぐにアクセスできる必要のある用途では使用できません**。

一方で料金はS3の中でも最安で、S3標準と比べると90%以上の割引となります。**古いバージョンのバックアップの保管**を格安で実現したい場合に有効なクラスです


## S3のセキュリティ機能
S3は大容量データを保管するという性質上、当然**機密情報が含まれる**ケースを想定しなければなりません。

例えば、[2021年に巷を騒がせた免許証流出](https://www.itmedia.co.jp/news/articles/2108/12/news139.html)も、(S3かは不明ですが)クラウドストレージで保管されていた機密情報への不正アクセスに起因しており、より厳しいセキュリティ対策が必要であることが記事中でも結論づけられています。

このような機密情報を守るためにS3は**以下のセキュリティ機能**を持ち、**適切な利用によりセキュリティ強度を高める**事ができます。

|名称|概要|
|---|---|
|[**ポリシーによるアクセス制御**](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#ポリシーによるアクセス制御)|バケットに**アクセスできるユーザーやアプリケーションを制限**する|
|[**ACLによるアクセス制御**](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#aclによるアクセス制御)|バケットやオブジェクトに**アクセスできるAWSアカウントを制限**する|
|[**データの暗号化**](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#データの暗号化)|バケットに格納されたオブジェクトを**暗号化**する|
|[**ブロックパブリックアクセス**](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#ブロックパブリックアクセス)|**インターネットからのアクセス**を禁止する|
|[**署名付きURL**](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#署名付きurl)|**時間制限**付きで**外部にオブジェクトを公開するURL**を発行|
|[**CORS**](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#cors)|オリジン以外のドメインからのデータ取得を許可する|
|[**S3のアクセスアナライザー**](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#s3のアクセスアナライザー)|**外部からのアクセスが可能**なセキュリティリスクの高い**バケットを検知**|
|[**アクセスログの記録**](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#アクセスログの記録)|アクセスログを**S3サーバーログ**や**CloudTrail**で記録|

**詳細は以下の別記事**にまとめましたので、各機能の詳細は**リンク先を参照してください**

https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#s3のセキュリティ機能

<br>
<br>

## バックアップとバージョン管理
[前述のように](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#アベイラビリティゾーンaz)、S3はマルチAZ構成による冗長化 (1ゾーンIAを除く)が行われており、デフォルトでも高い可用性、データ消失対策を実現できています。

よってS3はデータの**バックアップ用途**に使用される事が多いですが、**以下の機能を活用**することで、**バックアップとしての利便性向上**や**保管コストの削減**に繋げる事ができます。

|名称|概要|
|---|---|
|[**クロスリージョンレプリケーション**](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#クロスリージョンレプリケーション-crr)|リージョンを跨ぐバケットのレプリケーションを実施|
|[**バケットのバージョニング**](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#バケットのバージョニング)|バケット内のオブジェクトをバージョン管理する|
|[**ライフサイクルルール**](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#ライフサイクルルール)|時間経過に応じてオブジェクトクラスやバージョンを自動移行する|

**詳細は以下の別記事**にまとめましたので、各機能の詳細は**リンク先を参照してください**

https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#バックアップとバージョン管理

<br>
<br>


## S3の分析機能 (データレイク)
**S3の重要なユースケース**の一つとして、**データレイク**が挙げられます。

データレイクとは構造化、非構造化を問わず様々な形式のデータを大量に保管するための仕組みで、主に**ビッグデータ分析**に用いられます。

AWSにおいてはS3がこのデータレイクの役割を果たしており(Hadoop互換の分散ファイルシステムに対応)、**S3に格納された**テキスト、CSV、Parquet形式等の**データと以下のサービスを組み合わせる**事で、**大量データに対する高速分析**を実現する事ができます。

|名称|概要|ユースケース
|---|---|---|
|[**S3 Select**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3-select)|**S3に保存された**CSV, JSON, Parquet形式**データに対しSQLクエリ**によるデータ取得・分析が可能|簡単なデータ分析|
|[**Athena**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#athena)|**S3に保存されたデータに対しSQLクエリ**によるデータ取得・分析が可能 (**S3 Selectより高機能**)|高機能なデータ分析|
|[**Redshift Spectrum**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#redshift-spectrum)|**S3に保存されたデータ**に対し、**Redshiftによる直接クエリ**実行・分析が可能|Redshiftの技術資産を活用したデータ分析|
|[**EMR**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#emr)|**Apache Spark**等の分散データ処理フレームワークを利用して**高速ビッグデータ分析**が可能|Sparkを活用した高速データ分析|

データレイクについては[後日詳細な記事を作成]()しますが、ここではそれぞれ簡単に解説します

### S3 Select
S3に保存されたCSV, JSON, Parquet形式のデータ (GZIPやBZIP2による圧縮データでもOK)に対して、**SQLクエリによるデータ取得**ができる機能です。

単純にデータの集計や分析が出来る事以外にも、クエリでフィルタリングした後のデータのみを取得できるため、通信コストやデータ取得時間を抑えられるというメリットもあります。

コンソールからは以下のようにオブジェクトを開いた状態で「オブジェクトアクション」→「S3 Selectを使用したクエリ」で実行できます

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/43afe667-2450-f6d2-1935-43b7e672389c.png>

コンソールだけでなく[Rest APIやSDK経由でプログラムからも実行できる](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/using-select.html)ので、S3からのデータ取得時間・コストを抑えたい場合の選択肢の一つとして検討しても良いかと思います。

詳細は以下の公式ドキュメントを参照ください

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/selecting-content-from-objects.html

### Athena
S3 Selectと同様に、**S3に保存されたデータに対してクエリによるデータ取得**ができるサービスですが、**S3 Selectよりも高機能**で、以下のような違いがあります。

・CSV, JSON, Parquet形式以外にも、txt等多数のデータ形式に対応
・対応する圧縮形式もS3 Selectより多い
・S3とは独立したサービスのため、S3以外のデータソースにも対応 ([AWS Glueデータカタログ](https://docs.aws.amazon.com/ja_jp/glue/latest/dg/catalog-and-crawler.html)により接続)

### Redshift Spectrum
**Redshift Spectrum**は、**S3等に保存されたデータに対して直接Redshiftのクエリを実行**できる機能です。

AWS上に分析用DBを構築する場合、データウェアハウス (DWH)であるRedshiftを用いる事が第一の選択肢となります。
S3上のデータをRedshiftで分析する場合、旧来はデータを整形してRedshift上のテーブルにコピー [(Extract, Transform, Load = ETL)](https://pages.awscloud.com/rs/112-TZM-766/images/AWS_ETL_services_tips_202107.pdf)する必要がありましたが、Redshift Spectrumを用いることでこのようなETLシステム構築の手間を省くことができます。

**ログ等の大規模データの分析**に用いるという点で**ユースケースがAthenaと近く**、両者の使い分けには以下の記事が参考となります。

https://www.integrate.io/jp/blog/amazon-redshift-spectrum-vs-athena-a-detailed-comparison-ja/

まとめると**以下のようなメリットデメリット**が得られそうです。

||Redshift Spectrum|Athena|
|---|---|---|
|メリット|Redshiftの機能をそのまま活用できる (Redshiftユーザなら学習コスト低)|サーバーレスのためクラスタの維持費が掛からない|
|デメリット|クラスタを常時起動するための維持費がかかる|Athena独自機能に対する学習コストが掛かる|

なお、サーバーレスかつDWHであるBigQueryの技術資産を流用できる、ある意味両者の良いとこ取りとも言えるGoogle Cloudの**BigQuery Omni**も、マルチクラウドを許容できるのであれば選択肢に入れても良いかと思います。

https://blog.g-gen.co.jp/entry/bigquery-omni-trial

### EMR
EMRは、**Apache Spark**、Apache Hive、Presto 等の分散データ処理フレームワークを利用して高速ビッグデータ分析を実現できるサービスです。

EMRではクラスターと呼ばれる処理用のノード (実体はEC2インスタンス)を複数立ち上げ、これらを分散処理フレームワークで制御 ([YARNの記事](https://qiita.com/keigodasu/items/09f7e0a15d721b0b5212)が参考になります)する事で、分散高速処理の恩恵を受けられるサービスです。
狭義の「データレイク」はこのような分散処理フレームワークを指すことが多いので、Redshiftと並んでAWSにおけるビッグデータ分析の王道のサービスと呼べるでしょう。

これだけ聞くと仰々しく感じますが、SparkはPython(PySpark)等の**SDKを利用する事で簡易に分析スクリプトを作成**する事ができるため、**手軽に数千万行クラスのデータの高速分析**を実現する事ができます。

具体例としてS3 + EMR + PySparkでの実装法を別記事で紹介したいと思います。


## 静的Webサイトのホスティング
**S3でよく利用される機能**として、**静的Webサイト** (DBアクセスのようなサーバーサイド処理をを持たないWebサイト)の**ホスティング**が挙げられます。

S3をホスティングに使用すると[ストレージやリクエスト等の料金](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3とコスト)が掛かりますが、これらは一般的にEC2やFargateのような**コンピューティングサービスと比べ維持費が低額**なため、**低コストでWebサイトを公開**する事ができます。

また、ブラウザからAPIでデータを直接取得する**SPA構成**とする事で**サーバーサイド処理を有効化**できたり、**CloudFrontと組み合わせて配信を高速化**したりと、利便性を向上させる機能を数多く備えており、これらとサーバーレスサービス等を併せて活用する事で**低コストかつ高速な動的サイトの構築**まで実現できてしまいます。

詳細は実装法も交えて別記事で紹介したいと思います。

[後日公開]()


## その他のS3関連機能

|名称|概要|
|---|---|
|[**S3 Inventory**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3-inventory)|**バケット内のオブジェクト一覧**を**定期的に出力**する|
|[**オブジェクトLambdaアクセスポイント**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクトlambdaアクセスポイント)|**S3 Object Lambda**(S3へのリクエスト時にLambdaで動的な処理を加える)を使用するためのアクセス経路を作成する|
|[**バッチオペレーション**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バッチオペレーション)|**大量のオブジェクトに対して特定の処理** (Lambda等)を**一括実行**|
|[**イベント通知**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#イベント通知)|S3バケットへのイベント(オブジェクト作成、削除等)発生時に、Lambda、SNS、SQSいずれかによる処理を自動実行|
|[**Transfer Acceleration**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#transfer-acceleration)|**インターネットからS3へのデータアップロード**時に、最寄りのAWSの拠点を経由することで**転送速度を高速化**|
|[**AWS Storage Gateway**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#aws-storage-gateway)|オンプレ側のストレージ機能（外付けSSD、NAS、テープストレージ等）をクラウド側のストレージ（S3、EBS等）で置き換え、併用するためのサービス|


### S3 Inventory
バケット内のオブジェクト一覧を定期的に出力してくれる機能です。

具体的な使用手順は、以下の記事が分かりやすいです。

https://dev.classmethod.jp/articles/s3-inventory-reinvent/

なお、ここで出力されるmanifest.jsonは、後述の[バッチオペレーション](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バッチオペレーション)でも使用する事ができます。

<br>

### オブジェクトLambdaアクセスポイント
**GETリクエストでS3からデータを取得**する場合、通常は格納されていたデータをそのまま(静的に)返します。

これに対し、**S3 Object Lambda**と呼ばれる機能を使用する事で、**データを動的に処理した上で返す**事ができます。
このS3 Object Lambdaを使用するためには、S3とLambdaとのアクセスを疎通 ([参考](https://engineers.fenrir-inc.com/entry/2022/04/20/104220))させるために**オブジェクトLambdaアクセスポイント**が必要となり、本画面でこのアクセスポイントを作成する事ができます。

[公式リリース](https://aws.amazon.com/jp/about-aws/whats-new/2021/03/s3-object-lambda-allows-you-to-add-your-own-code-to-s3-get-requests-to-modify-and-process-data-as-it-is-returned-to-an-application/)では、S3 Object Lambdaのユースケースとして以下が例示されています（1つ目のユースケースは[前述のデータレイク機能と近いと言えます](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3の分析機能-データレイク)）

- 行のフィルタリング
- 画像の動的なサイズ変更
- 機密データの編集

具体的な使用法は以下の記事が参考になります

https://dev.classmethod.jp/articles/s3-object-lambda/

<br>

### バッチオペレーション
**バッチオペレーション**とは、**大量のオブジェクトに対して特定の処理を一括実行**できる機能です。

データコピーのようなシンプルな処理から、Lambdaを利用した自由度の高い処理まで様々な処理を実現でき、[オブジェクト一括暗号化](https://aws.amazon.com/blogs/storage/encrypting-objects-with-amazon-s3-batch-operations/)等、公式に利用が推奨されているユースケースも存在します。

バッチオペレーションの実行単位を**ジョブ**と呼び、以下の内容を指定することで処理を定める事ができます

- マニフェスト：処理対象のオブジェクトを指定
- オペレーション：処理内容を指定
- 追加のオプション：必要なロール等を指定

#### ・マニフェスト
**マニフェスト**とは、**処理対象のオブジェクトを指定**するためのファイルです。
以下の3形式で指定する事ができます

|名称|概要|
|---|---|
|S3インベントリレポート(manifest.json)|JSON形式で対象オブジェクトを指定|
|CSV|CSV形式で対象オブジェクトを指定|
|レプリケーション|コンソールで対象オブジェクトを指定(レプリケーション処理のみ対応)|

それぞれ解説します

##### S3インベントリレポート(manifest.json)
JSON形式で対象オブジェクトを指定します。
manifest.jsonを1から自分で作成するのは大変なので、前述の[S3 Inventory](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3-inventory)を使用すると便利です。

以下の記事が参考になります

https://dev.classmethod.jp/articles/try-amazon-s3-batch-operations/

##### CSV
CSV形式で対象オブジェクトを指定します。

以下のように、バケット名と[オブジェクトのキー](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#キー)を列に持ったシンプルな記述で指定が可能です
(オプションでバージョンIDの列も追加可能ですが、この場合「マニフェストにはバージョン ID が含まれています」をチェックしてください)

```csv
バケット名1,オブジェクト1のキー
バケット名1,オブジェクト2のキー
:
バケット名2,オブジェクト○○のキー
:
```

##### レプリケーション
処理内容(オペレーション)がレプリケーションの時のみ、コンソール画面から対象オブジェクトを指定する事もできます。

バケットを選択した上で、指定日付でフィルタリングした作成日範囲のオブジェクトが処理対象となります

#### ・オペレーション
マニフェストで指定したオブジェクトに対して**実行する処理**を選択します。
実際の選択画面は以下のようになっており、コピーやLambda、ACLの置き換え等が選択できます。
(最後の「レプリケート」はマニフェストでレプリケーションを指定した時のみ指定可能です)

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/ea7e6a91-166c-c06b-d50f-b099d981954f.png">

#### ・追加のオプション
追加のオプションでは完了レポートの出力やタグなども指定する事ができますが、何より重要なのが**IAMロールの付与**です。

**オペレーションで指定した処理が実行できるポリシー**を作成(または既存のポリシーから選択)し、これをIAMロールに付与してください。ここが間違っているとバッチ処理が実行できません。
IAMロールとポリシーについては以下の記事をご参照ください (むやみな管理者権限の付与は厳禁です)

https://qiita.com/c60evaporator/items/0121399880625cc1de51

このポリシー作成は結構テクが必要ですが、
「作成したポリシーを付与したユーザーでオペレーションの処理と同等の操作を実行できるか」
を都度確認すれば、正しいポリシーを効率よく作成できるかと思います。

<br>

### イベント通知
**S3バケットに対してイベント**(オブジェクトの作成、削除、ライフサイクルルール移行等)が**発生した際**に、Lambda(汎用的なサーバーレス処理)、SNS(Eメール等)、SQS(他アプリへのメッセージ送信)いずれかによる**処理を自動実行**する事ができます。
(プレフィックス、サフィックスで対象フォルダやオブジェクトを限定できます)

具体的な使用法は、以下の記事が参考になります

https://dev.classmethod.jp/articles/lim-s3-event-notifications/

### Transfer Acceleration
**Transfer Acceleration**とは、**インターネットからS3へのデータアップロード**時に、最寄りのAWSの拠点 (CloudFrontのエッジロケーション)を経由することで**転送速度を高速化**する機能です。

詳細は以下QAで簡潔にまとめられています。

https://aws.amazon.com/jp/s3/faqs/#s3ta

### AWS Storage Gateway

**オンプレ側のストレージ機能をクラウド側のストレージ**（S3、EBS等）で**置き換える**（あるいは併用する）ためのサービスです。クラウドストレージをあたかもオンプレのストレージであるかのように扱えるため、社内システムにおけるファイルサーバやバックアップ、アプリケーションサーバのストレージを、**最小限の改造**でS3等のクラウドストレージに置き換える事ができます。

![スクリーンショット 2023-03-12 1.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/d6c905cb-1886-7f8a-d1f1-7b7bc5cf25c5.png)

用途に応じてオンプレ側のゲートウェイの種類を以下から選択します

|ゲートウェイ名|オンプレ側の接続プロトコル|主な想定用途|
|---|---|---|
|ファイルゲートウェイ|NFS, SMB|ファイルサーバ|
|ボリュームゲートウェイ|iSCSI|アプリケーションサーバのストレージ|
|テープゲートウェイ|iSCSI VTL|バックアップ|

それぞれ解説します

#### ・ファイルゲートウェイ

ファイルサーバのプロトコルとしてよく利用されるNFS、SMBを用い、オンプレサーバからS3上にファイルを保存する事ができます（S3のオブジェクトとして保存される）。これにより**S3を**ネットワーク上のファイルサーバ、すなわち**NASのように使う**事ができます。

S3を用いることでオンプレのNASと比べ、容量が無制限になる事や維持管理の手間を低減できる事がメリットとしてあげられます。

ファイルゲートウェイには「S3 ファイルゲートウェイ」「FSx ファイルゲートウェイ」がありますが、クラウド側のストレージにS3を用いる場合は前者を、Windowsのファイルシステム（Amazon FSx for Windows）を用いる場合は後者を使用します。

またS3のようなクラウドストレージへのアクセスはインターネットを経由するため、原理上どうしても速度が落ちて（レイテンシが長くなって）しまいますが、オンプレ側のファイルゲートウェイにキャッシュを設けてよく使うデータを格納しておく事で、この速度低下を防ぐ事ができます。

https://aws.amazon.com/jp/storagegateway/file/?nc=sn&loc=2&dn=2

#### ・ボリュームゲートウェイ

テープストレージによるバックアップで一般的に用いられるiSCSI VTLを用いて、仮想的なテープストレージをS3上に構築する事ができます。長期バックアップ用途を想定しており、**オンプレミスアプリケーションを書き直す事なくストレージをS3に置き換えられる**事がメリットして挙げられます。

ファイルゲートウェイと同様に、キャッシュを用いる事でよく使うデータのアクセス速度を向上させる事もできます。

https://aws.amazon.com/jp/storagegateway/vtl/?nc=sn&loc=2&dn=3

#### ・テープゲートウェイ

iSCSIプロトコルを用いて、オンプレ側からファイルをS3上のオブジェクトとして保存する事ができます。主にアプリケーションサーバのストレージとしての用途を想定しており、**既存のバックアップワークフローを変更することなく、バックアップ用のテープストレージをS3に置き換えられる**事がメリットしてあげられます。

ファイルゲートウェイと同様に、キャッシュを用いる事でよく使うデータのアクセス速度を向上させる事もできます。

https://aws.amazon.com/jp/storagegateway/vtl/?nc=sn&loc=2&dn=3

<br>
<br>

# S3とコスト
S3はEC2やFargateのようなコンピューティングサービスと比べると低料金で利用できる場合が多いですが、それでも大量のデータを保持するとそれなりのコストが掛かります。

具体的には、**以下のリソース・操作にコストがかかります**

- **ストレージ**
- **リクエストとデータ取り出し**
- **データ転送** (外向き通信のみ。内向き通信は無料)
- **管理と分析** ([ストレージクラス分析](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#ストレージクラス分析)等)
- **レプリケーション**
- **S3 Object Lambda**

上記コストは**ストレージクラスごとに異なる**ため、以下に**重要項目を抜粋して記載**します。
ざっくり把握しておくと良いでしょう。

|名称|東京リージョンでのストレージ料金(2022/7)|最低利用期間|データ取り出し|GETリクエスト(1000リクエストあたり)|POSTリクエスト(1000リクエストあたり)|
|---|---|---|---|---|---|
|S3 標準|0.023-0.025USD/GB月|なし|無料|0.00037USD|0.0047USD|
|S3 標準IA|0.0138USD/GB月|30日|0.01USD/GB|0.001USD|0.01USD|
|S3 Intelligent-Tiering|0.002-0.025USD/GB月(階層により変化)|30日|無料(アーカイブアクセス迅速取出以外)|0.00037USD|0.0047USD|
|S3 1ゾーンIA　　|0.011USD/GB月|30日|0.01USD/GB|0.001USD|0.01USD|
|S3 Glacier Instant Retrieval|0.005USD/GB月|90日|0.03USD/GB|0.01USD|0.02USD|
|S3 Glacier Flexible Retrieval|0.0045USD/GB月|90日|0.011-0.033USD/GB|0.0037USD|0.03426USD|
|S3 Glacier Deep Archive|0.002USD/GB月|180日|0.005-0.022USD/GB|0.0037USD|0.065USD|

上表以外にも、**PUT等のHTTPリクエスト**や**無料枠100GBを超えるインターネットへのデータ転送**、**レプリケーション**等にも料金がかかります。詳細は以下の公式ドキュメントを参照ください

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

コスト削減のためには、**適切なストレージクラスを選択**したり、前述の[**Intelligent-Tiering**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3-intelligent-tiering)や[**ライフサイクルルール**](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#ライフサイクルルール)の**活用**が有効です。

コスト削減施策を検討する上で現状のコスト分析が重要となるため、以下で解説します。

## コスト削減に利用できる分析機能
適切なライフサイクルールやストレージクラスの設定を判断するには、以下の**ストレージクラス分析**、**Storage Lens**による分析が便利です。

### ストレージクラス分析
バケット内のオブジェクトへのアクセス頻度を分析し、適切なライフサイクルルールやストレージクラス選択の参考にする事ができます。

アクセス頻度が対象という特性上、特にライフサイクルルールにおける**S3 標準から下位のバケットへの移行タイミング**を判断する上で便利な機能です
(例: アクセス頻度が減ってくるタイミングをS3 標準からS3 標準IAへの移行タイミングとする)

詳細は以下の記事を参照ください

https://dev.classmethod.jp/articles/introducing-s3-analysis/

### Storage Lens
**Storage Lens**は、リージョン、ストレージクラス、バケット、およびプレフィックス別に、**格納されたデータに対する各種統計情報**を**ダッシュボードで可視化**できる機能です。

例えば、デフォルトで準備されているダッシュボードでは、下図のように合計容量、オブジェクト数等が表示されます。

<img width=720 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/dd9fba1c-248e-d497-d114-fa6a6dde1ffc.png">

格納されたデータのサマリーを効率よく確認できるよう、自作のダッシュボードを作成すると便利でしょう

詳細は以下の記事が参考になります。

https://dev.classmethod.jp/articles/amazon-s3-storage-lens/

## リクエスタ支払い
リクエスト関係の料金 (上記GET、POSTなど)は、**通常はバケットを保有するアカウントに請求されます**。

これに対し、**リクエストを実行したアカウントに請求**する仕組みを、**リクエスト支払い**と呼びます。
リクエスタ支払いは[後述のバケット設定画面](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケット-1)から設定する事ができます。


<br>
<br>

# S3コンソール画面の見方
AWSコンソールにログインしてS3のサービスに入ると、以下のような画面が表示されます。

<img width=640 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/9bcc29f8-6d21-df6e-b0e9-701aa1fcbfcf.png">

S3の操作は基本的に上図の「左側のタブ」（ナビゲーションペイン）から行うため、各項目について解説します。

## バケット
バケットの一覧が表示されています。

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/fc4692e0-ab53-4c00-76c0-5d0f20b1bb0a.png">

**S3の機能の多く**は、この**バケットの設定画面から指定**することで実現できるため、詳細を解説します。

バケットの設定画面は、以下の6つのタブからなります
<img width=640 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/58bdd8df-bfbc-f928-c362-0406f1841366.png">
**・タブ一覧**

|タブ名|サブ項目|
|---|---|
|オブジェクト|オブジェクト|
|プロパティ|バケットの概要<br>バケットのバージョニング<br>タグ<br>デフォルトの暗号化<br>Intelligent-Tiering Archive設定<br>サーバーアクセスのログ記録<br>AWS CloudTrail データイベント<br>イベント通知<br>Transfer Acceleration<br>オブジェクトロック<br>リクエスタ支払い<br>静的ウェブサイトホスティング|
|アクセス許可|アクセス許可の概要<br>ブロックパブリックアクセス<br>バケットポリシー<br>オブジェクト所有者<br>ACL<br>CORS|
|メトリクス|バケットメトリクス<br>ストレージクラス分析<br>レプリケーションメトリクス|
|管理|ライフサイクルルール<br>レプリケーションルール<br>インベントリ設定|
|アクセスポイント|アクセスポイント|

タブ毎に内容を解説します

### 「オブジェクト」タブ
バケット直下のオブジェクト、フォルダを一覧表示します。
フォルダ名をクリックすると、フォルダ内のオブジェクト、フォルダが再帰的に表示されます。

<img width=640 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/abec6674-ed25-df81-e4a3-65f76f3cd5c9.png">

<br>

### 「プロパティ」タブ
バケットに関する各種設定を変更できます。
セキュリティ、メトリクス、ライフサイクル系以外の機能はここから設定可能です (**以下一覧**)

|サブ項目名|概要|
|---|---|
|[バケットの概要](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケットの概要)|バケットのリージョン、ARN、作成日を表示|
|[バケットのバージョニング](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケットのバージョニング)|[バケットのバージョニング](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#バケットのバージョニング)の有効無効を設定|
|[タグ](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#タグ)|バケットにタグ付けして整理し、追跡や監視等に使用|
|[デフォルトの暗号化](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#デフォルトの暗号化)|[データの暗号化](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#データの暗号化)をデフォルトで適用するかを設定|
|[Intelligent-Tiering Archive設定](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#intelligent-tiering-archive設定)|[S3 Intelligent-Tieringストレージクラス](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3-intelligent-tiering)のオプション階層設定|
|[サーバーアクセスのログ記録](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#サーバーアクセスのログ記録)|[S3サーバーログ](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#アクセスログの記録)の有効無効を設定|
|[AWS CloudTrail データイベント](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#aws-cloudtrailデータイベント)|[CloudTrailによるログ記録](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#アクセスログの記録)の作成と管理を実施|
|[イベント通知](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#イベント通知-1)|バケット内のイベント発生をトリガーとしたLambda,SNS,SQSによる自動処理実行を設定|
|[Transfer Acceleration](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#transfer-acceleration-1)|Transfer Accelerationによるバケットへのデータアップロード高速化有無を設定|
|[オブジェクトロック](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクトロック)|[オブジェクトロック](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#オブジェクトロック)の有無を確認|
|[リクエスタ支払い](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#リクエスタ支払い-1)|[リクエスタ支払い](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#リクエスタ支払い)の有効無効を設定|
|[静的ウェブサイトホスティング](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#静的ウェブサイトホスティング)|[静的ウェブサイトホスティング](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#静的webサイトのホスティング)の有効無効を設定|

それぞれ解説します

#### ・バケットの概要
バケットのリージョン、ARN、作成日を表示します

<img width=640 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/ad1e2476-7bfd-50e0-5077-331fd3f44df3.png">

#### ・バケットのバージョニング
前述の[バケットのバージョニング](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#バケットのバージョニング)の有効無効を設定します。

<img width=640 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/929b033f-fc3e-8c7a-554b-2ad56af61854.png">

[MFA Delete](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#mfa-delete)はコンソールからは設定できず、CLIからの設定が必要です ([参考](https://dev.classmethod.jp/articles/s3-mfa-delete/))

#### ・タグ
バケットにタグ付けして整理することで、ストレージコストやその他の基準追跡に利用できます。

#### ・デフォルトの暗号化
[**データの暗号化**](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#データの暗号化)を**デフォルトで適用するか**を設定できます。

<img width=480 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/6618c19f-8ed7-e1f5-e7ce-a31ab3b6fc72.png">

設定可能な項目は以下となります。

- 指定できるのは[SSE-S3](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#sse-s3)および[SSE-KMS](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#sse-kms)のみ ([SSE-C](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#sse-c)および[クライアント側の暗号化](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#クライアント側の暗号化)は指定不可)
- SSE-KMSを指定した場合、[AWS管理キー](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#aws管理キー-awss3)、[カスタマーマネージドキー](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#aws管理キー-awss3)から鍵を選択可
- SSE-KMSを指定した場合、 [S3バケットキー](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#s3バケットキー)を指定可 (上図の「バケットキー」が相当)

暗号化を有効にした場合、新たにアップロードされたオブジェクトに指定した暗号化が適用されますが、**有効化前から存在するオブジェクトには暗号化が適用されません** (このような暗号化されないオブジェクトは、[バッチオペレーション](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バッチオペレーション)による[暗号化が便利です](https://aws.amazon.com/blogs/storage/encrypting-objects-with-amazon-s3-batch-operations/))

#### ・Intelligent-Tiering Archive設定
[**S3 Intelligent-Tiering**ストレージクラス](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3-intelligent-tiering)においてオプション指定となっている「**アーカイブアクセス階層**」「**ディープアーカイブアクセス階層**」の**有効無効を設定**できます。

<img width=480 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/d8318af8-6a4c-a9bc-6706-0072a9c68c20.png">

有効とした場合、以下の項目を設定する事ができます

- プレフィックスによる対象フォルダの限定
- タグによる対象オブジェクトの限定
- 対象階層に移行するまでの日数

#### ・サーバーアクセスのログ記録
[アクセスログの記録](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#アクセスログの記録)のうち、**S3サーバーログ**の有効無効を指定する

<img width=480 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/36d26ce3-99a0-41e0-5214-d56403d14871.png">

#### ・AWS CloudTrailデータイベント
[アクセスログの記録](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#アクセスログの記録)のうち、**CloudTrailによるログ記録**の作成と管理を実施します。

「CloudTrailで設定する」をクリックするとCloudTrailのコンソール画面に飛ぶので、「証跡の作成」をクリックして保存先のバケットやKMSエイリアスを指定したのち、
以下の「ログイベントの選択」から

- イベントタイプ：データイベント
- データイベントタイプ：S3
を選択する事で、CloudTrailによるログ記録を実現できます

<img width=480 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/45add935-ae00-6d6b-f344-172b1b88b0b8.png">

#### ・イベント通知
前述の[イベント通知](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#イベント通知)を作成・一覧表示・変更します。

#### ・Transfer Acceleration
前述の[Transfer Acceleration](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#transfer-acceleration)の有効無効を設定できます。

#### ・オブジェクトロック
[オブジェクトロック](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#オブジェクトロック)の有無を確認できます

オブジェクトロックの有無指定は[バケット作成時](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#詳細設定)のみ設定できるため、本項目では確認のみ可能です。

#### ・リクエスタ支払い
前述の[リクエスタ支払い](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#リクエスタ支払い)の有効無効を設定できます。

#### ・静的ウェブサイトホスティング
[静的ウェブサイトホスティング](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#静的ウェブサイトホスティング)の有効無効を設定できます。

<br>

### 「アクセス許可」タブ
以下のセキュリティ関係の設定を行います。

|サブ項目名|概要|
|---|---|
|[アクセス許可の概要](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#アクセス許可の概要)|バケットが外部に公開されているかを表示|
|[ブロックパブリックアクセス](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#ブロックパブリックアクセス)|[ブロックパブリックアクセス](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#ブロックパブリックアクセス)の有効無効を設定|
|[バケットポリシー](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケットポリシー)|バケットポリシーを作成・変更|
|[オブジェクト所有者](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクト所有者)|ACLの有効無効を設定。有効の場合はオブジェクトの所有者を選択|
|[アクセスコントロールリスト (ACL)](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#アクセスコントロールリスト-acl)|[ACLによるアクセス制御](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#aclによるアクセス制御)を設定|
|[Cross-Origin Resource Sharing (CORS)](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#cross-origin-resource-sharing-cors)|[CORS](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#cors)設定を作成・変更する|

#### ・アクセス許可の概要
バケットが外部に公開されているかを表示します。
以下の3パターンの表示でバケットの公開状況を確認する事ができます（各状態の違いは[こちらの記事](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#ブロックパブリックアクセス)を参照下さい）

・[ブロックパブリックアクセス](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#ブロックパブリックアクセス)が設定されている場合（バケットは**一般公開されない**）

<img width=220 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/18bca3d0-f57c-81ad-5cb5-571226359b8e.png">

・ブロックパブリックアクセスが設定されていないが、ポリシーやACLでパブリックアクセスが無効化されている場合（バケットは**一般公開されない**）

<img width=360 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/8d1a59f4-7159-5492-c58d-7aa3952320ce.png">

・ブロックパブリックアクセスが設定されておらず、ポリシーやACLでもパブリックアクセスが有効化されている場合（バケットは**一般公開されている**）

<img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/2e80effc-923c-f360-1b20-e8f082cefdd0.png">

#### ・ブロックパブリックアクセス
[ブロックパブリックアクセス](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#ブロックパブリックアクセス)の有効無効を設定します

#### ・バケットポリシー
[バケットポリシー](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#バケットポリシー-リソースベースのポリシー)を作成・変更します

#### ・オブジェクト所有者
ACLの有効無効を設定します。

<img width=540 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/92481d5e-4b2a-d0d1-953e-f1132ed308c7.png">

ACL有効を指定した場合、オブジェクトの所有者を以下のどちらにするか選択できます。

- 希望するバケット所有者: バケットの所有者がオブジェクト所有者となる
- オブジェクトライター: オブジェクトをアップロードしたAWSアカウントがオブジェクト所有者となる

#### ・アクセスコントロールリスト (ACL)
[ACL](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#aclによるアクセス制御)による各AWSアカウントへのアクセス権付与を変更します

#### ・Cross-Origin Resource Sharing (CORS)
前述の[CORS (Cross-Origin Resource Sharing)](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#cors)設定を作成・変更します

<br>

### 「メトリクス」タブ
バケット内の状況を簡単に可視化、分析することができます(詳細に分析したい場合は後述の[Storage Lens](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#storage-lens)を使用してください)

#### ・バケットメトリクス
バケット内のデータ量やオブジェクト数を、ストレージクラス毎にダッシュボード表示します

#### ・ストレージクラス分析
前述の[ストレージクラス分析](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#ストレージクラス分析)を作成・変更します
バケット内のオブジェクトへのアクセス頻度を分析し、適切なストレージクラス選択の参考にする事ができます。
詳細は以下の記事を参照ください

https://dev.classmethod.jp/articles/introducing-s3-analysis/

#### ・レプリケーションメトリクス
[レプリケーションルール](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#クロスリージョンレプリケーション-crr)作成時に「レプリケーションメトリクスと通知」をチェックした場合、レプリケーションの進捗状況をモニタリングする事ができます。

<br>

### 「管理」タブ
各種ルールの管理を行えます

#### ・ライフサイクルルール
[ライフサイクルルール](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#ライフサイクルルール)を作成・変更します

#### ・レプリケーションルール
[クロスリージョンレプリケーション](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#クロスリージョンレプリケーション-crr)を実行するルールを、作成・変更します

#### ・インベントリ設定
前述の[S3 Inventory](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#s3-inventory)を作成・一覧表示・変更します。

<br>

### 「アクセスポイント」タブ
[S3アクセスポイント](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#s3アクセスポイント)を作成・変更します。

基本的には[後述するナビゲーションペインの「アクセスポイント」](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#アクセスポイント)と同内容の設定が行えますが、該当バケットに紐づけられたアクセスポイントのみに表示がフィルタリングされています。

<br>
<br>

## アクセスポイント
[S3アクセスポイント](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#s3アクセスポイント)の作成、一覧表示、設定を行います。

<br>

## オブジェクトLambdaアクセスポイント
[前述の](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクトlambdaアクセスポイント)オブジェクトLambdaアクセスポイントを作成・一覧表示・変更します。

<br>

## マルチリージョンアクセスポイント
[マルチリージョンアクセスポイント](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#マルチリージョンアクセスポイント)の作成、一覧表示、設定を行います。

<br>

## バッチオペレーション
[前述の](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バッチオペレーション)バッチオペレーションを作成・一覧表示・変更します。

<br>

## S3のアクセスアナライザー
[S3のアクセスアナライザー](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#s3のアクセスアナライザー)により、セキュリティリスクの高いバケットを検知できます。

`IAM Access Analyzer for S3`と表示される事もあるようです。

<br>

## このアカウントのブロックパブリックアクセス設定
[**ブロックパブリックアクセス**](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#ブロックパブリックアクセス)を許可するかを、**アカウント一括で設定**できます。

通常のブロックパブリックアクセスと同様、以下のようにACLとポリシー(バケットポリシーまたはアクセスポイント)に分けてブロックの有無を指定する事ができます

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/3fb4ae2e-5479-1932-a844-e90ac93285b3.png">

パブリックアクセスは[ダブルチェック](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#ブロックパブリックアクセス)(ブロックパブリックアクセス＋ポリシーまたはACLによるアクセス制御)に加え、本項目でアカウント全体でのパブリックアクセスを禁止する事もできるため、実質的には**トリプルチェック体制**と言えます。

## Storage Lens
### ダッシュボード
[前述の](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#storage-lens)Storage Lensによる格納データの統計情報可視化ダッシュボードを作成、編集、閲覧できます。

### AWS Organitazionsの設定
Storage Lensを使用し、AWS Organitazions使用時に複数のアカウントのS3の状況を一括で確認することができます

## 注目機能
新機能追加時にこちらで通知がされます

## S3のAWS Marketplace
サードパーティのS3関係ツールを購入する事ができます

<br>
<br>

# S3の操作方法
S3に実際にアクセスし、バケットやオブジェクトの操作、ファイルのアップロード等を実施する方法を解説します。

本記事ではS3を操作する方法としてよく利用される、以下の3種類の方法を解説します（他にも[REST APIでのアクセス](https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html)等が可能ですが、本記事では割愛します）

|名称|S3の操作方法|
|---|---|
|コンソール|AWSのコンソール（WebUI）上から操作する|
|CLI|Powershellやbash等のシェルから操作する|
|Python SDK (Boto3)|Pythonのスクリプトから操作する（他のプログラミング言語のSDKも存在しますが、本記事では割愛します）|

順を追って説明します

## AWSの登録とIAMユーザ作成
まずはS3使用の準備としてAWSへの登録とIAMユーザの作成を行います。

AWSへの登録自体は[こちら](https://aws.amazon.com/jp/register-flow/)を参照ください。

次にS3の操作権限を持ったIdentity and Access Management (IAM)ユーザを作成します。
ルートユーザでログインして、コンソールからIAM → ユーザーと進み、「ユーザを追加」をクリックします

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/6718429c-9cea-7361-bdb0-277fd1564c31.png">

好きなユーザ名とパスワードを入力し、アクセスキー（プログラムやCLI）とパスワード（GUIコンソール）によるアクセスを有効にします

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/04054b32-d69d-8591-cc85-a6ea2bc4bf32.png">

S3にアクセスするためのポリシーを設定します（下の例ではS3以外もアクセスできるよう管理者権限である`AdministratorAccess`を付与していますが、[IAMベストプラクティス](https://qiita.com/c60evaporator/items/0121399880625cc1de51#iamセキュリティのベストプラクティス)の[最小権限の原則](https://qiita.com/c60evaporator/items/0121399880625cc1de51#最小限の特権を認める)に則るのであれば、S3のフルアクセス権限である`AmazonS3FullAccess`を設定した方が良いかと思います）

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/40a9cef0-16fa-a42c-b609-13b799e91389.png">

タグを設定し（未記入でもOK）、「ユーザの作成」をクリックします。

ユーザ作成後に出てくる以下のアクセスキーIDとシークレットアクセスキーをメモしてください
(メモを忘れたら後で再作成が必要です)

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/9cc63b14-643d-466c-9c3b-616557b10801.png">


以降は、以下の操作方法に応じてリンク先の操作方法を参照ください

- [コンソール](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#コンソール)
- [CLI](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#cli)
- [Python SDK (Boto3)](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#python-sdk-boto3)

<br>

## コンソール
**コンソール** (AWSマネジメントコンソール)とは、**ブラウザ上からでGUIでAWSの各種サービスを操作できるWebアプリ**で、AWSの操作法として最も一般的に使用されます。

以下、コンソールによるS3の操作法を解説します。

### バケットの作成
先ほど作成したユーザでAWSコンソールにサインインし、画面上の検索BOXから「S3」と検索し、S3のコンソールに移動します
<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/01dc3257-7f6e-34f3-d6ef-ae389311bcfe.png">

ナビゲーションペイン (左側のタブ)の「バケット」を選択し、「バケットの作成」をクリックします

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/4e458846-794b-6595-0cf0-d147c5030583.png">

以下のように、作成するバケットの各種設定を選択し、「」

<img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/5a272452-8051-5fcb-102a-40d4c77ad540.png">

<img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/9366312d-9b51-8339-9f7f-029162a53f9d.png">

各種設定をそれぞれ解説します

#### ・一般的な設定
バケット名、リージョンを選択します。
なお、バケット名は**世界中で一意である必要がある**のでご注意ください

また、「既存のバケットから設定をコピー」をクリックすると、他バケットの設定をコピーして移行の設定入力を簡略化することができます

#### ・オブジェクト所有者
[ACL](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#aclによるアクセス制御)の有効無効を設定し、有効を指定した場合はオブジェクトの所有者をバケット所有者とオブジェクト投稿者のどちらにするかを選択できます。

詳細は[「バケットの設定」におけるオブジェクト所有者](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクト所有者)と同じなので、こちらをご参照ください

#### ・ブロックパブリックアクセス
前述の[ブロックパブリックアクセス](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#ブロックパブリックアクセス)の有効無効を設定します。

[「バケットの設定」におけるブロックパブリックアクセス](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#ブロックパブリックアクセス)と同じです

#### ・バケットのバージョニング
前述の[バケットのバージョニング](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#バケットのバージョニング)の有効無効を設定します。

詳細は[「バケットの設定」におけるバケットのバージョニング](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケットのバージョニング)と同じなので、こちらをご参照ください

#### ・タグ
バケットにタグ付けして整理することで、ストレージコストやその他の基準追跡に利用できます。

#### ・デフォルトの暗号化
[データの暗号化](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#データの暗号化)をデフォルトで適用するかを設定できます。

詳細は[「バケットの設定」におけるデフォルトの暗号化](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#デフォルトの暗号化)と同じなので、こちらをご参照ください

#### ・詳細設定
[**オブジェクトロック**](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#オブジェクトロック)が設定できます。

<br>

### バケットの削除
ナビゲーションペイン (左側のタブ)の「バケット」を選択し、削除したいバケットを選択したのち「削除」をクリックします

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/e6d4243e-1c95-b752-0757-51844d608b82.png">

バケット内にオブジェクトが存在する場合、そのままでは削除できないので「空のバケット設定」をクリックする

<img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/b07afa91-5898-7477-241d-0b98383a356b.png">

「完全に削除」と入力し、「空にする」をクリックしてバケット内のオブジェクトを全削除

<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/b04d7cf6-eff9-2f65-517e-4b393dc895a7.png">

再びバケットの削除画面に戻り、バケット名を入力して「バケットを削除」をクリックします

<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/4f453efe-3840-8e04-c9d7-c6b971f3a55b.png">

<br>

### バケットの設定
バケットの各種設定を変更したい場合、前述の[**バケットの設定**](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケット-1)を参照ください。

<br>

### フォルダの作成
ナビゲーションペイン (左側のタブ)の「バケット」を選択し、フォルダを追加したいバケットをクリックしてバケットの設定画面に入ります

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/fc4692e0-ab53-4c00-76c0-5d0f20b1bb0a.png">

「フォルダの作成」をクリックします

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/d901f2db-1016-f7ff-83bd-23d70081fd7d.png">

作成したフォルダ名とデフォルトの暗号化方法を指定し、「フォルダの作成」をクリックします

<img width=360 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/c7e4d0cc-4f7f-8c52-c2ea-866adb934dae.png">

<br>

### オブジェクトの追加 (アップロード)
ナビゲーションペイン (左側のタブ)の「バケット」を選択し、フォルダを追加したいバケットをクリックしてバケットの設定画面に入ります

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/fc4692e0-ab53-4c00-76c0-5d0f20b1bb0a.png">

「アップロード」をクリックします

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/7e0ebcb9-0274-697d-9a0f-2fd5dd2b2472.png">

「ファイルを追加」をクリックするとダイアログが開くのでアップロードしたいファイルを選択し、「プロパティ」からストレージクラスや暗号化方法を選択したのち (無選択ならバケットのデフォルト設定が適用される)、「アップロード」をクリックします

<img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/2229d0a8-2aee-abf3-4401-2eabdd10114e.png">

<br>

### オブジェクトの取得 (ダウンロード)
ナビゲーションペイン (左側のタブ)の「バケット」を選択し、操作したいバケットをクリックしてバケットの設定画面に入ります

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/fc4692e0-ab53-4c00-76c0-5d0f20b1bb0a.png">

ダウンロードしたいオブジェクトを選択して「ダウンロード」をクリックします

<img width=500 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/17f9e62f-7a16-9e10-8c23-f341536526d8.png">

<br>

### オブジェクトの削除
ナビゲーションペイン (左側のタブ)の「バケット」を選択し、操作したいバケットをクリックしてバケットの設定画面に入ります

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/fc4692e0-ab53-4c00-76c0-5d0f20b1bb0a.png">

削除したいオブジェクトを選択し、「削除」をクリックします

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/0897f7da-522f-834f-003c-dfb8a245477e.png">

「削除」と入力し、「オブジェクトの削除」をクリックする

<img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/d2fd8964-b0d0-17ff-f9dd-2e32f7c37fa1.png">

<br>
<br>

## CLI
**CLI** (AWS コマンドラインインターフェイス)とは、**CUIでAWSの各種サービスを操作できるツール**です。
GUIで操作するコンソールと比べ、熟練者によるスピーディーな操作や、処理の自動化に優れた方法と言えます。

CLIでS3を操作する場合、以下の2通りの方法が存在します

- **高レベル**(s3)コマンド: 簡単なコマンドで処理を実現できる
- **APIレベル**(s3 api)コマンド: より長いコマンドで詳細な処理を実現できる

**本記事**では、**高レベルコマンドによるS3の操作法**を解説します ([参考](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-s3-commands.html))
本記事で紹介しないAPIレベルコマンドについては、以下の公式ドキュメントを参照してください

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-s3-apicommands.html

### CLIのインストール

#### ・CLIアプリのインストール

CLIを利用するためには、使用するPCへのCLIアプリのインストールが必要です。
以下のページを参考に、OSに応じたインストール法を選択してください

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

※なお、以下の方法いずれかで、インストール不要でCLIを利用することができます
1. コンソールから[CloudShell](https://dev.classmethod.jp/articles/lim_aws_cloudshell/)を起動
2. [Amazon Linux AMI](https://qiita.com/c60evaporator/items/06aa523c470d52782c7b#ami-os)を選択したEC2インスタンスを利用(最初からCLIがインストールされている)

#### ・ アクセスキーの入手
※本操作は、[IAMユーザ作成時](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#awsの登録とiamユーザ作成)にアクセスキーを作成・取得済であれば不要です。忘れた場合は以下の方法で再作成してください(古いキーの情報は残しておくと危険なので削除してください)

※CLIをローカルPCではなくEC2やFargate等のAWS内リソースから利用する場合、本節で紹介するアクセスキーではなくロールを使用する事がセキュリティ上望ましいです。[こちら](https://qiita.com/c60evaporator/items/0121399880625cc1de51#aws内サービスへの権限付与)を参照下さい。

[先ほど作成](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#awsの登録とiamユーザ作成)したIAMユーザでコンソールにログインし、IAM → ユーザ → 先ほど作成したユーザ → 「認証情報」タブに移動し、「アクセスキーの作成」をクリックします。

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/690aff23-8ab1-f806-204a-06469ff5873d.png">

アクセスキーを作成して出てきた`アクセスキーID`と`シークレットアクセスキー`をメモします

#### ・AWS CLIのインストールとアクセスキーの登録
AWSをコマンドラインから操作するためのAWS CLIを、クライアントPCに以下を参考にインストールしてください

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html

インストールが完了したら、ターミナル（Windowsの場合Powershell）から以下のコマンドを打ち

```
aws configure
```
以下のように入力します

```
AWS Access Key ID [None]: [アクセスキーID]
AWS Secret Access Key [None]: [先ほどメモしたシークレットアクセスキー]
Default region name [None]: ap-northeast-1
Default output format [None]: [空欄でOK]
```
「~/.aws/credentials」と「~/.aws/config」に入力したクレデンシャル情報（アクセスキーやリージョン）が生成していれば成功です。

### CLIコマンド一覧（S3 高レベルコマンド）

|操作|コマンド|
|---|---|
|[バケット一覧表示](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケット一覧表示)|`aws s3 ls`|
|[バケットの作成](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケットの作成-1)|`aws s3 mb s3://バケット名`|
|[バケットの削除](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケットの削除-1)|`aws s3 rb s3://バケット名`|
|[バケットの設定](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケットの設定-1)|リンク先参照|
|[オブジェクトの一覧表示](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクトの一覧表示)|`aws s3 ls s3://バケット名`|
|[オブジェクトのアップロード](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクトの追加-アップロード-1)|`aws s3 cp [ローカルファイルのパス] s3://バケット名`|
|[オブジェクトのダウンロード](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクトの取得-ダウンロード-1)|`aws s3 cp s3://バケット名/オブジェクトのキー [ローカルフォルダのパス]`|
|[オブジェクトの削除](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクトの削除-1)|`aws s3 rm s3://バケット名/オブジェクトのキー`|
|[オブジェクトのコピー](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクトのコピー)|`aws s3 cp s3://コピー元バケット名/コピー元オブジェクトのキー s3://コピー先バケット名/コピー先フォルダ名/`|
|[オブジェクトの移動](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクトの移動)|`aws s3 mv s3://移動元バケット名/移動元オブジェクトのキー s3://移動先バケット名/移動先フォルダ名/`|
|[バケットの同期](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケットの同期)|`aws s3 sync s3://同期元バケット名 s3://同期先バケット名`|

それぞれのコマンドを簡単に解説します

※以降の操作は先ほど作成したユーザー (アクセスキーと紐づいたユーザー)に適切なポリシーが設定されていないと実行できません。**エラーが出る場合、まず[こちら](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#ポリシーによるアクセス制御)を参考にポリシーの設定を再確認**してください

#### バケット一覧表示

以下コマンドでアカウント内のバケットを一覧表示できます

```
aws s3 ls
```

#### バケットの作成
以下コマンドでバケットを作成できます

```
aws s3 mb s3://バケット名
```

#### バケットの削除
以下コマンドでバケットを削除できます

```
aws s3 rb s3://バケット名
```

#### バケットの設定
[バケットの設定](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケット-1)にはAPIレベルコマンドが必要となるため、以下の公式コマンドリファレンスを参照してください

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/index.html

#### オブジェクトの一覧表示
以下コマンドでバケット内のオブジェクトを一覧表示できます

```
aws s3 ls s3://バケット名
```

以下コマンドでフォルダ内のオブジェクトを一覧表示できます

```
aws s3 ls s3://バケット名/フォルダ名/
```

#### オブジェクトの追加 (アップロード)
`cp`コマンドは、オブジェクトの移動に使用します。

以下コマンドでローカルからS3バケットにオブジェクトをアップロードできます。

```
aws s3 cp [アップロードしたいローカルファイルのパス] s3://バケット名
```

以下コマンドでフォルダ内にアップロードすることもできます (最後の`/`を忘れないよう注意、存在しないフォルダ名ならフォルダが自動作成される)

```
aws s3 cp [アップロードしたいローカルファイルのパス] s3://バケット名/フォルダ名/
```

#### オブジェクトの取得 (ダウンロード)

以下コマンドでS3バケットからローカルにオブジェクトをダウンロードできます。

```
aws s3 cp s3://バケット名/オブジェクトのキー [ダウンロード先のローカルフォルダのパス]
```

#### オブジェクトの削除
以下コマンドでオブジェクトを削除できます

```
aws s3 rm s3://バケット名/オブジェクトのキー
```

`--recursive`オプションを付加することで、バケット内またはフォルダ内全てのオブジェクトを

```:バケット内全てのオブジェクトを削除
aws s3 rm s3://バケット名 --recursive
```

```:フォルダ全てのオブジェクトを削除
aws s3 rm s3://バケット名/フォルダ名 --recursive
```

#### オブジェクトのコピー
以下コマンドでバケット同士でオブジェクトをコピーできます (コピー先のフォルダ名が存在しなければフォルダが自動作成される)

```
aws s3 cp s3://コピー元バケット名/コピー元オブジェクトのキー s3://コピー先バケット名/コピー先フォルダ名/
```

以下コマンドでバケット内のオブジェクトを丸ごとコピーできます

```
aws s3 cp s3://コピー元バケット名 s3://コピー先バケット名 --recursive
```

以下コマンドでフォルダ内のオブジェクトを丸ごとコピーできます

```
aws s3 cp s3://コピー元バケット名/コピー元フォルダ名 s3://コピー先バケット名/コピー先フォルダ名/ --recursive
```

#### オブジェクトの移動
以下コマンドでバケット同士でオブジェクトを移動できます (移動先のフォルダ名が存在しなければフォルダが自動作成される)

```
aws s3 mv s3://移動元バケット名/移動元オブジェクトのキー s3://移動先バケット名/移動先フォルダ名/
```

以下コマンドでバケット内のオブジェクトを丸ごと移動できます

```
aws s3 mv s3://移動元バケット名 s3://移動先バケット名 --recursive
```

以下コマンドでフォルダを丸ごと移動できます

```
aws s3 mv s3://移動元バケット名/移動元フォルダ名 s3://移動先バケット名/移動先フォルダ名/ --recursive
```

#### バケットの同期
`sync`コマンドで、バケット同士やローカルとバケットを同期し、同一オブジェクトを保持する事ができます。

なお、ここでいう「同期」はコンソールからの[レプリケーション](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#クロスリージョンレプリケーション-crr)とは異なるので、以下の記事をご参照ください。基本的には「同期」は最初の1回のみ実施され、レプリケーションは定期的に実行されるようです

https://dev.classmethod.jp/articles/s3event-difference-between-s3sync-and-s3replication/

以下コマンドでローカルフォルダとバケットを同期することができます 
(通常削除処理は同期されませんが、`--delete`オプションを付けることで削除も同期されるようになります)

```
aws s3 sync [同期元ローカルフォルダのパス] s3://バケット名
```

以下コマンドでバケット内の特定のフォルダのみを同期対象とする事ができます

```
aws s3 sync [同期元ローカルフォルダのパス] s3://バケット名/フォルダ名
```

以下コマンドでバケット同士を同期することができます

```
aws s3 sync s3://同期元バケット名 s3://同期先バケット名
```

以下コマンドでバケット内の特定のフォルダのみを同期する事ができます

```
aws s3 sync s3://同期元バケット名/フォルダ名 s3://同期先バケット名/フォルダ名
```

## Python SDK (Boto3)
Boto3とは、PythonからAWSのリソースを操作するためのライブラリ (SDK)です。

S3に限らず、「PythonからAWSをいじりたい！」という場合はこのBoto3を使用するのが一般的です。

### Boto3のインストール
#### ・AWS CLIのインストールとアクセスキーの登録
Boto3をインストールするためには、AWS CLIのインストールとアクセスキーの登録がまず必要となります。

本記事の[CLIのインストール](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#cliアプリのインストール)、[アクセスキーの入手](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#-アクセスキーの入手)、[AWS CLIのインストールとアクセスキーの登録](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#aws-cliのインストールとアクセスキーの登録)を参考に、インストールを進めてください

#### ・Boto3のインストール
ローカルPC上で以下コマンドでboto3をインストールします

・pipの場合

```
pip install boto3
```

・condaの場合

```
conda install boto3
```

#### ・Boto3によるPythonからS3へのアップロード動作確認
ローカルPC上で以下のようなコードを動作させ、S3へデータがアップロードできるか確認します

```boto3_test.py
import boto3
import os
# アップロード用のテキストファイル作成
text = "rooms, zipcode, median_price, school_rating, transport"
text_path = 'fuga.txt'
with open(text_path, "w") as f:
    f.write(text)
# S3にアップロード
s3 = boto3.resource('s3')
bucket = s3.Bucket('[S3のバケット名]')
bucket.upload_file(text_path, text_path)
os.remove(text_path)
```
該当S3バケットにファイルがアップロードされていれば成功です
![スクリーンショット 2021-11-28 3.32.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/3d122325-e6e1-f2e3-930c-ce4269db9fc4.png)

### Boto3の基本的な使い方

#### クライアントAPIとリソースAPI

Boto3では、AWS内のリソースを操作するためのスクリプト記述方法として**クライアントAPI**と**リソースAPI**の2種類が準備されています。[公式ドキュメントには](https://aws.amazon.com/jp/sdk-for-python/)その違いは以下のように記載されています。

`Boto3 には、2 つの異なるレベルの API があります。クライアント（「低レベル」）API では、下層の HTTP API 操作との 1 対 1 のマッピングが提供されます。 リソース API では、明示的なネットワーク呼び出しが表示されず、属性にアクセスしアクションを実行するためのリソースオブジェクトとコレクションが提供されます。(例:`

上記説明だけでは分かりづらいですが、以下の記事の解説も読むと理解が進むかと思います。

https://dev.classmethod.jp/articles/boto3-client-api-and-resource-api/

端的に言うと、以下のように解釈できそうです。

- クライアントAPI: REST APIに準じた（=[前述の](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#cli)CLIと似た）操作が可能
- リソースAPI: AWSリソース（S3バケット等）をオブジェクト指向のインスタンスとして操作できる

筆者（私）の解釈が入りますが、それぞれのメリットとデメリットは以下のように位置付けられそうです（一般論としてのREST APIとオブジェクト指向のメリット/デメリットに基づいています）

||概要|メリット|デメリット|
|---|---|---|---|
|クライアントAPI|AWSリソースをREST APIとに準じた方法で操作できる|各操作を独立して行えるため、前に実行した操作の影響を受けづらい|操作毎にリソースを逐次指定しないといけないため、コードが冗長になりがち|
|リソースAPI|AWSリソースをオブジェクト指向のインスタンスとして操作する|一度インスタンス化したリソースはメソッドで操作できるため、コードをシンプルにできる|前に実行した操作の影響を受けやすい|

**どちらを選択するか**ですが、正直**個人の趣向**レベルの話（公式でもどちらかを推奨しているわけではない）となりそうです。

あえて言うのであれば、オブジェクト指向言語と位置付けられる事の多いPythonらしいコードを書くのであれば、リソースAPIの方が相性は良さそうです。

##### クライアントAPIの基本的な使い方

##### リソースAPIの基本的な使い方

リソースAPIでは、基本的に以下のような階層構造を基に、上位側から順にインスタンスを作成していきます（オブジェクトへは、S3クラスから直接作成も、バケットインスタンスから作成する事もできます）

```mermaid
graph LR

boto3---S3クラス
boto3---EC2クラス等
S3クラス---バケットを表すインスタンス
バケットを表すインスタンス---オブジェクトを表すインスタンス
S3クラス---オブジェクトを表すインスタンス
```

[先ほどの動作確認](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#boto3によるpythonからs3へのアップロード動作確認)で使用したコードもリソースAPIを使用しているので、こちらを例に解説します。

```python
import boto3

# サービス（S3）を表すインスタンス作成
s3 = boto3.resource('s3')
# バケットインスタンス作成
bucket = s3.Bucket('[S3のバケット名]')
# オブジェクトをアップロードするメソッド（バケットインスタンスのメソッド）
bucket.upload_file(text_path, text_path)
```

上記のように、

- boto3クラスに含まれる`boto3.resource()`メソッドでサービス（今回のケースではS3）を表すインスタンスを作成
- そのサービス内のリソースを表すインスタンス（今回のケースでは`Bucket`）を作成

の順でリソース操作用のインスタンスを作成し、そのメソッドを呼び出す（今回のケースでは`upload_file()`）

### boto3によるS3の操作法一覧

上記のように、クライアントAPIでは`boto3.client()`、クライアントAPIでは`boto3.resource()`メソッドを呼び出すことで、S3の操作用クラスを作成する事ができます。

※以降の操作は先ほど作成したユーザー (アクセスキーと紐づいたユーザー)に適切なポリシーが設定されていないと実行できません。**エラーが出る場合、まず[こちら](https://qiita.com/c60evaporator/items/ee7def3632eaf493409f#ポリシーによるアクセス制御)を参考にポリシーの設定を再確認**してください

|操作|クライエントAPIでの操作法|リソースAPIでの操作法|
|---|---|---|
|[バケット一覧表示](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケット一覧表示-1)|`list_buckets()`|-|
|[バケットの作成](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケットの作成-2)|`create_buckets()`|`Bucket.create()`|
|[バケットの削除](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#バケットの削除-2)|`delete_bucket()`|`Bucket.delete()`|
|[オブジェクトの一覧表示](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクトの一覧表示-1)|`list_objects()`|`Bucket.objects`|
|[オブジェクトのアップロード](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクトの追加-アップロード-2)|`upload_file()`|`Bucket.upload_file()`|
|[オブジェクトのダウンロード](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクトの取得-ダウンロード-2)|`download_file()`|`Bucket.download_file()`|
|[オブジェクトの削除](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクトの削除-2)|`delete_object()`|`Bucket.delete_objects()`|
|[オブジェクトのコピー](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクトのコピー-1)|`copy_object()`|`Bucket.copy()`|
|[オブジェクトの移動](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#オブジェクトの移動-1)|`copy_object()` + `delete_object()`|`Bucket.copy()` + `Bucket.delete_objects()`|

それぞれのコマンドを簡単に解説します

※以降の操作は先ほど作成したユーザー (アクセスキーと紐づいたユーザー)に適切なポリシーが設定されていないと実行できません。**エラーが出る場合まずポリシーの設定を再確認**してください

#### バケット一覧表示

##### クライエントAPI

以下のように、`list_buckets()`メソッドでアカウント内のバケットを一覧表示できます

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/list_buckets.html

```python:クライエントAPIによるバケット一覧表示例
import boto3

s3client = boto3.client('s3')  # S3操作用インスタンス作成
s3client.list_buckets()  # バケット一覧表示
```

##### リソースAPI

私が調べた限りでは、リソースAPIでアカウント内のバケットを一覧表示できるメソッドは見つかりませんでした。クライエントAPIを使用してください。

#### バケットの作成

##### クライエントAPI

以下のように、`create_buckets()`メソッドでバケットを作成できます（対応リージョンに限りがあるので、以下APIリファレンスを参照ください）

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/list_buckets.html

```python:クライエントAPIによるバケット作成例
mport boto3

s3client = boto3.client('s3')  # S3操作用インスタンス作成
# バケット作成
s3client.s3.create_bucket(Bucket='[S3のバケット名]', 
    CreateBucketConfiguration={'LocationConstraint': 'ap-northeast-1'})
```



`Bucket`引数でバケット名を、`CreateBucketConfiguration`引数でリージョンを指定できます。その他の引数は上記APIリファレンスを参照ください。

##### リソースAPI

以下のように、`Bucket`クラス内の`create()`メソッドでバケットを作成できます（対応リージョンに限りがあるので、以下APIリファレンスを参照ください）

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/bucket/create.html

```python:リソースAPIによるバケット作成例
mport boto3

s3resource = boto3.resource('s3')  # S3操作用インスタンス作成
bucket = s3resource.Bucket('[S3のバケット名]')  # バケットインスタンス作成
# バケット作成
bucket.create(
    CreateBucketConfiguration={'LocationConstraint': 'ap-northeast-1'})
```

`CreateBucketConfiguration`引数でリージョンを指定できます。その他の引数は上記APIリファレンスを参照ください。

#### バケットの削除

##### クライエントAPI

以下のように、`delete_bucket()`メソッドでバケットを削除できます

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/delete_bucket.html

```python:クライエントAPIによるバケット削除例
import boto3

s3client = boto3.client('s3')  # S3操作用インスタンス作成
# バケット削除
s3client.delete_bucket(Bucket='[S3のバケット名]')
```

##### リソースAPI

以下のように、`Bucket`クラス内の`delete()`メソッドでバケットを削除できます

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/bucket/delete.html

```python:リソースAPIによるバケット削除例
import boto3

s3resource = boto3.resource('s3')  # S3操作用インスタンス作成
bucket = s3resource.Bucket('[S3のバケット名]')  # バケットインスタンス作成
# バケット削除
bucket.delete()
```

#### オブジェクトの一覧表示

##### クライエントAPI

以下のように、`list_objects()`メソッドでバケット内のオブジェクト一覧を取得する事ができます

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/list_objects.html

```python:クライエントAPIによるバケット内オブジェクト一覧取得例
import boto3

s3client = boto3.client('s3')  # S3操作用インスタンス作成
# オブジェクトの一覧表示
response = s3client.list_objects(Bucket='[S3のバケット名]')
```

得られる出力(上記スクリプトの`response`)は以下のようになります。'Contents'にキーやストレージクラス等のオブジェクト内容が格納されています。

```json:得られる出力
{
    'Contents': [
        {
            'ETag': '"70ee1738b6b21e2c8a43f3a5ab0eee71"',
            'Key': 'example1.jpg',
            'LastModified': datetime(2014, 11, 21, 19, 40, 5, 4, 325, 0),
            'Owner': {
                'DisplayName': 'myname',
                'ID': '12345example25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc',
            },
            'Size': 11,
            'StorageClass': 'STANDARD',
        },
        {
            'ETag': '"9c8af9a76df052144598c115ef33e511"',
            'Key': 'example2.jpg',
            'LastModified': datetime(2013, 11, 15, 1, 10, 49, 4, 319, 0),
            'Owner': {
                'DisplayName': 'myname',
                'ID': '12345example25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc',
            },
            'Size': 713193,
            'StorageClass': 'STANDARD',
        },
    ],
    'NextMarker': 'eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAyfQ==',
    'ResponseMetadata': {
        '...': '...',
    },
}
```

以下のように`filter()`メソッドを間に加える事で、フォルダ名等でフィルタを掛けてオブジェクト一覧を取得する事もできます。

```python:クライアントAPIによるフォルダ内オブジェクト一覧取得例
import boto3

s3client = boto3.client('s3')  # S3操作用インスタンス作成
# オブジェクトの一覧表示
response = s3client.list_objects(Bucket='[S3のバケット名]', Prefix='[フォルダ名]/')
```

##### リソースAPI

以下のように、`Bucket`クラス内の`objects`コレクションからバケット内のオブジェクト一覧を取得できます。

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/bucket/objects.html

以下のように`all()`メソッドを後ろに続けることで、イテレーションとしてfor文で内容を取得できます。

```python:リソースAPIによるバケット内オブジェクト一覧取得例
import boto3

s3resource = boto3.resource('s3')  # S3操作用インスタンス作成
bucket = s3resource.Bucket('[S3のバケット名]')  # バケットインスタンス作成
# オブジェクトの一覧表示
for object in bucket.objects.all():
    print(object.key)  # オブジェクトのキーを表示
    print(object.strage_class)  # オブジェクトのストレージクラスを表示
```

以下のように`filter()`メソッドを間に加える事で、フォルダ名等でフィルタを掛けてオブジェクト一覧を取得する事もできます。

```python:リソースAPIによるフォルダ内オブジェクト一覧取得例
import boto3

s3resource = boto3.resource('s3')  # S3操作用インスタンス作成
bucket = s3resource.Bucket('[S3のバケット名]')  # バケットインスタンス作成
# オブジェクトの一覧表示
for object in bucket.objects.filter(Prefix='[フォルダ名]/').all():
    print(object.key)  # オブジェクトのキーを表示
    print(object.storage_class)  # オブジェクトのストレージクラスを表示
```

#### オブジェクトの追加 (アップロード)

##### クライエントAPI

以下のように、`upload_file()`メソッドでファイルをオブジェクトとしてS3にアップロードできます

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/upload_file.html

```python:クライエントAPIによるオブジェクトのアップロード例
import boto3
import os

# アップロード用のテキストファイル作成
text = "rooms, zipcode, median_price, school_rating, transport"
text_path = 'fuga.txt'  # アップロード元のファイル名
with open(text_path, "w") as f:
    f.write(text)

s3client = boto3.client('s3')  # S3操作用インスタンス作成
# ファイルをオブジェクトとしてアップロード
s3client.upload_file(
    Filename=text_path,
    Bucket='バケット名',
    Key='オブジェクト名')
os.remove(text_path)  # 不要なファイルを削除
```

オブジェクト名には`hoge.txt`のように保存したいキー名を指定します
以下のようにフォルダ（プレフィックス）名を指定することで、フォルダ内にアップロードする事もできます。

```python
s3client.upload_file(
    Filename=text_path,
    Bucket='バケット名',
    Key='フォルダ/オブジェクト名')
```

##### リソースAPI

以下のように、`Bucket`クラス内の`upload_file()`メソッドでバケットを削除できます

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/bucket/upload_file.html

```python:リソースAPIによるオブジェクトのアップロード例
import boto3
import os

# アップロード用のテキストファイル作成
text = "rooms, zipcode, median_price, school_rating, transport"
text_path = 'fuga.txt'  # アップロード元のファイル名
with open(text_path, "w") as f:
    f.write(text)

s3resource = boto3.resource('s3')  # S3操作用インスタンス作成
bucket = s3resource.Bucket('バケット名')  # バケットインスタンス作成
# ファイルをオブジェクトとしてアップロード
bucket.upload_file(
    Filename=text_path,
    Key='オブジェクト名')
os.remove(text_path)  # 不要なファイルを削除
```

オブジェクト名には`hoge.txt`のように保存したいキー名を指定します
以下のようにフォルダ（プレフィックス）名を指定することで、フォルダ内にアップロードする事もできます。

```python
bucket.upload_file(
    Filename=text_path,
    Key='フォルダ名/オブジェクト名')
```

#### オブジェクトの取得 (ダウンロード)

##### クライエントAPI

以下のように、`download_file()`メソッドでファイルをオブジェクトとしてS3バケットにアップロードできます

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/download_file.html

```python:クライエントAPIによるオブジェクトのダウンロード例
import boto3

text_path = 'fuga.txt'  # ダウンロード先のファイル名
s3client = boto3.client('s3')  # S3操作用インスタンス作成
# ファイルをオブジェクトとしてアップロード
s3client.download_file(
    Filename=text_path,
    Bucket='バケット名',
    Key='オブジェクト名')
```

オブジェクト名には`hoge.txt`のようなダウンロード対象のオブジェクトのキー名を指定します
アップロード時と同様に`Key='フォルダ名/オブジェクト名'`とすることで、フォルダ（プレフィックス）指定してダウンロードする事もできます。

##### リソースAPI

以下のように、`Bucket`クラス内の`download_file()`メソッドでファイルをオブジェクトとしてS3バケットにアップロードできます

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/bucket/download_file.html

```python:リソースAPIによるオブジェクトのダウンロード例
import boto3

text_path = 'fuga.txt'  # ダウンロード先のファイル名
s3resource = boto3.resource('s3')  # S3操作用インスタンス作成
bucket = s3resource.Bucket('バケット名')  # バケットインスタンス作成
# オブジェクトをファイルとしてダウンロード
bucket.download_file(
    Filename=text_path,
    Key='オブジェクト名')
```

オブジェクト名には`hoge.txt`のようなダウンロード対象のオブジェクトのキー名を指定します
アップロード時と同様に`Key='フォルダ名/オブジェクト名'`とすることで、フォルダ（プレフィックス）指定してダウンロードする事もできます。


#### オブジェクトの削除

##### クライエントAPI

以下のように、`delete_object()`メソッドでオブジェクトを削除できます

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/delete_object.html

```python:クライエントAPIによるオブジェクトの削除例
import boto3

s3client = boto3.client('s3')  # S3操作用インスタンス作成
# オブジェクトをファイルとしてダウンロード
s3client.delete_object(
    Bucket='バケット名',
    Key='オブジェクト名')
```

オブジェクト名には`hoge.txt`のようなダウンロード対象のオブジェクトのキー名を指定します
アップロード時と同様に`Key='フォルダ名/オブジェクト名'`とすることで、フォルダ（プレフィックス）指定してダウンロードする事もできます。

##### リソースAPI

以下のように、`Bucket`クラス内の`delete_objects()`メソッドでオブジェクトを削除できます

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/bucket/delete_objects.html

```python:リソースAPIによるオブジェクトの削除例
import boto3

s3resource = boto3.resource('s3')  # S3操作用インスタンス作成
bucket = s3resource.Bucket('バケット名')  # バケットインスタンス作成
# オブジェクトを削除
bucket.delete_objects(
    Delete={
        'Objects': [{
                'Key': 'オブジェクト名'
            }]
    })
```

クライエントAPIの`delete_object()`メソッドでは単一のオブジェクトを指定していましたが、こちらの`delete_objects()`メソッドでは複数のオブジェクトをリスト指定（もちろん1個だけの指定も可能です）することにご注意ください。

##### バケット内の全てのオブジェクトを削除したい場合

バケット内の全てのオブジェクトを削除したい場合、先ほどの[オブジェクトの一覧表示](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#リソースapi-3)で登場した`objects`コレクション（`Object`クラスの[`delete()`メソッド](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/object/delete.html)）を用いて一括削除する事ができます。

```python:バケット内の全てのオブジェクトを削除
import boto3

s3resource = boto3.resource('s3')  # S3操作用インスタンス作成
bucket = s3resource.Bucket('バケット名')  # バケットインスタンス作成
# バケット内の全オブジェクトの削除
for object in bucket.objects.all():
    object.delete()
```

上記のように、イテレーションで簡単に複数のオブジェクトを操作できることも、リソースAPIのメリットの一つと言えそうです。

他にも[先ほどの`filter()`](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#リソースapi-3)メソッドを間に加える事で、フォルダ内のオブジェクトを丸ごと削除できます

```python:フォルダ内の全てのオブジェクトを削除
for object in bucket.objects.filter(Prefix='[フォルダ名]/').all():
    object.delete()
```

#### オブジェクトのコピー

##### クライエントAPI

以下のように、`copy_object()`メソッドでオブジェクトをあるS3バケットから他のバケットにコピーできます。

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/copy_object.html

```python:クライエントAPIによるオブジェクトの別バケットへのコピー
import boto3

s3client = boto3.client('s3')  # S3操作用インスタンス作成
# コピー元のバケットとオブジェクト（キー）を指定
object_key = 'オブジェクト名'
copy_source = {
        'Bucket': 'コピー元のバケット名',
        'Key': object_key
    }
# オブジェクトを別バケットにコピー
s3client.copy_object(
    CopySource=copy_source,
    Bucket='コピー先のバケット名',
    Key=object_key)
```

なお、`copy_object()`メソッドと似た機能を持つ`copy()`メソッドも存在します。前者は5GB以上のオブジェクトはコピーできないのに対し、後者はコピーできるという違いがあるようです（[参考](https://dev.classmethod.jp/articles/python-boto3-s3-meta-client-copy/)）

##### リソースAPI

以下のように、`Bucket`クラス内の`copy()`メソッドでオブジェクトをあるS3バケットから他のバケットにコピーできます。

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/bucket/copy.html

```python:リソースAPIによるオブジェクトの別バケットへのコピー
import boto3

s3resource = boto3.resource('s3')  # S3操作用インスタンス作成
target_bucket = s3resource.Bucket('コピー先のバケット名')  # コピー先のバケットインスタンス作成
# コピー元のバケットとオブジェクト（キー）を指定
object_key = 'オブジェクト名'
copy_source = {
        'Bucket': 'コピー元のバケット名',
        'Key': object_key
    }
# オブジェクトを別バケットにコピー
target_bucket.copy(
    CopySource=copy_source,
    Key=object_key)
```

##### バケット内の全てのオブジェクトをコピーしたい場合

バケット内の全てのオブジェクトをコピーしたい場合、先ほどの[オブジェクトの一覧表示](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#リソースapi-3)で登場した`objects`コレクションと`Bucket.copy()`メソッドを組み合わせて、一括コピーする事ができます。

```python:バケット内の全てのオブジェクトを別バケットにコピー
import boto3

s3resource = boto3.resource('s3')  # S3操作用インスタンス作成
source_bucket_name = 'コピー元のバケット名'  # コピー元のバケット名
source_bucket = s3resource.Bucket(source_bucket_name)  # コピー元のバケットインスタンス作成
target_bucket = s3resource.Bucket('コピー先のバケット名')  # コピー先のバケットインスタンス作成
# コピー元バケット内の全てのオブジェクトを走査
for object in source_bucket.objects.all():
    # コピー元のバケットとオブジェクト（キー）を指定
    copy_source = {
            'Bucket': source_bucket_name,
            'Key': object.key
        }
    # オブジェクトを別バケットにコピー
    target_bucket.copy(
        CopySource=copy_source,
        Key=object.key)
```

他にも[先ほどの`filter()`](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#リソースapi-3)メソッドを間に加える事で、特定のフォルダ（プレフィックス）内のオブジェクトを全てコピーする事もできます

#### オブジェクトの移動

##### クライエントAPI

オブジェクトを移動するメソッドは存在しませんが、[オブジェクトをコピーする](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#クライエントapi-7)`copy_object()`メソッドと[オブジェクトを削除する](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#クライエントapi-6)`delete_object()`を組み合わせれば、オブジェクトを別バケットに移動できます。

```python:クライエントAPIによるオブジェクトの別バケットへの移動
import boto3

s3client = boto3.client('s3')  # S3操作用インスタンス作成
source_bucket_name = '移動元のバケット名'  # 移動元のバケット名
# 移動元のバケットとオブジェクト（キー）を指定
object_key = 'オブジェクト名'
copy_source = {
        'Bucket': source_bucket_name,
        'Key': object_key
    }
# オブジェクトを別バケットにコピー
s3client.copy_object(
    CopySource=copy_source,
    Bucket='移動先のバケット名',
    Key=object_key)
# オブジェクトを移動元バケットから削除
s3client.delete_object(
    Bucket=source_bucket_name,
    Key=object_key)
```

##### リソースAPI

オブジェクトを移動するメソッドは存在しませんが、[オブジェクトをコピーする](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#リソースapi-7)`Bucket.copy()`メソッドと[オブジェクトを削除する](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#リソースapi-6)`Bucket.delete_objects()`を組み合わせれば、オブジェクトを別バケットに移動できます。

```python:リソースAPIによるオブジェクトの別バケットへのコピー
import boto3

s3resource = boto3.resource('s3')  # S3操作用インスタンス作成
source_bucket_name = '移動元のバケット名'  # 移動元のバケット名
source_bucket = s3resource.Bucket(source_bucket_name)  # 移動元のバケットインスタンス作成
target_bucket = s3resource.Bucket('移動先のバケット名')  # 移動先のバケットインスタンス作成
# 移動元のバケットとオブジェクト（キー）を指定
object_key = 'オブジェクト名'
copy_source = {
        'Bucket': source_bucket_name,
        'Key': object_key
    }
# オブジェクトを別バケットにコピー
target_bucket.copy(
    CopySource=copy_source,
    Key=object_key)
# オブジェクトを移動元バケットから削除
source_bucket.delete_objects(
    Delete={
        'Objects': [{
                'Key': object_key
            }]
    })
```

##### バケット内の全てのオブジェクトを移動したい場合

バケット内の全てのオブジェクトを移動したい場合、先ほどの[オブジェクトの一覧表示](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#リソースapi-3)で登場した`objects`コレクションと`Bucket.copy()`メソッド、`Object.delete`メソッドを組み合わせて、一括移動する事ができます。

```python:バケット内の全てのオブジェクトを別バケットに移動
import boto3

s3resource = boto3.resource('s3')  # S3操作用インスタンス作成
source_bucket_name = '移動元のバケット名'  # 移動元のバケット名
source_bucket = s3resource.Bucket(source_bucket_name)  # 移動元のバケットインスタンス作成
target_bucket = s3resource.Bucket('移動先のバケット名')  # 移動先のバケットインスタンス作成
# 移動元バケット内の全てのオブジェクトを走査
for object in source_bucket.objects.all():
    # 移動元のバケットとオブジェクト（キー）を指定
    copy_source = {
            'Bucket': source_bucket_name,
            'Key': object.key
        }
    # オブジェクトを別バケットにコピー
    target_bucket.copy(
        CopySource=copy_source,
        Key=object.key)
    # オブジェクトを移動元バケットから削除
    object.delete()
```

他にも[先ほどの`filter()`](https://qiita.com/c60evaporator/items/da47620d69f84a9be7dc#リソースapi-3)メソッドを間に加える事で、特定のフォルダ（プレフィックス）内のオブジェクトを全てコピーする事もできます


# 参考記事

https://qiita.com/iron-breaker/items/f35c1d54887c434a321a