Closed8

Terraform に入門する

Yuki HandaYuki Handa

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"
Yuki HandaYuki Handa

今回はテンプレートコードの構築が目的だったので、

  • 実行者ごとにアカウントが異なるため、 AWS の Credential を楽に切り替えたい
  • 実行者ごとにデプロイするアプリが変わるため、環境変数で楽に設定を切り替えたい

といったところが要件に含まれている。下記の記事は Terraform の実行環境を Docker Compose に乗せることで環境変数での指定が可能なり、これにより要件を満たせそうだったので参考に組み込んでみた。
AWS Vault を使うことで MFA も比較的楽に突破できるので、強制ポリシーが効いている環境でも使えるし結構よさげな印象を Terraform 初心者ながらに感じた。

https://zenn.dev/himekoh/books/202210261312

Yuki HandaYuki Handa

Terraform の構成に AWS KMS が含まれていて、秘匿情報の管理が最適化されてた。
触ったことがなく何も分からなかったので下記の公式ドキュメントをサクッと見た。特に、何も知らないと暗号化/復号化の仕組みがちゃんと理解できず扱えなかったので、図解されてて助かった。

https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/concepts.html

ある程度理解した今となっては「合理的で便利な仕組みだなー」と思っている。

Yuki HandaYuki Handa

独自の環境変数を設定するにあたって、 Terraform の Environment VariablesInput Variables 機能を利用。
設定値は .env ファイルに記入。それを Docker Compose の機能でもって Terraform コンテナ内に引き継ぐ形で動作させた。

.env
TF_VAR_GITHUB_REPO=sample_api
compose.yaml(一部抜粋)
services:
  terraform:
    environment:
      - TF_VAR_GITHUB_REPO=${TF_VAR_GITHUB_REPO}
variables.tf
variable "GITHUB_REPO" {
  description = "The name of the GitHub repository for Rails app"
  type        = string
}
Yuki HandaYuki Handa

この構成の結果、下記の流れで一通りデプロイできるようになった。

$ 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 をログアウトし、認証情報のセッションを終了
このスクラップは2024/03/28にクローズされました