はじめに
ニフティでエンジニアをしている添野 翔太です。ここ最近、@niftyトップページシステム基盤の刷新を進めています。
本稿ではGitHubプロバイダーを利用してCI/CDパイプラインに関するリソースをTerraformで管理しようとした際にハマったポイント、そしてそれに対する解決方法を紹介します。
背景
担当するシステムではGitHubでコードを管理しているのですが、CI/CDパイプラインに関連するCodeファミリーへソースコードをミラーリングするにあたりWEBフックを仕掛けています。そしてこちらのコードはモジュール側に存在します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
resource "github_repository_webhook" "web" { repository = var.repository_name configuration { url = aws_codepipeline_webhook.webhook.url content_type = "json" insecure_ssl = true secret = aws_ssm_parameter.github_personal_access_token.value } events = ["push"] } resource "aws_codepipeline_webhook" "webhook" { name = replace("${var.application_name}_webhook_deploy", "-", "_") authentication = "GITHUB_HMAC" target_action = "Source" target_pipeline = aws_codepipeline.dummy_codepipeline.name authentication_configuration { secret_token = aws_ssm_parameter.github_personal_access_token.value } filter { json_path = "$.ref" match_equals = "refs/heads/{Branch}" } } |
ハマったポイント
その他のコードの記載は割愛しますが、デプロイしたところ以下のような404エラーが出てくるようになりました。このままだとTerraform Applyを行うGitHub Actionsワークフロー上でもコケてしまう状態に……
1 2 |
% terraform apply POST https://api.github.com/repos//dummy-repo-nifkuji/hooks: 404 Not Found [] |
質問サイトなどを閲覧し調査を進めてみたのですが、解決に向けてなかなか進展しない状況でした。
ハマった原因
上記の404エラーを受けて、プロバイダー周りの設定がおかしくなっているのではないかという仮説を立てて、以下のコマンドを打ってみました。
1 2 3 4 5 6 7 8 9 |
% terraform providers Providers required by configuration: . ├── provider[registry.terraform.io/hashicorp/aws] ~> 4.59.0 ├── provider[registry.terraform.io/integrations/github] ~> 5.18.3 ├── module.ci_cd │ ├── provider[registry.terraform.io/hashicorp/aws] │ └── provider[registry.terraform.io/hashicorp/github] |
上記の結果を見るとモジュール側と呼び出し側とでGitHubプロバイダーの設定が違うことに気付きました。この事が今回の404エラーを引き起こした原因です。
より具体的には、公式ドキュメントによれば、sourceの指定がintegrations/githubに変わり、デフォルトだとhashicorp/githubの方が落ちてきている状態だったことです。
解決方法
そこで今回はモジュール側にもrequired_providersを用いた設定を施したファイルを配置しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
terraform { required_version = ">= 1.4.2" required_providers { aws = { source = "hashicorp/aws" version = "~> 4.59.0" } github = { source = "integrations/github" version = "~> 5.18.3" } } } |
そうしたらプロバイダーの設定が揃いました。
1 2 3 4 5 6 7 8 9 |
% terraform providers Providers required by configuration: . ├── provider[registry.terraform.io/hashicorp/aws] ~> 4.59.0 ├── provider[registry.terraform.io/integrations/github] ~> 5.18.3 ├── module.ci_cd │ ├── provider[registry.terraform.io/hashicorp/aws] ~> 4.59.0 │ └── provider[registry.terraform.io/integrations/github] ~> 5.18.3 |
そうして404エラーは無事に解決されました。ついでにterraform init時のWarningメッセージも消えました。思い返すとこのWarningメッセージで原因と解決策を思い付けたかもしれないなと思いました。
1 2 3 4 5 6 |
│ Warning: Additional provider information from registry │ │ The remote registry returned warnings for │ registry.terraform.io/hashicorp/github: │ - For users on Terraform 0.13 or greater, this provider has moved to │ integrations/github. Please update your source in required_providers.<code></code> |
まとめ
今回はGitHubプロバイダーを利用してCI/CDパイプラインに関するリソースをTerraformで管理しようとした際にハマったポイント、そしてそれに対する解決方法を紹介しました。
何かの参考になったら幸いです。