0
0

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 実践 その6] HCP Terraform を Terraform テンプレート化してプロビジョニングした話

Last updated at Posted at 2024-09-29

これは何?

HCP Terraform のワークスペース等のリソースをTerraform でプロビジョニングするまでの内容になります。
以前、寄稿した[HCP Terraform 実践 その1] Terraform Cloud 触ってみたをTerraform で作成する内容となります。

また、本記事で作成したテンプレートは以下に格納していますので、是非ご覧になっていただければ:pray:

HCP Terraform のテンプレートについて

プロバイダー「tfe」を使用して、HCP Terraform のワークスペースなどを作成することができます。

image.png

HCP Terraform における各リソース部分についての解説は以下の通りです。

Organizations

Organizationsはtfe_organizationによって作成することができます。

main.tf
resource "tfe_organization" "main" {
  name  = "org_name"
  email = var.org_manager_email
}

Projects

Projectsはtfe_projectによって作成することができます。

main.tf
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

main.tf
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で定義できます。

main.tf
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ロールの作成が必要になります。
詳しくはこちらを参考に。

テンプレートは以下の通りです。

iam.tf
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 もくもく&LT会 #13 というイベントに参加して、2,3時間ほどで作成しました(テンプレート2.0h, 動作検証0.5h)。

非常に落ち着いた環境で集中して取り組めたので、集中して開発を進めたいなどの方は、こういったもくもく回に参加するのもありなんじゃないかと思います。

またデモもも含めてLT登壇したので是非見ていただければと思います。

0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?