[HCP Terraform]Team Token利用時のGitHub接続はGitHub OAuthを利用しよう
HCP TerraformのTeam Tokenを使って、GitHub接続の設定をする際はGitHubとの接続にOAuthを利用する必要があります。
OAuthを使ってHCP TerraformとGitHubの接続をやってみました。
なぜTeam Token利用時はOAuthによるGitHub接続が必要なのか
HCP TerraformとGitHubの接続には、以下2つの方法があります。
- OAuth
- GitHub App
Team Tokenは、GitHub Appトークンを所有できません。そのため、OAuthを使う必要があります。
Note: Only an HCP Terraform user can own a GitHub App token. Team and Organization API tokens are not able to own a GitHub App token.
Create and manage users in HCP Terraform | Terraform | HashiCorp Developer
Team Tokenを利用して、GitHub AppのインストールIDを確認するAPIを叩くと以下のように403
が返ってきます。
TOKEN="<TEAM TOKEN>"
curl \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type: application/vnd.api+json" \
https://app.terraform.io/api/v2/github-app/installations
{"errors":[{"status":"403","title":"forbidden","detail":"Team and Organization Tokens are not supported"}]}%
ちなみに、User Tokenでは以下のようにGitHub Appの情報が返ってきます。
{
"data": [
{
"id": "ghain-hogehoge",
"type": "github-app-installations",
"attributes": {
"name": "hoge",
"installation-id": 123456,
"icon-url": "https://avatars.githubusercontent.com/u/123456?v=4",
"installation-type": "Organization",
"installation-url": "https://github.com/organizations/hogehoge/settings/installations/123456"
}
}
]
}
やってみた
TerraformコードのBackendはHCP Terraformとして、WorkspaceにTeam Tokenを設定します。
tfe providerはTeam Tokenを使って、GitHubと連携するHCP Terraform Workspaceを作成します。
GitHub OAuth VCS Providerの設定
以下の手順で、GitHubとの接続を行います。
HCP Terraformの画面上で、Settings
-> Providers
-> Add a VCS provider
の順に選択します。
Choose a version control provider to connect
は、GitHub.com(Custom)
を選択します。
register a new OAuth Application
を選択して、GitHubの画面に遷移しOAuth Applicationを設定します。
Register application
を選択します。
Client ID
とClient secrets
が表示されるため、これをコピーしてHCP Terraformの設定画面に貼り付けます。
貼り付けたら、HCP TerraformのVCS設定画面でConnect and continue
を選択します。
最後に承認画面が出表示されるため、問題なければAuthorize
を選択します。
Team Tokenの作成
Settings
-> Security
-> API tokens
-> Team Tokens
-> Create a team token
の順に選択します。
任意のチームを選び、Create
を選択してTokenを作成します。
Tokenが表示されるので、控えておきます。
Workspaceの作成・WorkspaceにTeam Tokenを設定
以下のtfファイルを用意します。
GitHub連携したWorkspaceを作成するという内容です。
GitHubリポジトリは、以前作成したサンプルコードを指定しています。
terraform.cloud
ブロックと、terraform.tfvars
は各自の環境に合わせて置き換えてください。
terraform {
required_version = "~> 1.11.2"
required_providers {
tfe = {
source = "hashicorp/tfe"
version = "~> 0.64.0"
}
}
cloud {
organization = "<Organization名>"
workspaces {
name = "<Workspace名>"
project = "<Project名>"
}
}
}
provider "tfe" {
hostname = "app.terraform.io"
}
data "tfe_oauth_client" "this" {
organization = var.hcp_tf_organization_name
name = var.hcp_tf_oauth_client_name
}
data "tfe_project" "this" {
name = var.hcp_tf_project_name
organization = var.hcp_tf_organization_name
}
resource "tfe_workspace" "this" {
name = "test-github-oauth-ec2"
organization = var.hcp_tf_organization_name
vcs_repo {
branch = "main"
identifier = "msato0731/aws-tfc-introductory-book-samples"
oauth_token_id = data.tfe_oauth_client.this.oauth_token_id
}
working_directory = "infra/chapter5/aws/prod"
project_id = data.tfe_project.this.id
}
variable "hcp_tf_organization_name" {
description = "The name of the HCP Terraform organization"
type = string
}
variable "hcp_tf_oauth_client_name" {
description = "The name of the HCP Terraform OAuth client"
type = string
}
variable "hcp_tf_project_name" {
description = "The name of the HCP Terraform project"
type = string
}
hcp_tf_oauth_client_name = ""
hcp_tf_organization_name = ""
hcp_tf_project_name = ""
以下を実行すると、Workspaceが作成されます。
terraform init
Workspaceに対して、Team Tokenを設定します。
HCP Terraform上でWorkspace
を選択し、Variables
-> Workspace variables
-> Add Variable
の順に選択します。
以下の設定でVariableを追加します。
Variable category | Key | Value |
---|---|---|
Environment Variable | TFE_TOKEN | <作成したTeam Token> |
Tokenを設定したら、Terraformを実行してGitHubと連携したWorkspaceを作成します。
terraform plan
terraform apply
HCP Terraform上にVCSと連携したWorkspaceが作成できていればOKです。
Tips: OAuth認証用のGitHubサービスユーザーを用意する
OAuth Appは作成したGitHubユーザーに紐づきます。
設定したユーザーがOrganizationsを抜けると、切断され再接続が必要になります。
本番運用時には、OAuth設定用のGitHubユーザーを用意し設定することをおすすめします。
Set up the GitHub.com OAuth VCS provider | Terraform | HashiCorp Developer