0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[HCP Terraform 実践 その1] Terraform Cloud 触ってみた

Last updated at Posted at 2024-09-23

これは何?

Terraform Cloud を初めて触った 〜 Apply までの流れをまとめたものになります。

0. 事前準備(GitHub リポジトリの作成 & tfファイルのプッシュ

GitHubリポジトリを作成し、.tfファイルをPushするようにします。
今回の演習で使用したリポジトリはこちら↓です。

1. Terraform Cloud 初期設定

やることとしては以下の3点が必要となります.

  1. Organizations の作成
  2. Projects の作成
  3. Workspaces の作成

1-1. Organizationsの作成

最初にOrganizationsを作成します.
Create organizationをクリックします.

image.png

Organizations 名を入力してOrganizationsを作成します. Organizations名はおそらくTerraform Cloud上で一意の名称を指定する必要があります.
image.png

1-2. Project の作成

次にTerraform Project の作成のため、作成されたOrganization 下でプロジェクトを作成します.
+New Projectでプロジェクトを生成してプロジェクト名を指定します.

image.png

1-3. Workspaces の作成

Project 下でWorkspacesを作成します.
image.png

ワークフローの種類を選択できます.今回はリポジトリなどをトリガーとしたVersion Control Workflowを選択します.
image.png

リポジトリを選択できますので、利用されているリポジトリサービスを選択します.
私の場合はGitHubアカウントを作成しているため、Githubリポジトリを選択します.
image.png

これでワークスペースを作成することができました.
image.png

一旦、これで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を指定します。
image.png

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ロール名]

image.png

3. リソース作成 テスト

image.png

image.png

image.png

4. 更新

更新する際は、pull request を投げることで自動的に更新することができます。

以下はfeatureブランチfeature/create-igwを作成し、インターネットゲートウェイを作成する定義を追記しました。

main.tf
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の内容が実行されます。

image.png

Planの中身を見てみると、リソースaws_internet_gateway.igwを新規作成するような内容が出力されます。
image.png

mainブランチにMergeすると、Terraform Cloud上でもapplyすることができました。
image.png

終わりに

Terraform のCI/CDパイプラインを自前で作成する必要なく、簡単にterraform を構築することができました。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?