GitHub Actionsでプライベートな同リポジトリ下のTerraform moduleを利用する際の認証方法
背景
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
- Organization
my-organization
内のリポジトリmy-repository
下に Terraform modulemy-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