- tl;dr;
- 前置き
- モチベーション
- テンプレートリポジトリについて
- 頑張った点:Terraformを実行するための初期設定をCloud FormationやDeployment Managerで行うようにした
tl;dr;
前置き
9月くらいにGitHub ActionsでOpenID Connector(以下OIDC)を用いた認証を利用することができるようになりました。
CI上でAWSやGCPのAPIを利用する場合は通常IAM UserのAWS_ACCESS_KEY_IDやAWS_SECRET_ACCESS_KEY(AWSの場合)やサービスアカウントのキーファイル(GCPの場合)をリポジトリのSecretsに設定することになりますが、OIDCによりこれらの機微情報の生成自体が不要になりました。(keyless)
モチベーション
OIDCは便利だしググればいくらでも情報は出てくるのですが、Terraformのリポジトリを作る度に調べたり諸々設定するのが大変なので楽をするためにテンプレートリポジトリを作りました。
テンプレートリポジトリについて
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の設定ファイルを作成しました。
- https://github.com/sue445/terraform-aws-template/blob/main/cloud_formation/setup-terraform.yml
- https://github.com/sue445/terraform-gcp-template/blob/main/deployment-manager/setup-terraform.jinja
各リポジトリの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の実行に必要なリソースを全て作れます。