はじめに
どうも、@to-fmakです。今回はTerraformで利用する外部モジュールの参照エラーと、その対応方法について共有したいと思います。
事象
最近、インフラ変更を適用しようとした際に、次のようなエラーが発生しました。
│ Error: Failed to download module
│
│ on sample.tf line xx:
│ xx: module "sample" {
│
│ Could not download module "sample-module" (sample.tf:xx) source code from
│ "git::https://github.com/xxxx/xxxx?ref=xxxx":
│ error downloading
│ 'https://github.com/xxxx/xxxx?ref=xxxx':
│ /usr/bin/git exited with 128: Cloning into
│ '.terraform/modules/sample-module'...
│ fatal: could not read Username for 'https://github.com': Input/output error
│ .
エラー内容を見る限り、該当モジュール(サードパーティモジュールで、ここではsample-moduleとします)の取得が失敗していたようです。
以下は、問題が発生したtfファイルの一部です。
module "sample" {
source = "xxxx/sample-module"
...
}
原因
このモジュールはTerraform Registryに登録されていたため、Registryのページから該当のGitHubリポジトリを確認したところ、リポジトリが「404」で見つかりませんでした。
おそらく、リポジトリが非公開になったか、削除された可能性があります。このようなケースに遭遇したのは初めてでした。
※2024年8月29日時点で、モジュールが消えた理由は不明です。
解決策
考えられる解決策は以下です。
- モジュールの移行先リポジトリを探してみる
- 開発者が新しいリポジトリに移行している可能性がある、その場合、移行先のリポジトリからモジュールを再度取得できる
- .terraformディレクトリのキャッシュを確認する
-
.terraform
ディレクトリに以前取得したモジュールのキャッシュが残っている場合がある、キャッシュに残っていたソースコードを利用してモジュールを自作することも可能
-
- フォークされたリポジトリを探す
- 他のユーザーがモジュールをフォークしている場合がある、フォークされたリポジトリが存在すれば、そちらからモジュールを取得して利用できる
- 自前でモジュールを作成する
- 必要に応じて、自分で同等の機能を持つモジュールを一から作成することが最終的な解決策になる
急ぎのリリースが必要な場合の解決策
- 適用対象のリソースが少ない場合、terraform apply 時に
-target
オプションを指定して特定のリソースだけを適用することが可能 - -target オプションの利用が難しい場合、
terraform state rm
コマンドで問題が発生したモジュールをStateファイルから削除し、その後、tfファイル内の該当ソースコードをコメントアウトまたは削除することで、対象モジュールをTerraformの管理対象外にすることが可能(必要に応じて後から terraform import コマンドで再度管理対象に追加することが可能)
今回の対応
モジュール管理者のGitHubリポジトリには一部のソースコードが残っていましたが、モジュール自体が古いため、今回は新しいプロバイダーを利用し、自前でモジュールを一から作成することにしました。
外部モジュール利用時の注意点
今回の経験から、外部モジュールを利用する際には以下の点に注意することが重要だと感じました。
-
依存性管理
- 外部モジュールに依存することで、モジュールが削除されたり非公開になった場合対応が必要になります。重要なモジュールは、自前で管理するか、forkしておくことを検討すべきではないかと思います
-
バックアップ
- 利用するモジュールのコードをローカル等にもバックアップしておくことで、万が一の場合にも対応できるようになります
おわりに
今後は、モジュールの選定や管理を慎重に行い、インフラの安定運用に努めたいと思います。
エンジニア募集
Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています!!
ぜひお気軽にカジュアル面談へお越しください!!