くりにっき

フルスタックキュアエンジニアです

Keyless Terraformに特化したTerraformテンプレートリポジトリを作った(AWS, GCP対応)

tl;dr;

github.com

github.com

前置き

9月くらいにGitHub ActionsでOpenID Connector(以下OIDC)を用いた認証を利用することができるようになりました。

dev.classmethod.jp

cloud.google.com

CI上でAWSやGCPのAPIを利用する場合は通常IAM UserのAWS_ACCESS_KEY_IDやAWS_SECRET_ACCESS_KEY(AWSの場合)やサービスアカウントのキーファイル(GCPの場合)をリポジトリのSecretsに設定することになりますが、OIDCによりこれらの機微情報の生成自体が不要になりました。(keyless)

モチベーション

OIDCは便利だしググればいくらでも情報は出てくるのですが、Terraformのリポジトリを作る度に調べたり諸々設定するのが大変なので楽をするためにテンプレートリポジトリを作りました。

テンプレートリポジトリについて

github.com

github.com

Terraformリポジトリの作り方やCIのワークフローは様々な流派がありますが、自分がよくやる

  • PullRequestで terraform plan, terraform fmt, tflint を実行しつつ、plan結果をPullRequestにコメントする
  • mainブランチでは terraform apply を実行
  • Slack通知

のような一番シンプルなパターンをテンプレートリポジトリにしています。

頑張った点:Terraformを実行するための初期設定をCloud FormationやDeployment Managerで行うようにした

Terraformを実行するためには terraform.tfstate を置くためのバケットを作成したりAWSの場合は排他ロックのためのDynamoDBのテーブルが必要で、GitHubのOIDCのためにもいくつか設定が必要です。

このような初期設定を(ほぼ)一発で終わらせるためにCloud FormationやDeployment Managerの設定ファイルを作成しました。

各リポジトリのREADMEにも書いてますがテンプレートから新規リポジトリを作った後にいくつかの手順を踏むだけでGitHub ActionsでTerraformが実行できるようになります。

ただしGCPのDeployment Managerだと現時点でWorkload Identity Poolを作成できないため、Deployment ManagerでTerraform用のGCSバケットやサービスアカウントを作った後でローカルからの terraform apply でWorkload Identity Poolを作るようにしています。

Terraformの実行に必要なリソースをTerraformで作るのは個人的には気持ち悪さがあるのですが、gcloudコマンドを2~3回叩かせるのもセットアップの手間が増えて嫌なのでTerraformで作ってます。(Deployment ManagerがWorkload Identity Poolに対応したらやめたい...)

AWSに関してはCloud Formationのコンソールから設定ファイルをアップロードするだけでTerraformの実行に必要なリソースを全て作れます。