👀
privateなGitHub RepositoryにあるTerraform moduleを別のGitHub Repositoryから参照する
経緯
複数のTerraformプロジェクトを別のGitHub Repositoryで管理しており、GitHub Repositoryを跨いだ共通定義が欲しいなと思って調べたところ、Terraformでは他のGitHub Repositoryにあるmoduleを参照できることを知りました。
大枠の方法としては公式ドキュメントに書いてあるのですが、細かいところで詰まったので調べたことをまとめました。
使い方
共通module側
共通module用のTerraformリソースを管理するprivateなGitHub Repository(今回は terraform-modules
とします)を用意します。
簡略化のために今回は以下のような階層に1つだけファイルを置きます。
network
moduleを他のGitHub Repositoryから呼び出すイメージです。
.
└── modules
└── network
└── vpc.tf
vpc.tfの定義はこちら。
variable "identifier" {
type = string
}
resource "aws_vpc" "this" {
tags = {
"Name" = var.identifier
}
}
output "vpc_id" {
value = aws_vpc.this.id
}
呼び出し側
terraform-modules
Repositoryを呼び出す側のGitHub Repositoryでは以下のように定義します。
手元で terraform init
を実行してremote moduleの情報を手元に引っ張ることでIDEなどでoutputなどの補完も効くようになります。
locals {
identifier = "hello-world"
}
module "network" {
# tagを利用する場合には以下のようにする
# source = "git::https://github.com/${var.your_organization}/terraform-modules.git//modules/network?ref=refs/tags/${var.tag_name}"
source = "git::https://github.com/${var.your_organization}/terraform-modules.git//modules/network?ref=main"
identifier = local.identifier
}
CI/CD
呼び出し側のTerraformリソースをGitHub Actions上で動かす際には、secrets.GITHUB_TOKEN
ではなくpersonal access tokenを発行して使用する必要があるようです。
こちらの記事が参考になりました(repoの)。
ざっくり以下の感じで動かせます。
jobs:
terraform_actions:
name: "Terraform Actions"
runs-on: ubuntu-latest
steps:
# 色々省略...
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
- name: Setup for remote terraform module
# 作成したpersonal access tokenをGH_PERSONAL_ACCESS_TOKENとして保存している
run: git config --global url."https://oauth2:${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}@github.com/${{ YOUR_ORGANIZATION }}".insteadOf https://github.com/${{ YOUR_ORGANIZATION }}
- name: Terraform Init
run: terraform init
- name: Terraform Plan
run: terraform plan
その他参考
Discussion