AWS勉強備忘録15 - S3を使用する流れ

# Amazon S3の基本: バケットとオブジェクトの操作

## S3の基本概念

### バケット
- **定義**: S3でデータを格納するためのコンテナです。バケット内には無制限のオブジェクトを格納できます。
- **バケット名**: グローバルに一意である必要があります。バケット名は、S3内でのリソースのアドレス指定に使用されます。

### オブジェクト
- **定義**: ファイルとそのメタデータを含むデータの実体です。オブジェクトはバケット内に格納されます。
- **オブジェクトキー**: オブジェクトの識別子です。すべてのオブジェクトは、必ず1つのキーを持ちます。バケット、オブジェクトキー、バージョンの組み合わせによってオブジェクトを一位に識別する。実質的には名前のようなもの。また、ファイルパスのような構造をとれる。
- **オブジェクトメタデータ**: 名前と値のセットのことです。オブジェクトのアップロード時に設定できる。オブジェクトキーはS3がファイルを識別するためのデータだが、メタデータは、人間がファイルを管理しやすくするためのデータと考えるとわかりやすいです。

### その他の用語
- **リージョン**: AWSが世界中に設置しているデータセンターの地理的な場所。S3バケットは特定のリージョンに作成されます。
- **データ整合性モデル**: S3は高いデータ整合性を保証します。新しいオブジェクトの書き込み後や既存オブジェクトの上書き・削除後すぐに整合性が得られます。
- **バージョニング**: バケット内のオブジェクトの異なるバージョンを別オブジェクトとして保存する機能です。これにより、誤って削除または上書きされたオブジェクトを復元できます。
- **ログ**: アクセスログやオブジェクトの操作ログを記録できます（バケット単位、オブジェクト単位で記録可能）。セキュリティ分析や監査に役立ちます。
- **暗号化**: S3ではデータの暗号化を提供しており、データの安全性を高めます。クライアント側またはサーバー側での暗号化が可能です。
- **アクセス制御**: バケットやオブジェクトに対するアクセス権を管理するための機能。IAMポリシーやバケットポリシーを使用して細かく制御できます。
- **Webサイトホスティング**: S3バケットを使用して静的なウェブサイトをホスティングできます。HTML、CSS、JavaScriptファイルなどを格納し、公開することが可能です。

## S3使用の流れ
バケットの作成や各種設定など、基本的なS3の操作は、マネジメントコンソールのS3ダッシュボードから行います。
オブジェクト（ファイル）のアップロードもマネジメントコンソールのS3ダッシュボードから行えます。日常的なファイルのアップロードを、毎回マネジメントコンソールにログインして行うのは不便なので、APIやSDKを利用してアップロードすることも可能になっています。また、AWS Transfer Familyを使うとSFTP（SSHで暗号化されたファイル転送のプロトコル）でもアクセスできます。

1. **バケットの作成**: S3ダッシュボードからバケットを作成し、グローバルに一意な名前をつけます。
2. **オブジェクトのアップロード**: ダッシュボードからファイル（オブジェクト）をバケットにアップロードします。大量のファイルアップロードや定期的なアップロードにはAPIやSDK、AWS Transfer Familyを使用します。

### APIとSDK
- **API**: Amazon S3の機能をプログラム的に操作するためのインターフェース。HTTPリクエストを使用してS3のリソースにアクセスし、オブジェクトのアップロード、ダウンロード、リストアップ、削除などが行えます。
- **SDK (Software Development Kit)**: 特定のプログラミング言語でS3 APIを簡単に使用できるようにするライブラリやツールの集合。AWS SDKは、Python、Java、Ruby、Node.jsなど複数の言語で利用可能です。

これらを利用することで、アプリケーションから直接S3にデータをアップロードしたり、データを操作するプロセスを自動化できます。

## 実践的なS3の操作

### バケットの作成
マネジメントコンソールのS3ダッシュボードから「バケットを作成」を選択し、バケット名を指定します。この名前はグローバルで一意である必要があります。また、リージョンを選択し、バケットの設定（バージョニング、暗号化、ログ記録など）を行います。

### オブジェクトのアップロード
バケットが作成されたら、オブジェクトをアップロードできます。ファイルを選択し、「アップロード」をクリックします。APIやSDKを使用して、アプリケーションから直接ファイルをアップロードすることも可能です。

