Terraform に入門する
AWS にはそれなりに触れてきたけど、 IaC には触れてこなかったからちゃんとやってみようと思い立った。
まずは公式のチュートリアルなり Terraform について検索して記事を読み漁ってみる。
読んだもの
Terraform が何をしているのか、実行するにはファイル構成をどうすればいいのか等など…
ざっくりなんとなく分かってきたのでサンプルプロジェクトを作って Hello World! してみよう。
今回は Rails7 の API モードを ECS Fargate にデプロイしてみたいので、 まずは Rails アプリを生成。
その流れのまま Git でコミット。
rails --version
# => Rails 7.1.3.2
rails new sample_api --api
cd sample_api
git add .
git commit -m "feat: Initialize app"
Terraform に与える AWS への Credential が必要なため、ブラウザから AWS Management Console にアクセス。
Terraform 用に IAM アカウントのアクセスキーを発行しておく。
投稿日は2年前とかにはなるけど、ECS Fargate を良さげな構成で IaC にしている方がいらしたので参考にした。
今回はテンプレートコードの構築が目的だったので、
- 実行者ごとにアカウントが異なるため、 AWS の Credential を楽に切り替えたい
- 実行者ごとにデプロイするアプリが変わるため、環境変数で楽に設定を切り替えたい
といったところが要件に含まれている。下記の記事は Terraform の実行環境を Docker Compose に乗せることで環境変数での指定が可能なり、これにより要件を満たせそうだったので参考に組み込んでみた。
AWS Vault を使うことで MFA も比較的楽に突破できるので、強制ポリシーが効いている環境でも使えるし結構よさげな印象を Terraform 初心者ながらに感じた。
Terraform の構成に AWS KMS が含まれていて、秘匿情報の管理が最適化されてた。
触ったことがなく何も分からなかったので下記の公式ドキュメントをサクッと見た。特に、何も知らないと暗号化/復号化の仕組みがちゃんと理解できず扱えなかったので、図解されてて助かった。
ある程度理解した今となっては「合理的で便利な仕組みだなー」と思っている。
独自の環境変数を設定するにあたって、 Terraform の Environment Variables と Input Variables 機能を利用。
設定値は .env ファイルに記入。それを Docker Compose の機能でもって Terraform コンテナ内に引き継ぐ形で動作させた。
TF_VAR_GITHUB_REPO=sample_api
services:
terraform:
environment:
- TF_VAR_GITHUB_REPO=${TF_VAR_GITHUB_REPO}
variable "GITHUB_REPO" {
description = "The name of the GitHub repository for Rails app"
type = string
}
この構成の結果、下記の流れで一通りデプロイできるようになった。
$ aws-vault exec sample
# インタラクティブにパスワードと MFA code を入力
# 成功すると subshell にログイン
$ docker compose run --rm terraform init # 初回実行時のみ
$ docker compose run --rm terraform fmt
$ docker compose run --rm terraform validate
$ docker compose run --rm terraform plan
$ docker compose run --rm terraform apply
# 作業終了時
$ exit # AWS Vault の subshell をログアウトし、認証情報のセッションを終了