AWS Control Tower,AFT 管理基盤

# 2025年06月20日

Git

**リポジトリ**: 0603game (private)

**主なコミット**

* backend‑setup フォルダ追加（Terraform state 用）
* provider.tf / main.tf / backend.tf 初版追加
* S3\&DynamoDB バケット ACL / Versioning / SSE 分離対応
* .terraform-version を 1.12.2 → 1.4.6 に更新 *（バージョンのみ、ハッシュ・ブランチ名などは伏せ）*

---

Terraform

**バージョン**: 1.4.6

**プロジェクト構成**

```
infra/
└── backend-setup/
    ├── backend.tf
    ├── main.tf
    └── provider.tf
```

**State Backend**

* **S3 バケット**: 3 つ（tano‑tfstate‑aft‑setup, ‑accounts, ‑prd）
* **DynamoDB テーブル**: 3 つ（tano‑tflock‑aft / ‑accounts / ‑prd）
* **タグ付与**: Owner=tano, Project=0603game, environment=root

**apply 結果**: 1 回目 6 リソース作成 → 警告解消のため 3 段階で追加リソース (SSE, Versioning, ACL) を追加。最終的に *CREATE\_COMPLETE*。

---

AWS

**Control Tower (Phase 1)**

* ランディングゾーン **ACTIVE**
* OU: Root / Security / Sandbox (Security, Root = 成功、Sandbox = Drifted ※空 OU のため想定)
* 共有アカウント: LogArchive / Audit **Enrolled**
* CloudFormation: 2 つの MASTER スタック (*BASELINE‑CLOUDTRAIL* / *BASELINE‑CONFIG*) が **CREATE\_COMPLETE**
* CloudTrail 組織トレイル: aws‑controltower‑organization‑trail → LogArchive バケットへログ確認

**S3 ログバケット**

* aws‑controltower‑logs‑\<org‑id>‑ap‑northeast‑1 → アクセス拒否はサービスロール制御のため正常

---

ディレクトリ構造（最新）

```
0603game/
├── .envrc
├── .terraform-version
├── infra/
│   └── backend-setup/
│       ├── backend.tf
│       ├── main.tf
│       └── provider.tf
└── (アプリ側ファイル一式)
```

---

次回実施予定

**Phase 2 — AFT 管理基盤**

