Open suzuki-shunsuke opened 2 years ago
$ terraform init -upgrade
だとすべての provider を upgrade することになるし、 terraform init が失敗したらだと、 checksum が変わっていても検知できない。 Renovate で update された特定の provider だけ更新するみたいなことができると便利
https://www.terraform.io/cli/commands/providers/lock
引数で provider 指定すれば特定の provider だけ update できる
terraform init -upgrade
で改ざんを見逃すのは避けたい
Renovate による provider の自動アップデート
Renovate では required_providers の provider のバージョン制約で、 provider の version を固定することを強制し、 そのバージョン制約のバージョンを update するということをする。
.terraform.lock.hcl を更新せずにバージョン制約だけ上げると
terraform init
は失敗する。現状
https://github.com/suzuki-shunsuke/github-action-terraform-init/tree/v0.1.4 では
terraform init
に失敗したらterraform init -upgrade
を実行し、 .terraform.lock.hcl を更新し、自動でコミットするようになっている。以前自分が shell script で同様の処理を実装していた際は、 PR Author が Renovate の場合のみ同様の処理を行っていたが、 https://github.com/suzuki-shunsuke/github-action-terraform-init/tree/v0.1.4 では PR Author をチェックしなくなってしまっている
.terraform.lock.hcl の自動 update の必要性
まず Renovate で provider を自動 update するには .terraform.lock.hcl の自動 update が不可欠。 加えて、 terraform に詳しくない人が使う前提で考えると、ローカルで .terraform.lock.hcl を更新してもらうのはハードルが高い。 CI で丁寧なガイド(脳死でコマンド実行すれば OK) をコメントできれば改善するかもしれないが、それでも結構ハードルがある。 特に組織の規模が大きいと厳しい(小さければ教育すればよいし、コミュニケーションも取りやすい)
provider を working directory で管理せず、中央集権的に管理するという選択肢
これは mercari が採用している方法。 working directory ごとに update する必要がないし、使用する provider を中央集権的に管理することでサプライチェーン攻撃にも対応できる。 やるとしたら
自動で .terraform.lock.hcl を更新するリスク
バージョンをコードで管理し、再現性を保証するという意味では自動 update でも問題ない。 ただし、 .terraform.lock.hcl にはサプライチェーン攻撃を防ぐという機能もあり、自動 update してしまうとその効果を損なう可能性がある気がしている。 .terraform.lock.hcl には download された provider の checksum が記録されており、 terraform init で download された provider の checksum が .terraform.lock.hcl に記録された checksum と異なる場合、 terraform init が失敗し、改ざんを検知することができる。 しかし、自動で terraform init -upgrade を実行するということは、それを無視して .terraform.lock.hcl を改ざんされた provider の checksum で書き換えてしまうことになるのではないかと思われる。
.terraform.lock.hcl を更新するケース
Provider の信頼性をどう検証するのか
registry にある provider は署名されているので、それも含めて侵害する必要がある。 ただ CI で署名をしてて GitHub Account を乗っ取られたりすると署名では防げない。
terraform validate って credential なしでも実行できるのか。 provider さえダウンロードされていればできるってことかな