これは何?
Terraform Cloud を初めて触った 〜 Apply までの流れをまとめたものになります。
0. 事前準備(GitHub リポジトリの作成 & tfファイルのプッシュ
GitHubリポジトリを作成し、.tfファイルをPushするようにします。
今回の演習で使用したリポジトリはこちら↓です。
1. Terraform Cloud 初期設定
やることとしては以下の3点が必要となります.
- Organizations の作成
- Projects の作成
- Workspaces の作成
1-1. Organizationsの作成
最初にOrganizationsを作成します.
Create organization
をクリックします.
Organizations 名を入力してOrganizationsを作成します. Organizations名はおそらくTerraform Cloud上で一意の名称を指定する必要があります.
1-2. Project の作成
次にTerraform Project の作成のため、作成されたOrganization 下でプロジェクトを作成します.
+New Project
でプロジェクトを生成してプロジェクト名を指定します.
1-3. Workspaces の作成
ワークフローの種類を選択できます.今回はリポジトリなどをトリガーとしたVersion Control Workflowを選択します.
リポジトリを選択できますので、利用されているリポジトリサービスを選択します.
私の場合はGitHubアカウントを作成しているため、Githubリポジトリを選択します.
一旦、これでterraform cloud上の作業は完了です。
2. IAMロールの作成
今回はOIDC(Open ID Connect)による AWSの認証情報を取得して、一時認証用トークンを生成するようにします。
詳しくは、以下のリンクを参考に。
https://developer.hashicorp.com/terraform/cloud-docs/workspaces/dynamic-provider-credentials/aws-configuration
2-1. OIDCプロバイダーの設定
OIDCのためのIDプロバイダーを設定します。プロバイダー名はapp.terraform.io
でaudienceはaws.workload.identity
を指定します。
2-2. IAMロールの作成
IDプロバイダーに対して権限借用するためのIAMロールを作成します。
IAMロールの信頼関係は以下の通りに設定します。今回はOrganizations下の全プロジェクト・ワークロードであればアクセスを許可できる強い権限をしているため、適宜制限をかけていただければと思います。
IAMポリシーは、AdministratorAccess
をアタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRoleWithWebIdentity",
"Principal": {
"Federated": "arn:aws:iam::123456789012:oidc-provider/app.terraform.io"
},
"Condition": {
"StringEquals": {
"app.terraform.io:aud": [
"aws.workload.identity"
]
},
"StringLike": {
"app.terraform.io:sub": [
"organization:atsuw0w-test-terraform:project:*:workspace:*:run_phase:*"
]
}
}
}
]
}
2-3. 環境変数の定義
IAMロールの作成が完了したら、TerraformCloud上で環境変数の定義を実施します。
作成したWorkspaces へ移動し、Workspace variables で以下のような環境変数を設定します。
AWSへの認証および権限借用するIAMロールを明示的に定義します。
環境変数 | 説明 | 値 |
---|---|---|
TFC_AWS_PROVIDER_AUTH | trueの場合、AWSへの認証を行う. | true |
TFC_AWS_RUN_ROLE_ARN | 権限借用するためのIAMロールArnを指定. | arn:aws:iam::123456789012:role/[IAMロール名] |
3. リソース作成 テスト
4. 更新
更新する際は、pull request を投げることで自動的に更新することができます。
以下はfeatureブランチfeature/create-igw
を作成し、インターネットゲートウェイを作成する定義を追記しました。
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.vpc.id
tags = {
Name = format("%s-%s-igw-%s-%02d", var.pj_tags.name, var.pj_tags.env, var.vpc_prefix.prefix, 1)
PJ = var.pj_tags.name
Env = var.pj_tags.env
}
}
上記の内容を追記し、GitHubにプッシュ後、featureブランチ → mainブランチへプルリクエストを投げることで、Terraform Cloud上のワークフローのRunsでPlanの内容が実行されます。
Planの中身を見てみると、リソースaws_internet_gateway.igw
を新規作成するような内容が出力されます。
mainブランチにMergeすると、Terraform Cloud上でもapplyすることができました。
終わりに
Terraform のCI/CDパイプラインを自前で作成する必要なく、簡単にterraform を構築することができました。