LoginSignup
1
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-09-05

おさらい

前回の記事(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をクリックしてください
スクリーンショット 2020-09-05 10.46.10.png

Add a VCS providerをクリックします
スクリーンショット 2020-09-05 10.47.15.png

GitHubを選択し、表示されたドロップダウンメニューのGitHub.com(Custom)を選択します
スクリーンショット 2020-09-05 10.48.33.png

表示された赤枠がGithubとの連携で必要になります
また、注意しなければいけないのは、このページを閉じるとAuthorization callback URLが変更されてしまうということです。
ですので、このページを開いたまま、別ブラウザで次はGithubを開いてください。
スクリーンショット 2020-09-05 10.49.41.png

Githubで

右上のアバターをクリックして表示されたメニューからSettingsを選択します
スクリーンショット 2020-09-05 10.51.08.png

表示されたページの左メニューのDeveloper settingsをクリックする
スクリーンショット 2020-09-05 10.52.04.png

同様に表示された左メニューのOAuth Appsを選択します。
スクリーンショット 2020-09-05 10.52.43.png

表示されたページのRegister a new applicationをクリックします。
スクリーンショット 2020-09-05 10.53.13.png

表示された入力フォームにTerraform Cloudで控えている情報を入力し、Register applicationをクリックします。
スクリーンショット 2020-09-05 10.53.46.png

そして表示されたページのClient IDClient SecretをTerraform Cloudで使用するために控えます。
このページも後ほど確認で使用しますので開いたままにしておきましょう。
スクリーンショット 2020-09-05 10.55.44.png

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

先ほど入手したClient IDClient Secretを入力します。(Nameは各自で判別しやすい名前を入力して大丈夫です)
スクリーンショット 2020-09-05 10.59.08.png

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

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

VCS Providersの画面に戻りますが、新たにVCSが登録されていることが確認できていると思います。
スクリーンショット 2020-09-05 11.06.41.png

Githubでも確認

さて、Githubでの確認ですが、設定時に開いたままになっているページをリロードしてください。
0 userと表示されていた箇所が1 userに変更になっていることが確認できます。
スクリーンショット 2020-09-05 11.07.40.png

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を選択しましょう
スクリーンショット 2020-09-05 11.09.11.png

表示されたページの右上にあるSettingsをクリックし表示されたメニューのVersion Controlをクリックします。
スクリーンショット 2020-09-05 11.09.25.png

表示されたページのConnect to version controlをクリックします
スクリーンショット 2020-09-05 11.09.42.png

Version control workflowをクリックします
スクリーンショット 2020-09-05 11.09.51.png

GitHubをクリックします
スクリーンショット 2020-09-05 11.10.09.png

tfc-aws-testリポジトリを選択します
スクリーンショット 2020-09-05 11.10.22.png

内容を確認の上Update VCS settingsをクリックします
スクリーンショット 2020-09-05 11.11.50.png

戻ったページでVCS branchに変更を適用する際のブランチ名(今回はmaster)を入力し、Update VCS settingsをクリックします
スクリーンショット 2020-09-05 11.12.22.png

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

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

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

他のWorkspace実行をトリガーにする

SettingsメニューのRun Triggersを選択します。
スクリーンショット 2020-09-05 12.54.56.png
Select itemよりWorkspaceを選択し、Add workspaceをクリックします
今回はec2-test Workspaceにvpc-test Workspaceを設定しました。
警告に読んだところ、このトリガーで実行されたQueueは自動されないのですね。
それには注意が必要です。
スクリーンショット 2020-09-05 11.27.49.png

確認

githabで変更をmasterにマージしてみましょう
vpc-testのplanでネットワーク周りのみ
スクリーンショット 2020-09-05 11.21.46.png
ec2-testのplanではec2周りのみが変更されていることが確認できました。
スクリーンショット 2020-09-05 11.22.14.png
GithubでもPull Requestでterraform planを実行した結果を表示してくれますので、マージする判断でも使えます
スクリーンショット 2020-09-05 13.26.00.png

まとめ

今回は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について

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0