dshimizu/blog/alpha

とりとめのないITブログ

Terraform Cloudを使ってみた

Terraform Cloud × GitHubを試した

Terraform meetup tokyo #2へ行ったときにTerraform CloudをおすすめされていたのでGitHubと連携させて試した。

Terraform Cloudを試す

事前準備

アカウント登録

まず、Terraform Cloudのアカウントを作成する。

アカウント作成の詳細は割愛する。

Organizationの作成

続いてOrganizationを作成する。 OrganizationはTerraform Cloudをチーム内で扱うための共有スペースみたいなもの。 名前は何でも良いけど、全ユーザでユニークである必要がある。 特に難しいことはないので作り方の詳細は割愛する。

WorkSpaceの作成

WorkSpaceはTrraform Clouod内で1つのTerraformコード群(ex GitHubリポジトリ単位)を実行する場所、という認識。

連携はGitHub、GitLab、BitBucket、Azure DevOpsを選択可能。 GitHubとの接続しか試していないが、GitHubの場合は特定のリポジトリを選択して、そこにあるTerraformコードを実行させる形になる。

空のリポジトリは選択するとWorkSpaceの作成でエラーになるため、あらかじめコードを設置しておく必要がある。

ここでは以下のようなコードでVPC、サブネット、インターネットゲートウェイ、ルートテーブルを作成するコードを実行させる

main.tf

provider "aws" {
    access_key = var.aws_access_key_id
    secret_key = var.aws_secret_access_key
    region = "ap-northeast-1"
}


// Create VPC 
resource "aws_vpc" "main" {
    cidr_block = local.vpc_cidr.dev

    instance_tenancy = "default"

    tags = {
        Name = local.project_name
    }
}

// Create Public Subnet
resource "aws_subnet" "public" {

    for_each          = local.subnet_numbers

    vpc_id            = aws_vpc.main.id

    availability_zone = each.key
    cidr_block        = cidrsubnet(aws_vpc.main.cidr_block, 8, each.value)
}

// Create Internet Gateway
resource "aws_internet_gateway" "main" {
    vpc_id = aws_vpc.main.id
}

// Attach IGW on Route Table for Public Subnet
resource "aws_route_table" "public" {
    vpc_id = aws_vpc.main.id
    route {
      cidr_block = local.vpc_cidr.prod
      gateway_id = aws_internet_gateway.main.id
   }
}

// Create Route Table
resource "aws_route_table_association" "puclic-1a" {
    for_each       = local.subnet_numbers

    subnet_id = aws_subnet.public[each.key].id
    route_table_id = aws_route_table.public.id
}

variable.tf

variable "aws_access_key_id" {}
variable "aws_secret_access_key" {}


locals {
  project_name = "tf-example"

  vpc_cidr = {
    dev = "10.2.0.0/16"
    stg = "10.1.0.0/16"
    prod = "10.0.0.0/16"
  }

  subnet_numbers = {
    "ap-northeast-1a" = 1
    "ap-northeast-1c" = 2
    "ap-northeast-1d" = 3
  }
}
Terraform Cluod側への環境変数設定

Terraformの実行にはAWSAccess key, Secret keyが必要だが、variables.tfとかに直接書くとセキュリティ的にも良くないので、Terraform CloudからTerraformを実行する際に利用するAccess key, Secret keyをTerraform Cloudの環境変数にセットする。

WorkSpaceを選択し、画面上のメニューのVariablesから設定する。

真ん中の「Terraform Variables」で「Add Variables」ボタンを押下して、AWSAccess key, Secret keyの変数と値をセットする。 変数名はtfファイルの変数名(ここではaws_access_key_id, aws_secret_access_key)と合わせる必要がある。セットするときに右側のSensitiveの項目にチェックを入れると画面上は値が表示されなくなる。

Planの実行

この状態で、画面右上の「Queue Plan」ボタンを押下すると、Terraform Planを実行できる。

マージしたら自動でApplyさせるとかも設定によっては可能なようである。

まとめ

Terraform Cloudの基本的な設定の仕方、GitHubリポジトリと連携させることでPullReqを出したときに自動でPlanさせることができる旨を書いた。

参考