おさらい
前回の記事(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"
}
}
ルートディレクトリとec2ディレクトリのソースをローカルでterraform init
しおけば、Terraform Cloud上ではvpc-test
とec2-test
2つのworkspaceが作成されていることでしょう。
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について