🪅

GitHub Actionsでプライベートな同リポジトリ下のTerraform moduleを利用する際の認証方法

2023/05/26に公開

背景

GitHub Actions 上で terraform plan を実行し、インフラの変更内容の出力を自動化しているという方は多いかと思います。このとき、表題の通りプライベートリポジトリ下のTerraform moduleを参照した terraform init を実行しようとした際に、認証していなかった故にmoduleが読めないという問題が生じました。

前提

# my-repository
.
├── .github
│   └── workflows
│       └── terraform-plan.yaml
├── hoge
│   └── main.tf # my-module を利用している
└── modules
    └── my-module
        ├── fuga.tf
	︙ 
        └── variables.tf
  • Organizationmy-organization内のリポジトリ my-repository下に Terraform module my-module がある
  • このときリポジトリ my-repository はプライベート
  • GitHub の PR をトリガーに terraform init, plan を含むワークフローが実行される

生じたエラー

GitHub Actionsのワークフロー上のterraform init において以下のエラーが生じました

Initializing modules...
Downloading git::https://github.com/my-organization/my-repository.git?ref=v1.0.0 for my-module...
╷
│ Error: Failed to download module
│ 
│ Could not download module "my-module" (main.tf:1) source code from
│ "git::https://github.com/my-organization/my-repository.git?ref=v1.0.0":
│ error downloading
│ 'git::https://github.com/my-organization/my-repository.git?ref=v1.0.0':
│ /usr/bin/git exited with 128: Cloning into
│ '.terraform/module'...
│ fatal: could not read Username for 'https://github.com': No such device or
│ address
│ 
╵

my-repository リポジトリの my-module を読むことができずコケています。

解決方法

結論を述べると こちらのIssue で議論されている 以下のgit config を設定することで解決しました。

git config --global url."https://oauth2:${{ secrets.GITHUB_TOKEN }}@github.com".insteadOf https://github.com

プライベートリポジトリのリソースを読み取るために認証することを考えます。
そこで、元々のリモートリポジトリへのアクセスURLを変更し、GITHUB_TOKENでの認証付きでリモートリポジトリURLにアクセスするように変更します。

ここで、git で url.<base>.insteadOf を設定するとリモートリポジトリのURLを変更できます。
具体的にはOAuth2.0で認証するために url."https://oauth2:${{ secrets.GITHUB_TOKEN }}@github.com".insteadOf https://github.com となります。

つまりこの terraform init 前にこの設定を行うジョブを実行すれば init 時に GITHUB_TOKEN で認証された状態でmoduleを見に行ってくれます。めでたし。

      - name: settings git config
        run: git config --global url."https://oauth2:${{ secrets.GITHUB_TOKEN }}@github.com".insteadOf https://github.com

おわりに

もしかしたら set-up terraform 側の設定や ssh での解決方法があるかもしれませんが、 今回はgit config への設定で解決しました。
エラー内容・解決方法を見ると当たり前といえば当たり前でしたが、直面したときは少々驚いたので備忘録として書き残しました。

参考

Discussion