[STEPBYSTEP]初めてAWSサービスからAmazonS3　AWS　CloudFormationテンプレート作成まで

今回は初心者向けにAmazon S3のAWS CloudFormationテンプレートの作成方法についてご紹介いたします。
説明と共に実際に作成する時の動画もYoutubeで配信しておりますので、ご確認いただけますと幸いです。   

**日本語版**  

https://youtu.be/0q1cMSOKdik?si=MzbNwj7ielXRn1MX

**英語版**  

https://youtu.be/iyjq2FunFHM?si=K-eaYniPYNApuTeN



### テンプレートの作成手順

1. **ステップ1: CloudFormationテンプレートの基本セクションを作成**  
   AWS CloudFormationテンプレートはいくつかの基本セクションから構成されます。今回は、`AWSTemplateFormatVersion`, `Description`, `Parameters`, `Resources` を利用します。これらのセクションを定義することで、AWSリソースの作成と管理が行えます。

2. **ステップ2: S3 Bucketのリソース作成**  
   ここでは、S3バケットを作成するためのCloudFormationテンプレートの記述方法を紹介します。特定の要件に基づいて、バケットのプロパティ（例：オブジェクトの暗号化、パブリックアクセスの設定、バージョニングの有効化/無効化など）を設定する方法を取り上げます。

3. **ステップ3: S3 BucketPolicyのリソース作成**  
   S3バケットポリシーは、バケットのアクセス制御を管理するための重要なリソースです。このステップでは、特定のIAMロールがS3バケットにオブジェクトを書き込む権限を持つようにバケットポリシーを設定する方法を紹介します。

4. **ステップ4: スタック作成する際の構文エラーを解決**  
   CloudFormationテンプレートには、記述ミスや構文エラーが生じる可能性があります。このステップでは、これらのエラーを特定し、解決する方法を紹介します。（詳細は動画で確認）

5. **ステップ5: スタック作成する際のスタック作成失敗を解決**  
   たとえ構文エラーがなくても、リソースの作成や更新時に問題が発生することがあります。このステップでは、スタック作成失敗の原因を特定し、それを解決する方法を紹介します。（詳細は動画で確認）


### Amazon S3のAWS CloudFormationテンプレート: 実装要件
今回Amazon S3 CloudFormationテンプレート作成するために簡単な要件設定しました。
設定した要件に従って今回CFnテンプレート作成していきます。

#### 1. **S3バケット**
- **オブジェクト暗号化**:  
  S3バケット内のオブジェクトはSSE-S3を使用して暗号化する。  
  これにより、保存されるデータのセキュリティが強化されます。

- **パブリックアクセスの制限**:  
  バケット内のデータに対する公開アクセスを許可しない。  
  外部からの不正アクセスを防ぎます。

- **バージョニング**:  
  ユーザーがバージョニングを有効または無効に設定できるようにする。  
  オブジェクトの変更履歴を保持できます。これは、以前のバージョンのデータを回復する必要がある場合などに役立ちます。

#### 2. **S3バケットポリシー**

- **特定のIAMロールへのアクセス制限**:  
  指定されたIAMロールのみがS3バケットにオブジェクトを書き込むことを許可。  
  バケットへの書き込みアクセスを制限し、データのセキュリティを保護できます。

#### 3. **パラメータ**

- **バケット名**:  
  作成するS3バケットの名前を指定。

- **バージョニングの選択**:  
  ユーザーがバージョニングを「有効」または「無効」に設定できるようする。

- **書き込み権限を持つIAMロール**:  
  S3バケットにデータを書き込むことが許可されているIAMロールの名前を。


### AWS CloudFormationテンプレート作成: ステップ1 

#### 基本セクションの作成

AWS CloudFormationテンプレートの作成を開始する際、基本セクションを理解して正しく記述することが非常に重要です。

公式ドキュメントにも詳しく説明されているように、テンプレートは主に以下の基本セクションで構成されています。

- **AWSTemplateFormatVersion**:  
  このフィールドは、使用しているCloudFormationテンプレートのバージョンを示します。現時点での最新バージョンは "2010-09-09" です。

