おさらい
前回の記事(Terraform Cloud その1 - まずは使ってみた(ローカル実行からリモート実行に変更))ではローカルで使用していたTerraformをCloudに移行しました。
今回はGithubと連携してCI/CDっぽく回せるようにみたいと思います。
この記事で実現すること
- GitHub経由でのTerraform Cloudの実行
- 1つのVCSリポジトリからstateを分離させ複数のWorkspaceで実行
- Terraform CloudのWorkspace間の連携
この記事がターゲットとする読者層
- Terraform CloudとVCSを連携させたい人
- VCSを使う際のWorkspaceの設定を知りたい人
準備
前回まで作成したものとは別に以下のものが必要になります。
- GitHubのアカウント
使用するサンプルTerraformコード
今回はこちらにおいているような下記構成にしています。
tree構造
.
├── README.md
├── ec2
│ └── main.tf
└── main.tf
./main.tf
variable "aws_access_key" {}
variable "aws_secret_key" {}
variable "region" {
default = "ap-northeast-1"
}
terraform {
backend "remote" {
hostname = "app.terraform.io"
organization = "kuroseets"
workspaces {
name = "vpc-test"
}
}
}
provider "aws" {
access_key = var.aws_access_key
secret_key = var.aws_secret_key
region = var.region
}
resource "aws_vpc" "test" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "test"
}
}
resource "aws_subnet" "test_subnet" {
vpc_id = aws_vpc.test.id
cidr_block = "10.0.0.0/24"
availability_zone = "ap-northeast-1a"
tags = {
Name = "test-a"
}
}
./ec2/main.tf
variable "aws_access_key" {}
variable "aws_secret_key" {}
variable "region" {
default = "ap-northeast-1"
}
terraform {
backend "remote" {
hostname = "app.terraform.io"
organization = "kuroseets"
workspaces {
name = "ec2-test"
}
}
}
provider "aws" {
access_key = var.aws_access_key
secret_key = var.aws_secret_key
region = var.region
}
data "aws_vpc" "test" {
tags = {
Name = "test"
}
}
data "aws_subnet" "test_subnet" {
vpc_id = data.aws_vpc.test.id
tags = {
Name = "test-a"
}
}
resource "aws_instance" "test-ec2-1" {
ami = "ami-0053d11f74e9e7f52"
instance_type = "t3.micro"
subnet_id = data.aws_subnet.test_subnet.id
tags = {
Name = "test-ec2-1"
}
}
VCS設定
Terraform CloudでAuthorization callback URLを取得する
Terraform Cloudにログインしてページ上部のSettingsを選択し、左メニューのVCS Providersをクリックしてください

GitHubを選択し、表示されたドロップダウンメニューのGitHub.com(Custom)を選択します

表示された赤枠がGithubとの連携で必要になります
また、注意しなければいけないのは、このページを閉じるとAuthorization callback URLが変更されてしまうということです。
ですので、このページを開いたまま、別ブラウザで次はGithubを開いてください。

Githubで
右上のアバターをクリックして表示されたメニューからSettingsを選択します

表示されたページの左メニューのDeveloper settingsをクリックする

同様に表示された左メニューのOAuth Appsを選択します。

表示されたページのRegister a new applicationをクリックします。

表示された入力フォームにTerraform Cloudで控えている情報を入力し、Register applicationをクリックします。

そして表示されたページのClient IDとClient SecretをTerraform Cloudで使用するために控えます。
このページも後ほど確認で使用しますので開いたままにしておきましょう。

TerraformでGithubの情報を入力し連携を完了させる
先ほど入手したClient IDとClient Secretを入力します。(Nameは各自で判別しやすい名前を入力して大丈夫です)

連携を促すOAuth画面が表示された場合ですが、特にGithubのOrganization aceessは注意してください。
今回はOrganizationへのアクセス権を付与しませんが、Organizationへのアクセスを許可する場合はGrantボタンをクリックして権限設定してください。

SSH鍵の登録画面が表示されます。サブモジュールを使用する場合は必要になることがありますが、今回は単純な連携ですので設定は不要です。
Skip and finishをクリックして設定を完了させましょう。

VCS Providersの画面に戻りますが、新たにVCSが登録されていることが確認できていると思います。

Githubでも確認
さて、Githubでの確認ですが、設定時に開いたままになっているページをリロードしてください。
0 userと表示されていた箇所が1 userに変更になっていることが確認できます。

Workspaceの設定
今回は以下のように連携しようと思います。
| Workspace | Repository | Dirctory | Auto Apply | Run Trigger |
|---|---|---|---|---|
| vpc-test | tfc-aws-test | false | ||
| ec2-test | tfc-aws-test | ec2 | true | vpc-test |
ディレクトリやWorkspaceを分けているのは、EC2の追加削除は別stateで管理したいという目的があります。
Workspaceにリポジトリを設定する
表示されたページの右上にあるSettingsをクリックし表示されたメニューのVersion Controlをクリックします。

表示されたページのConnect to version controlをクリックします

Version control workflowをクリックします

内容を確認の上Update VCS settingsをクリックします

戻ったページでVCS branchに変更を適用する際のブランチ名(今回はmaster)を入力し、Update VCS settingsをクリックします

ここまでをvpc-testとec2-testで設定してください。
自動ApplyとTerraformを実行するディレクトリ指定
SettingsメニューのGeneralを選択してください。

表示されたページのApply MethodでApplyの実行をマニュアルにするか自動にするかを選択します。
今回はvpc-testではManual apply、ec2-testではAuto applyを選択します。
また、Terraformを実行するディレクトリを指定するにはTerraform Working Directoryにディレクトリを入力します。
ec2-testではec2ディレクトリのmain.tfを実行させたいので、ec2と入力します。
入力が完了したら Save settingsをクリックします。

他のWorkspace実行をトリガーにする
SettingsメニューのRun Triggersを選択します。

Select itemよりWorkspaceを選択し、Add workspaceをクリックします
今回はec2-test Workspaceにvpc-test Workspaceを設定しました。
警告に読んだところ、このトリガーで実行されたQueueは自動されないのですね。
それには注意が必要です。

確認
githabで変更をmasterにマージしてみましょう
vpc-testのplanでネットワーク周りのみ

ec2-testのplanではec2周りのみが変更されていることが確認できました。

GithubでもPull Requestでterraform planを実行した結果を表示してくれますので、マージする判断でも使えます

まとめ
今回はTerraform CloudとGithubの連携を確認しました。
各WorkspaceやGithub側にもいろいろと細かい設定や配慮が必要でしょうが、
これでインフラにおけるCI/CDが実現できるといっても間違いないでしょう。
今回はAWSの構築コードを使用しましたけど、次回は折角なので、
Terraform CloudでTerraform Cloudを管理する方法実施してみようと思います。
関連記事
Terraform Cloud その1 - まずは使ってみた(ローカル実行からリモート実行に変更)
Terraform Cloud その2 - Gihubと連携してみた(VCSとWorking Directoryの設定)
Terraform Cloud その3 - Terraform CloudをTerraformで管理する
Terraform Cloud その4 - ワークスペース間で共有する閉じられた空間で使用するModuleについて



