kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Terraform Cloud x AWS に入門できる「AWS Modernization Workshop with HashiCorp Terraform Cloud」

AWS Modernization Workshop「AWS Modernization Workshop with HashiCorp Terraform Cloud」を実施した❗️Terraform Cloud を使って AWS を操作する流れを一通り学べるので,特に Terraform や Terraform Cloud 入門者におすすめ.例えば "今までは AWS CloudFormation をよく使ってたけど今度 Terraform を使う予定があるから試しておこうかなぁ〜" っていうときにピッタリ👏

実施をしながら詰まったところや工夫したところなども含めてワークショップを紹介しようと思う💡

hashicorp-terraform.awsworkshop.io

構成

ワークショップは大きく以下の構成になっている.手順書に所要時間は "1.5時間 ~ 2.5時間" と書いてあって,うまく進めば終わると思うけど,僕自身は調査もしながらワークショップを吟味していて,実際には4時間ほどだった🕛

  • Introduction
  • Self Guided Setup
  • Terraform Cloud
  • Deploying Infrastructure
  • Sentinel
  • Cleanup

🟣 Self Guided Setup

手順には AWS Cloud9 をバージニアリージョン(us-east-1)に構築すると書いてあるけど,全く使わなくて謎だった💧よって,ここは何もせず skip して良いかと👌

🟣 Terraform Cloud

まず,Terraform Cloud の初期セットアップを行う.アカウントを作って,Organization kakakakakku を作って,Default Project の中に GitHub と連携した Workspace tfc-guide-example を作る.連携するリポジトリは hashicorp/tfc-guide-example にある(フォークして使う).

github.com

GitHub と連携した Workspace を作るときに,手順書だと GitHub.com (Custom) を選択すると書いてある.ただし現在は選択肢が増えていて「GitHub App」を選択してリポジトリに対する権限を付与する必要がある❗️詳しくは以下のドキュメント Configuration-Free GitHub Usage に載っている.

developer.hashicorp.com

🟣 Deploying Infrastructure

次に Terraform コードを実行する準備をする.今回は Terraform で Amazon EC2 インスタンスを1台構築するため,以下の Terraform variable を設定する.

  • instance_type: t2.micro
  • instance_name: Provisioned by Terraform

次に AWS を操作するためのアクセスキー(AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY)を設定する.でも個人的には Terraform Cloud にアクセスキーを設定したくなく,今回は IAM ID プロバイダから「IAM Role」を取得できるようにした.詳しくは以下の記事にまとめてある❗️

  • TFC_AWS_PROVIDER_AUTH: true
  • TFC_AWS_RUN_ROLE_ARN: arn:aws:iam::xxx:role/xxx

kakakakakku.hatenablog.com

準備ができたら Terraform Cloud から planapply をして Amazon EC2 インスタンスを北カリフォルニアリージョン (us-west-1) に構築する.

\( 'ω')/ 構築できたぞ!やったー!

またプルリクエストを使って Amazon EC2 インスタンス名(Name タグ)を変更して,planapply をする流れも体験できる.

\( 'ω')/ 変更できたぞ!やったー!

🟣 Sentinel

今度は Terraform で Policy as code を実現できる「Sentinel」を使って Terraform コードにポリシーを適用する.

www.hashicorp.com

手順書には "30日間フリートライアル" を使って Terraform のプランを上げると書いてあるけど,Free プランのままでも 1 Policy set5 Policies までは使えそうで,手順上少し面倒なところはあるけど結果的に問題なくワークショップは進められた✌️

www.hashicorp.com

今回は Terraform のバージョン 1.1.0 以上であることを soft-mandatory レベルで強制するという内容で,Sentinel コードは hashicorp/learn-terraform-enforce-policies リポジトリにある.

import "tfplan"
import "version"

main = rule {
  version.new(tfplan.terraform_version).greater_than("1.1.0")
}

github.com

docs.hashicorp.com

手順書では Policy sets と GitHub を連携するように書いてあるけど,Free プランだと The organization has reached the limit of 0 versioned policy sets. というエラーで設定できなかった.今回は少し面倒だけど Terraform Cloud の画面で PoliciesPolicy sets を設定した.

そして,ポリシーを紐付けて同じく plan をすると期待通りに Sentinel policies passed になった❗️

\( 'ω')/ Sentinel 便利!

後半では Terraform Cloud の「Cost Estimation」機能と Sentinel を組み合わせて,見積もりコストが $100 より小さくなるようにポリシーを適用する.今回は Free プランを使ってるので,作成した PoliciesPolicy sets を一度消して,また Terraform Cloud の画面で設定し直した.

import "tfrun"
import "decimal"

delta_monthly_cost = decimal.new(tfrun.cost_estimate.delta_monthly_cost)

main = rule {
    delta_monthly_cost.less_than(100)
}

そして,ポリシーを紐付けて同じく plan をすると期待通りに Sentinel policies passed になった❗️

\( 'ω')/ コストを意識しながら実行できるのはイイ!

後半で使ったリポジトリを以下にまとめておく.

github.com

github.com

🟣 Cleanup

不要なリソースが残らないように Destruction and Deletion でお掃除をして終了❗️

まとめ

AWS Modernization Workshop「AWS Modernization Workshop with HashiCorp Terraform Cloud」は Terraform Cloud x AWS に入門できる良いワークショップだった❗️

もし興味があったら実施してみると良いのではないでしょうか✌️

関連リンク

手順書自体は以下の GitHub で管理されていた.

github.com