AWS勉強備忘録16 - 命名規則、バケットポリシー、ユーザーポリシー、Webサイトホスティング

Amazon S3バケットを作成する際、バケット名は全AWSユーザー間で唯一無二でなければなりません。このため、バケット名を選ぶ際にはいくつかの命名規則に従う必要があります。

- **バケット名は小文字のみ**を使用できます。
- **数字とダッシュ(-)** も使用できますが、連続するダッシュは使用できません。
- バケット名は**3文字以上**と**63文字以下**でなければなりません。
- バケット名は数字やダッシュで始まることはできません。
- 「.」（ドット）を含むバケット名は、特定の条件下でのSSLの問題を引き起こす可能性があるため、推奨されません。

これらの規則に従ってバケット名を選ぶことで、グローバルに一意のバケット名を確保することができます。

## バケットポリシーとユーザーポリシー

Amazon S3でのアクセス制御には、主に「バケットポリシー」と「ユーザーポリシー」の二つのメカニズムがあります。これらのポリシーを使って、バケットやオブジェクトへのアクセスを細かく制御できます。

### バケットポリシー

- **概要**: バケットポリシーは、バケットレベルで設定されるアクセス許可ポリシーです。JSON形式で記述され、バケットに対するアクセス許可や拒否ルールを定義します。
- **アクセス制限の対象と内容**: バケットポリシーを使用すると、特定のIPアドレスからのアクセスのみを許可したり、特定のユーザーやロールに対してバケットへの読み取りや書き込みアクセスを許可または拒否することができます。また、パブリックアクセスの許可や拒否もこのポリシーで設定します。

### ユーザーポリシー

- **概要**: ユーザーポリシーは、AWS Identity and Access Management (IAM) のユーザー、グループ、またはロールに直接割り当てられるアクセス許可ポリシーです。これらはIAMリソースに対するアクセス権を制御します。
- **アクセス制限の対象と内容**: ユーザーポリシーでは、特定のS3バケットやオブジェクトへのアクセスを許可するルールを設定できます。具体的には、ユーザーに対して特定のS3アクション（例えば、GetObjectやPutObject）を実行する権限を付与したり、その権限を制限することができます。

これらのポリシーを組み合わせることで、S3バケットとその中のオブジェクトへのアクセスを細かく、かつ柔軟に制御することができます。ポリシーの設定には慎重さが求められますが、適切に設定することで、データのセキュリティを確保しながら効率的にアクセス管理を行うことが可能です

### アクセス制御の対象と内容
アクセス制限で設定できることは、リソース、アクション、エフェクト、プリンシパルです。
| 要素       | 説明                                                                                             |
|----------|------------------------------------------------------------------------------------------------|
| リソース    | アクセス制限の対象となるAWSリソース。S3バケットやオブジェクトなど、特定のリソースを指定します。                  |
| アクション  | 許可または拒否する操作。S3の場合は、GetObject（オブジェクトの読み取り）、PutObject（オブジェクトの書き込み）、DeleteObject（オブジェクトの削除）などのS3アクションが該当します。 |
| エフェクト  | ポリシーの結果として適用されるアクション。通常は「Allow」（許可）または「Deny」（拒否）のどちらかを指定します。         |
| プリンシパル | ポリシーが適用されるAWSのアカウントまたはユーザー。特定のユーザーやロール、または匿名ユーザー（公開アクセス）を指定することができます。    |

## S3によるWEBサイトホスティング
Amazon S3は静的ウェブサイトホスティングに最適化されており、HTML、CSS、JavaScriptファイル（）などの静的コンテンツの配信に使用できます。これには、クライアントサイドで実行されるスクリプト（例：JavaScript）が含まれますが、サーバー側で処理が必要な動的コンテンツ（例：Ruby、PHP、Javaで書かれたアプリケーション）のホスティングには適していません。

動的ウェブサイトをホスティングする場合、サーバー側でのスクリプト実行やデータベースの処理が必要になるため、Amazon EC2（Elastic Compute Cloud）やAWS Lambdaのようなサービスを使用する必要があります。EC2を使用すると、仮想サーバー上でフルスタックのウェブアプリケーションを実行することができ、CPUやメモリなどのリソースを自由に選択し、カスタマイズすることが可能です。

AWS Lambdaを使用すると、サーバーレスアーキテクチャで動的コンテンツを提供することもできます。Lambdaでは、イベント駆動型でコードを実行できるため、APIリクエストに応じて動的コンテンツを生成し、S3でホストされる静的コンテンツと組み合わせて使用することができます。

動的ウェブサイトの場合、Amazon S3はコンテンツのストレージとして、または静的コンテンツの配信として利用しつつ、アプリケーションの動的な部分はEC2やLambdaを使って処理するというアーキテクチャが一般的です。

### EC2, S3, Amazon Lightsail, AWS Amplifyの比較
| サービス        | 違いと特徴                                                                                              | メリット                                                                                         | デメリット                                                                                             |
|-------------|-----------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------|
| EC2         | 仮想サーバーインスタンスを提供。フルコントロールが可能で、任意のウェブサーバーソフトウェアをインストールして実行できる。              | - 高い柔軟性と制御性<br>- 複雑なアプリケーションや動的コンテンツのホスティングに適している                | - 管理が複雑<br>- コストが予測しにくいことがある<br>- セキュリティやバックアップなどの管理がユーザー側に委ねられる              |
| S3         | ストレージサービスで、静的ウェブサイトホスティングが可能。HTML、CSS、JavaScriptなどを直接ホスティングできる。                     | - 低コストで運用可能<br>- スケーラビリティと耐久性が高い<br>- シンプルな静的サイトに最適                    | - 動的コンテンツを直接サポートしていない<br>- サーバーサイドスクリプトやデータベースの直接的な実行ができない                    |
| Lightsail   | シンプルな仮想プライベートサーバー(VPS)を提供。固定料金プランで、初心者向けに簡素化された管理インターフェースを提供する。                  | - 価格が明確で予算管理が容易<br>- 管理が簡単で、小規模アプリケーションや個人のプロジェクトに適している<br>- サーバーのセットアップが容易 | - 拡張性の制限<br>- 大規模なアプリケーションや高度な設定が必要な場合は不向き                                    |
| AWS Amplify | ウェブアプリとモバイルアプリの開発を容易にするためのフルマネージドサービス。静的ウェブサイトと動的バックエンドの両方をサポート。             | - 静的サイトと動的アプリケーションの両方をサポート<br>- 開発プロセスの迅速化<br>- バックエンド機能の簡単な統合 | - 利用する機能によってはコストが高くなる可能性<br>- フルスタックアプリケーションにはある程度の学習が必要                       |