おさらい
前回の記事(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について