AFTでアカウント管理やってみた!
はじめに
みなさんこんにちは。最近ひよこのヘアバンドがトレードマークになりつつあるhiropyです。
今回は、社内でサンドボックス環境を運用していくにあたり「AWS Control Tower Account Factory for Terraform(AFT)」を導入してみましたので記事にしてみようと思います。
前提条件
AFTを導入するにあたり、以下の準備ができていることが前提となります。
- ControlTowerの導入が完了している
- Githubのリポジトリが2つ用意されていること(※アカウント発行のみであれば2つ、詳細なカスタマイズが必要である場合は4つ必要です)
- ローカル環境でDockerが使用できること
リポジトリに関しては、名前の制約等は特にありません。
とりあえずアカウントが作りたい! という方は2つでいいかと思います。
<注意>
手順5において、GithubのOwner権限が必要になります。
組織のGithubを利用している場合は、手順5の作業をOwner権限を持っている方に依頼してください。
そもそもAFTって?
公式によると、
AWS Control Tower Account Factory for Terraform(AFT)は、GitOpsモデルに従って、AWS Control Towerのアカウントプロビジョニングとアカウントアップデートのプロセスを自動化します。アカウントリクエスト Terraform ファイルを作成し、アカウントプロビジョニングのための AFT ワークフローをトリガーする必要なインプットを提供することになります。
とのことです。
ざっくり言うと、TerraformファイルでOU内のアカウントを管理できるものになります。
裏側ではLambdaやCodePipelineが走り、アカウントを自動でデプロイしてくれます。
Terraformの実行環境が必要では?と思った方もいらっしゃるかもしれませんが、今回はTerraformの実行環境をDockerで準備するので心配ご無用です。
環境構築やってみる
それでは早速本題に移りましょう!
まずは環境構築からです。
1. OUとAFT管理アカウントを準備する
AFTを使用してデプロイする際に、「アカウントデプロイ先のOU、AFT管理用のアカウント、ControlTower管理アカウントで使用するIAMユーザ」の3つが必要になります。
詳細は割愛しますが、ControlTower配下にアカウントをデプロイするためのOU、アカウントをデプロイするためのOUの中にAFT管理用のアカウント、ControlTower管理アカウントの中にIAMユーザを作成してください。
IAMユーザについては、AdministratorAccess
の権限を付与し、アクセスキーを発行してください。(こちらは後ほど使用します。)
2. リポジトリを準備する
コードを置くためのリポジトリを準備します。
事前に準備していただいたリポジトリ内にコードを配置していきます。
今回私は、以下のようなリポジトリを作成しました。
- sandbox-account-management_tf: アカウント定義のコードを置くためのリポジトリ。
- sandbox-account-provisioning-customizations_tf: アカウントをカスタマイズするためのリポジトリですが、今回はファイルを置くだけで特に操作は行いません。
以下のリポジトリからzipファイルをダウンロードし、
https://github.com/aws-ia/terraform-aws-control_tower_account_factory
各リポジトリにそれぞれ以下の通りファイルをコピーします。
- sandbox-account-management_tf -> terraform-aws-control_tower_account_factory/sources/aft-customizations-repos/aft-account-requestのterraformフォルダをコピーして配置
- sandbox-account-provisioning-customizations_tf -> terraform-aws-control_tower_account_factory/sources/aft-customizations-repos/aft-account-provisioning-customizations/のterraformフォルダをコピーして配置
さらに、sandbox-account-management_tf
リポジトリのルートに以下のzipファイルを解凍して配置します。
現時点で、それぞれのファイル構造は以下のようになっていると思います。
sandbox-account-management_tf
├── terraform
├── Dockerfile
├── Dockerfile.tflint
├── env.sample
├── main.tf.sample
└── docker-compose.yml
sandbox-account-provisioning-customizations_tf
└── terraform
3. 各ファイルを編集する
コピーしてきたファイル達はテンプレートのままなので、各ファイルに必要な値を入れていきます。
env.sample
ファイル名を.env
に変更し、それぞれ以下のように追記します。
(<>は必要ないので消してください)
AWS_ACCESS_KEY_ID=<先ほど発行したアクセスキー>;
AWS_SECRET_ACCESS_KEY=<先ほど発行したシークレットアクセスキー>;
AWS_DEFAULT_REGION=<AFTが作成するリソースをデプロイするリージョン>;
main.tf.sample
ファイルを修正する前に、ControlTower管理アカウント内でS3バケットを1つ作成しておきます。
ファイル名をmain.tf
に修正し、以下の通り修正します。
provider "aws" {
region = "<AFTリソースをデプロイするリージョン>"
}
terraform {
required_version = ">= 1.3.7"
backend "s3" {
bucket = "<作成したS3バケット名>" # 作成したS3バケット
region = "<バケットを作成したリージョン>"
key = "terraform.tfstate"
}
}
作成したバケット内に、tfstateファイルが作成されます。
aft.tf
リポジトリのルートにaft.tf
というファイルを作成して、以下のコードを貼り付けます。(ファイル名はなんでもOKです)
module "aft" {
source = "github.com/aws-ia/terraform-aws-control_tower_account_factory"
# Required Vars
ct_management_account_id = "<ControlTower管理アカウントのID>"
log_archive_account_id = "<LogアーカイブアカウントのID>"
audit_account_id = "<監査アカウントのID>"
aft_management_account_id = "<AFT管理アカウントのID>"
ct_home_region = "<ControlTowerのホームリージョン>"
tf_backend_secondary_region = "us-west-2"
# VCS Vars
vcs_provider = "github"
account_request_repo_name = "<リポジトリのOrganization名>/sandbox-account-management_tf"
global_customizations_repo_name = "<リポジトリのOrganization名>/sandbox-account-provisioning-customizations_tf"
account_customizations_repo_name = "<リポジトリのOrganization名>/sandbox-account-provisioning-customizations_tf"
account_provisioning_customizations_repo_name = "<リポジトリのOrganization名>/sandbox-account-provisioning-customizations_tf"
# Optional Feature Flags
aft_feature_delete_default_vpcs_enabled = true
aft_feature_cloudtrail_data_events = true
aft_feature_enterprise_support = false
aft_vpc_endpoints = false
}
<>の箇所は適当な値に修正してください。
なお、<AFT管理アカウント>
とは、1. で作成したアカウントを指しています。
4. Terraformを実行する
ここまできたらファイルの準備は完了です!
実際にコンテナを立ち上げて、アカウントデプロイを実施するための環境を構築していきましょう!
まずは以下のコマンドを実行してコンテナを立ち上げます。
make build
次に以下のコマンドを実行します。
make init
さらに以下のコマンドを実施します。
make apply
300以上のリソースの追加確認が出るかと思いますが、yesと入力してリソースがデプロイされるのを待ちます。
(こちらは結構時間がかかります)
5. Githubのコネクターを追加する
< 注意 >
この作業はGithubの管理者権限が必要です!
ここまできたら後少しです!
GithubとAWS環境を繋げることで、コードの変更をmainブランチにプッシュすると自動でアカウント発行が走るようになります!
AFT管理アカウントにサインインし、CodeCommitコンソールを開きます。
左側の設定タブから接続を選択すると、見慣れない接続が(おそらく)2つ「保留中」のステータスになっていると思います。
各接続をクリックし、右上に表示される接続の更新
をクリックします。
別ブラウザが開くので、新しいアプリをインストール
をクリックします。
アカウントの選択画面が表示されるので、作成したリポジトリが所属するアカウントを選択し、リポジトリの選択でsandbox-account-management_tf
,sandbox-account-provisioning-customizations_tf
を選択します。
下のUpdate access
をクリックすると元の画面に遷移するので、遷移した状態で接続
をクリックします。
以上でGithubとの接続設定は完了です!
これでアカウントのデプロイができるようになりました。
6. パイプラインを確認する
実際にアカウントをデプロイするためのパイプラインを確認してみましょう。
AFT管理アカウントでCodePiplelineコンソールを開き、パイプラインを確認します。
画像のように、パイプラインが2つ成功していればOKです!
(今回はアカウントのカスタマイズは行わないので、残り2つのパイプラインはそのままでOKです)
アカウントデプロイやってみる
サクッとアカウントデプロイしちゃいましょう!
sandbox-account-management_tf
リポジトリで適当なブランチを切ります。
以下のコードをterraform
フォルダ内に配置します。
module "<任意の名前>" {
source = "./modules/aft-account-request"
control_tower_parameters = {
AccountEmail = "<アカウントに割り当てるメールアドレス>"
AccountName = "<表示されるアカウント名>"
ManagedOrganizationalUnit = "<アカウントをデプロイするOU名>"
SSOUserEmail = "<SSOユーザのメールアドレス>"
SSOUserFirstName = "<名>"
SSOUserLastName = "<姓>"
}
# 以下は任意で入力
account_tags = {
"SandBox" = "<任意の値>"
}
change_management_parameters = {
change_requested_by = "任意の値"
change_reason = "Create account request"
}
account_customizations_name = "<任意の値>"
}
保存したらpushして、ブランチをmainにマージします。
パイプラインを確認して、ct-aft-account-request
が成功していればアカウント作成は成功です!
SSOユーザの認証メールやアカウント発行完了メールが届くのを待ちます。
最後に
いかがでしたでしょうか?
私は特に環境構築のところで苦戦したので、誰かのお役に立てれば幸いです
参考
- https://github.com/aws-ia/terraform-aws-control_tower_account_factory
- ついにControl Towerのアカウント発行からカスタマイズまでIaC対応!Account Factory for Terraform (AFT)が新登場 #reinvent
- Manage AWS Accounts Using Control Tower Account Factory for Terraform