- **Description**:  
  このオプショナルなフィールドには、テンプレートの簡単な説明を追加できます。これにより、他のエンジニアや開発者がテンプレートの目的や機能を迅速に理解できるようになります。

- **Parameters**:  
  テンプレート内で使用するいくつかの変数や設定を外部から受け取るためのフィールドです。例えば、S3バケットの名前やIAMロールの名前など、固定せずに動的に設定したい値をここで定義します。

- **Resources**:  
  AWSリソース（S3バケット、IAMロール、EC2インスタンスなど）の具体的な定義を含むセクションです。これはテンプレートの中核部分であり、どのAWSリソースをどのように作成するかを詳細に指定します。

```yaml
AWSTemplateFormatVersion: "2010-09-09"
Description:
Parameters:
  set of parameters
Resources:
  S3Bucket:
  S3BucketPolicy:
```

### AWS CloudFormationテンプレート作成: ステップ2

#### S3 Bucketのリソース作成

1. **Parametersセクション**:
   - **BucketName**: S3バケットの名前を指定するためのパラメータ。
   - **WritableRoleName**: 書き込みが許可されるIAMロールの名前を指定するパラメータ。
   - **VersioningConfiguration**: バージョニングの有効/無効を選択するためのパラメータ。デフォルトは「Enabled」となっており、「Enabled」または「Suspended」の選択が可能です。

2. **Resourcesセクション**:
   - **S3Bucket**: リソースのタイプは`AWS::S3::Bucket`として、以下のプロパティを持つS3バケットを作成します。
     - **BucketName**: 前述のBucketNameパラメータを参照して、バケットの名前を設定します。
     - **BucketEncryption**: オブジェクトの暗号化を有効にするための設定。ここではSSE-S3を使用してAES256アルゴリズムでの暗号化を指定します。
     - **PublicAccessBlockConfiguration**: パブリックアクセスの設定。
     - **VersioningConfiguration**: バージョニングの設定。前述のVersioningConfigurationパラメータを参照して、バージョニングを有効または無効にします。

```yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: Create with me for S3
Parameters:
  BucketName: 
    Type: String
    MinLength: 1
  WritableRoleName: 
    Type: String
    MinLength: 1
  VersioningConfiguration: 
    Type: String
    Default: Enabled
    AllowedValues:
      - "Enabled"
      - "Suspended"
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties: 
      BucketName: !Ref BucketName
      BucketEncryption: 
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256
      PublicAccessBlockConfiguration: 
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
      VersioningConfiguration:
        Status: !Ref VersioningConfiguration
```

### AWS CloudFormationテンプレート作成: ステップ3

#### S3 BucketPolicyのリソース作成

1. **Resourcesセクション**:
   - **S3BucketPolicy**: S3バケットに関連するアクセスポリシーを定義する部分です。
     - **Bucket**: このポリシーが適用されるS3バケットを指定します。  
     前に作成した`S3Bucket`リソースを参照しています。
     - **PolicyDocument**: 実際のポリシーの内容を定義するセクション。
       - **Version**: IAMポリシーのバージョンを指定。
       - **Statement**: 実際のポリシーのルールをリスト形式で記述します。

```yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: Create with me for S3
Parameters:
  BucketName: 
    Type: String
    MinLength: 1
  WritableRoleName: 
    Type:

 String
    MinLength: 1
  VersioningConfiguration: 
    Type: String
    Default: Enabled
    AllowedValues:
      - "Enabled"
      - "Suspended"
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties: 
      BucketName: !Ref BucketName
      BucketEncryption: 
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256
      PublicAccessBlockConfiguration: 
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
      VersioningConfiguration:
        Status: !Ref VersioningConfiguration
  S3BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref S3Bucket
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Action:
              - 's3:PutObject'
            Effect: Allow
            Principal: 
              AWS: !Sub arn:aws:iam::${AWS::AccountId}:role/${WritableRoleName}
            Resource: !Sub arn:aws:s3:::${S3Bucket}/*
```

---

テンプレートの作成方法についての基本的な解説は以上です。ステップ4と5についての詳しい情報は動画でご確認ください。