Cloud その2 - Gihubと連携してみた(VCSとWorking Directoryの設定)


おさらい

前回の記事(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-testec2-test2つのworkspaceが作成されていることでしょう。

VCS設定

Terraform CloudでAuthorization callback URLを取得する

Terraform Cloudにログインしてページ上部のSettingsを選択し、左メニューのVCS Providersをクリックしてください

Add a VCS providerをクリックします

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

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

Githubで

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

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

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

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

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

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

TerraformでGithubの情報を入力し連携を完了させる

先ほど入手したClient IDClient 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にリポジトリを設定する

では、まず設定するWorkspaceを選択しましょう

表示されたページの右上にあるSettingsをクリックし表示されたメニューのVersion Controlをクリックします。

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

Version control workflowをクリックします

GitHubをクリックします

tfc-aws-testリポジトリを選択します

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

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

ここまでをvpc-testec2-testで設定してください。

自動ApplyとTerraformを実行するディレクトリ指定

SettingsメニューのGeneralを選択してください。

表示されたページのApply MethodでApplyの実行をマニュアルにするか自動にするかを選択します。
今回はvpc-testではManual applyec2-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について