### アクセス制御とセキュリティ
オブジェクトやバケットに対するアクセス権限を設定することができます。IAMユーザー、グループ、またはロールに対して特定のS3アクションを許可または拒否するポリシーを作成できます。また、オブジェクトレベルで公開設定を行うことも可能です。

### データの保護
S3はデータの暗号化オプションを提供しています。サーバー側暗号化（SSE）では、AWSがデータを保存時に暗号化し、アクセス時に復号化します。クライアント側暗号化では、データをアップロードする前にアプリケーション側で暗号化する必要があります。

### 高度な機能
- **バージョニング**: バケットのバージョニングを有効にすると、オブジェクトの異なるバージョンを保存し、必要に応じて以前のバージョンを復元できます。
- **ライフサイクルポリシー**: データのライフサイクル管理を自動化し、特定の期間が経過したオブジェクトを別のストレージクラスに移動させたり、自動的に削除するポリシーを設定できます。

Amazon S3はその強力な機能と柔軟性により、データストレージと管理のニーズに幅広く対応します。APIやSDKを活用することで、日々の作業を効率化し、セキュリティを確保しながらデータを管理できます。


## Amazon S3バケット作成前の検討事項

Amazon S3バケットを作成する際、計画段階で考慮すべき重要なポイントがいくつかあります。特に、バケットの名前やリージョンは作成後に変更できないため、事前にしっかり検討する必要があります。

### 用途の明確化

S3バケットを作成する目的を明確にしておくことが重要です。S3バケットは多様な用途で利用できますが、特にWebサーバーとして使用する場合は、その他の用途と比べて異なる設定が必要になることがあります。

#### Webサーバーとしての使用

S3バケットをWebサーバーとして使用する場合、以下の点を考慮する必要があります。

- **バケットの公開**: ウェブサイトとしてコンテンツを公開するためには、バケットの公開設定が必要です。
- **カスタムドメイン**: バケットにカスタムドメインを設定する場合、DNS設定を含め事前に計画する必要があります。
- **匿名アクセスの許可**: ウェブサイトとして公開するためには、匿名ユーザーからのアクセスを許可する設定が必要です。

これらの設定は後から変更可能ですが、バケットの用途や設定によってはセキュリティリスクが伴う場合があるため、注意深く検討する必要があります。

### テスト用バケットの利用

事前に完全に計画を立てることが難しい場合や、設定の試行錯誤が必要な場合は、テスト用のバケットを作成して実験することをお勧めします。テスト用バケットを利用することで、本番環境に影響を与えることなく、さまざまな設定や機能を試すことができます。ただし、テスト用であっても秘匿性の高いデータを扱う場合は、セキュリティ対策を怠らないようにしましょう。

### 事前検討の重要性

- **バケット名の一意性**: バケット名はAWS全体で一意でなければなりません。名前の競合を避けるため、ユニークな命名規則を事前に計画しておくと良いでしょう。
- **リージョンの選択**: バケットを作成するリージョンを選択する際には、データの所在地の法規制、アクセス速度、料金などを考慮する必要があります。

S3バケットの作成は、クラウドサービスの強みを活かしながらも、セキュリティや運用の観点から慎重に検討する必要があります。計画段階での検討を怠ると、後になってからの変更や対応が困難になる場合があるため、事前にしっかりと計画を立てることが重要です。

## 参考表
| 使用目的                  | 条件                             | 必要な設定または考慮点                                                     |
|-------------------------|--------------------------------|------------------------------------------------------------------------|
|Webサイトとして使用する（匿名ユーザからのアクセスを許可）|独自ドメインを使用する|- バケット名をドメイン名と一致させる必要あり<br>- DNS設定でバケットへのルーティングを設定|
|                         | 独自ドメインを使用しない|- 好きな名前をバケットに設定可能<br>- ただし、バケット名がURLの一部となるため注意（例: `my-bucket.s3.amazonaws.com`） |
| Webサイトとして使用しない   | ファイルサーバとして使用する場合       | - アクセス制御の設定<br>- 必要に応じてAWS Transfer FamilyなどのSFTPサービスの準備                 |
|                         | ログ置き場として使用する場合         | - アクセス制御の設定<br>- 接続元や認証方法の検討<br>- ログデータのアクセスパターンに応じたストレージクラスの選択    |