これは何?
HCP Terraform のワークスペース等のリソースをTerraform でプロビジョニングするまでの内容になります。
以前、寄稿した[HCP Terraform 実践 その1] Terraform Cloud 触ってみたをTerraform で作成する内容となります。
また、本記事で作成したテンプレートは以下に格納していますので、是非ご覧になっていただければ。
HCP Terraform のテンプレートについて
プロバイダー「tfe」を使用して、HCP Terraform のワークスペースなどを作成することができます。
HCP Terraform における各リソース部分についての解説は以下の通りです。
Organizations
Organizationsはtfe_organization
によって作成することができます。
resource "tfe_organization" "main" {
name = "org_name"
email = var.org_manager_email
}
Projects
Projectsはtfe_project
によって作成することができます。
resource "tfe_project" "aws" {
organization = tfe_organization.main.name
name = "pj-aws"
}
Workspaces
Workspaceはtfe_workspace
によって作成することができます。
今回はGitHubと連携しているため、vcs_repo
を設定しmainブランチに対してプルリク/マージがあった場合、トリガーされます。
github_app_installation_id
の値は、以下のリンクの通り、GitHubと連携するための、APIトークンを指定します。
https://developer.hashicorp.com/terraform/enterprise/users-teams-organizations/users#github-app-oauth-token
resource "tfe_workspace" "main" {
name = "workspace_name"
organization = tfe_organization.main.name
project_id = tfe_project.aws.id
vcs_repo {
identifier = var.vcs_repository
branch = "main"
github_app_installation_id = var.github_app_installation_id
}
}
resource "tfe_workspace_settings" "main" {
workspace_id = tfe_workspace.main.id
}
また、ワークスペース環境変数などもtfe_variable
で定義できます。
resource "tfe_variable" "env_tfc_aws_provider_auth" {
key = "TFC_AWS_PROVIDER_AUTH"
value = "true"
category = "env"
workspace_id = tfe_workspace.main.id
depends_on = [aws_iam_role.role, tfe_workspace.main]
}
resource "tfe_variable" "env_tfc_aws_run_role_arn" {
key = "TFC_AWS_RUN_ROLE_ARN"
value = aws_iam_role.role.arn
category = "env"
workspace_id = tfe_workspace.main.id
depends_on = [aws_iam_role.role, tfe_workspace.main]
}
OIDCプロバイダー & IAMロール (AWSを使用する場合)
HCP Terraform がAWS環境にアクセスするためにはOIDCプロバイダーおよびIAMロールの作成が必要になります。
詳しくはこちらを参考に。
テンプレートは以下の通りです。
data "aws_caller_identity" "current" {}
resource "aws_iam_openid_connect_provider" "terraform" {
count = var.is_create_iam_oidc_provider ? 1 : 0
url = "https://app.terraform.io"
client_id_list = [
"aws.workload.identity",
]
thumbprint_list = [
"9e99a48a9960b14926bb7f3b02e22da2b0ab7280",
]
tags = {
PJ = var.pj_tags.name
Env = var.pj_tags.env
}
}
resource "aws_iam_role" "role" {
name = format("%s-%s-role-hcptfm", var.pj_tags.name, var.pj_tags.env)
path = "/"
assume_role_policy = templatefile(
"./files/iam_trust_relationship.json",
{
account_id = data.aws_caller_identity.current.account_id
organization = tfe_organization.main.id
project = "*" # プロジェクトで制限可能
workspace = "*" # ワークスペースで制限可能
}
)
max_session_duration = 3600
managed_policy_arns = [
"arn:aws:iam::aws:policy/AdministratorAccess"
]
tags = {
PJ = var.pj_tags.name
Env = var.pj_tags.env
}
}
aws_iam_openid_connect_provider
については、私の場合は事前に作成済みでしたのでVariablesで作成の制御をしています。
9e99a48a9960b14926bb7f3b02e22da2b0ab7280
はOIDC プロバイダーで使用されているサムプリントになり、一意の値になります。
サムプリントを更新する必要が発生したらこちらで確認,更新したりします。
最後に
こちらのテンプレートですが
JR中央線 Developers もくもく<会 #13 というイベントに参加して、2,3時間ほどで作成しました(テンプレート2.0h, 動作検証0.5h)。
非常に落ち着いた環境で集中して取り組めたので、集中して開発を進めたいなどの方は、こういったもくもく回に参加するのもありなんじゃないかと思います。
またデモもも含めてLT登壇したので是非見ていただければと思います。