👀

privateなGitHub RepositoryにあるTerraform moduleを別のGitHub Repositoryから参照する

2023/01/05に公開

経緯

複数のTerraformプロジェクトを別のGitHub Repositoryで管理しており、GitHub Repositoryを跨いだ共通定義が欲しいなと思って調べたところ、Terraformでは他のGitHub Repositoryにあるmoduleを参照できることを知りました。
大枠の方法としては公式ドキュメントに書いてあるのですが、細かいところで詰まったので調べたことをまとめました。

https://developer.hashicorp.com/terraform/language/modules/sources#github

使い方

共通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の)。
https://zenn.dev/m_norii/articles/349b9ce0260631

https://maelvls.dev/gh-actions-with-tf-private-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

その他参考

https://stackoverflow.com/questions/61100076/terraform-module-in-github-private-repo

https://github.com/hashicorp/setup-terraform/issues/33

Discussion