1. *aft-setup/* Terraform プロジェクト作成（State: tano‑tfstate‑aft‑setup）
2. `main.tf` に公式モジュール `aws-ia/control_tower_account_factory/aws` を記述
3. 変数 `ct_management_account_id`, `aft_management_account_id`, `ct_home_region` 設定
4. `terraform init / apply` で CodePipeline & CodeBuild & Step Functions デプロイ
5. AFT Bootstrap Pipeline の *Succeeded* を確認

**補足 TODO**

* Sandbox OU 下にアカウントが無い状態なので、Phase 3 で dev/stg/prd アカウントを作成後にベースライン状態を再確認
* LogArchive / Audit の root MFA を改めて有効化チェック

---

備考

* 機密情報（AWS アカウントID, commit hash 等）は一部伏せ字 or 省略
* CloudFormation 詳細は **StackSets** 配下で 40+ ネストスタックが CREATE\_COMPLETE を確認
はい、承知いたしました。
これまでの全ての対話と、共有いただいた最新の状況を踏まえて、本日実施した内容の日報を詳細に作成します。

# 2025年06月21日

**・本日実施した主な内容（サマリー）**

本日は、先日来の計画に基づき、Terraformを使用して本格的なマルチアカウント環境を構築する作業に着手しました。具体的には、TerraformのStateを分離管理するための基盤（S3バケット、DynamoDBテーブル）をコードで作成し、AWS上にデプロイしました。また、その次のステップであるAFT（Account Factory for Terraform）基盤をデプロイするためのTerraformプロジェクトの準備とコード修正を行いました。

**・git**

**証跡**: ありません。
**成果物**:

  * **リポジトリ**: `0603game` (private)
  * **主なコミット**:
      * `backend-setup` フォルダ追加（Terraform state 用）
      * `provider.tf` / `main.tf` / `backend.tf` 初版追加
      * S3\&DynamoDB バケット ACL / Versioning / SSE 分離対応
      * `.terraform-version` を `1.12.2` → `1.4.6` に更新
      * （コミットハッシュやブランチ名などの機密情報は伏せています）

**・terrafrom**

**証跡**: ターミナルでの `terraform plan`, `terraform apply` の実行ログ。
**成果物**:

  * **バージョン**: 1.4.6
  * **プロジェクト構成**:
      * **State Backend用プロジェクト (`infra/backend-setup`)**:
          * `main.tf`: 3種類のS3バケットとDynamoDBテーブルを定義。
          * `provider.tf`: AWSプロバイダと認証情報を設定。
          * `backend.tf`: このプロジェクト自体のStateをローカルに保存する設定。
      * **AFT基盤用プロジェクト (`infra/aft-setup`)**:
          * `main.tf`: 公式AFTモジュールを呼び出すコードを記述。
          * `versions.tf`: Terraform本体とAWSプロバイダのバージョンを、`~> 1.8`, `~> 5.0`といったベストプラクティスに沿って指定。
          * `variables.tf`: AFTモジュールが必要とする変数（アカウントIDなど）を定義。
          * `provider.tf`: AWSプロバイダの設定を記述。
          * `backend.tf`: Stateの保存先として、`backend-setup`で作成したS3バケットとDynamoDBテーブルを指定。
  * **`apply` 結果**:
      * `backend-setup` プロジェクトの `apply` が成功し、TerraformのStateを分離管理するためのS3バケット3つと、Stateロック用のDynamoDBテーブル3つがAWS上に作成されました。
      * S3バケットにはバージョニング、サーバーサイド暗号化（SSE-S3）、そして最新のベストプラクティスである「バケット所有者強制（BucketOwnerEnforced）」の所有権制御が設定されました。
  * **トラブルシューティング**:
      * `terraform apply` 時に発生したS3の `AccessControlListNotSupported` エラーに対し、古い `aws_s3_bucket_acl` リソースを削除し、代わりに `aws_s3_bucket_ownership_controls` リソースを追加することで解決しました。

**・ディレクトリ構造**

  * **証跡**: ターミナルでの `ls` コマンド実行結果。

  * **成果物**:

      * Terraformのコードを目的別に管理するため、`infra` ディレクトリを作成し、その配下に `backend-setup` と `aft-setup` という2つの独立したプロジェクトディレクトリを配置する構成としました。

    <!-- end list -->

    ```
    0603game/
    ├── .envrc
    ├── .terraform-version
    ├── infra/
    │   ├── aft-setup/
    │   │   ├── backend.tf
    │   │   ├── main.tf
    │   │   ├── provider.tf
    │   │   ├── variables.tf
    │   │   └── versions.tf
    │   └── backend-setup/
    │       ├── main.tf
    │       ├── provider.tf
    │       └── terraform.tfstate (ローカル)
    └── (アプリ側ファイル一式)
    ```

**・aws**

  * **証跡**: `terraform apply` の結果、AWSコンソール上で確認できるリソース群。
  * **成果物**:
      * **Control Tower (前日までの作業)**:
          * ランディングゾーンの展開が完了し、`Security`と`Sandbox`のOU、および`LogArchive`, `Audit`の共有アカウントが`Enrolled`（登録済み）状態であることを確認。
      * **Amazon S3 (本日作成)**:
          * TerraformのState管理用に、以下の3つのS3バケットをTerraformで作成。
              * `tano-tfstate-aft-setup`
              * `tano-tfstate-accounts`
              * `tano-tfstate-prd`
      * **Amazon DynamoDB (本日作成)**:
          * TerraformのStateロック用に、以下の3つのDynamoDBテーブルをTerraformで作成。
              * `tano-tflock-aft`
              * `tano-tflock-accounts`
              * `tano-tflock-prd`

**・次回実施**

  * **Phase 2 — AFT 管理基盤のデプロイ**
      * **タスク2-4**: `infra/aft-setup` ディレクトリで `terraform apply` を実行し、AFTの基盤となるAWSリソース（CodePipeline, CodeBuild, Step Functionsなど）をデプロイします。
          * **事前作業**: `apply` を実行する前に、`ct_management_account_id`, `aft_management_account_id`, `log_archive_account_id`, `audit_account_id` の各変数の値を、AWSコンソールから確認して準備します。
      * **タスク2-5**: デプロイ後にAWS CodePipelineのコンソールを開き、AFTのパイプラインが正常に完了（Succeeded）することを確認します。