Slide 1

Slide 1 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 1 大規模 Terraform リポジトリで頑張る Continuous Version Update 2025 Oct 23rd Yuya Koda

Slide 2

Slide 2 text

AbemaTV, Inc. All Rights Reserved
 Yuya Koda ABEMA の Cloud Platform チーム所属のエンジニア Google Cloud を中心とした ABEMA のインフラ周りを手広く みています。業務では YAML か JSON か HCL か Markdown を書いていることが多いです。たまに Go も。 趣味はコーヒーでマイブームはぬか漬けを作ること 2 Profile ponkio_o

Slide 3

Slide 3 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Terraform 使っている人?✋ 3

Slide 4

Slide 4 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 (自動/手動/頻度問わず) バージョン更新できている人?✋ 4

Slide 5

Slide 5 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 (自動/手動問わず) 継続的にバージョン更新できている人?✋ 5

Slide 6

Slide 6 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 継続的に自動でバージョン更新できている人?✋ 6

Slide 7

Slide 7 text

AbemaTV, Inc. All Rights Reserved
 ABEMA の Terraform 事情 7

Slide 8

Slide 8 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 8 ABEMA の Terraform リポジトリ ABEMA の Terraform リポジトリは、Platform Team 以外の開発者も PR を出し、自身で plan / apply とマージまでを行う ● 単一リポジトリに複数のサービスが存在する monorepo 構成 ● サービスごとにディレクトリを区切って各ディレクトリにオーナーが存在 ○ CODEOWNERS で設定し、コードーオーナーのレビューを必須にしている ● ステートファイルはサービス x 環境ごとに分割 ○ 現時点で 2000 以上

Slide 9

Slide 9 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 9 ディレクトリ構成イメージ 各サービスごとにオーナーが存在しており「サービス x 環境」でステートファイルが分割されている

Slide 10

Slide 10 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 10 Atlantis Terraform の実行には Atlantis を利用していて、開発者自身で plan / apply を行えるようにしている (IAM など一部の変更は Platform Team のレビューを必須にする仕組みを入れている) https://www.runatlantis.io/

Slide 11

Slide 11 text

AbemaTV, Inc. All Rights Reserved
 Terraform とバージョン更新 11

Slide 12

Slide 12 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 12 なぜ継続的なバージョン更新が必要か? 短期的には必須ではないが、Terraform / Terraform Provider を継続的にバージョンアップすることは とても大切 ● Terraform 本体の新機能への追従 ● 各 Provider の新機能への追従 ○ 新機能を使わなくても Provider のバージョンは上がり続けるのでそのうち困る ● Terraform を動かすキッカケを作る ○ コード化しても、使い続けないとそのうち実リソースの乖離 (いわゆる Drift) が起き始める ■ そして乖離がデカくなると IaC の運用を諦めてしまう

Slide 13

Slide 13 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 13 Terraform はバージョン更新を自動化しやすい Terraform はその性質上、アプリケーションのライブラリなどに比べてバージョン更新作業を自動化 しやすい ● (最近は) 破壊的変更がほとんどない ○ 単純にバージョンをインクリメントするだけで OK ● terraform plan コマンドで実行計画を表示できる ○ 基本的には plan が通って差分が出なければ OK ○ CI では差分発生時に exit 2 してくれる plan の -detailed-exit オプションが便利 ● 仮にバグが混入していても実リソースに影響を与えない ○ 極論 terraform apply しない限り勝手に実リソースが壊れたりしない

Slide 14

Slide 14 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 14 バージョン更新作業を自動化する 定期的なアップデートを手動でやるのは結構大変なのと、数が増えると追いつかなくなるので何かしら自 動化の仕組みは必須。便利なサービスやツールがあるのでそれを活用するのがオススメ ● 自動で PR を作ってくれるサービス ○ Dependabot ○ Renovate ● ファイルを更新してくれるツール ○ minamijoyo/tfupdate

Slide 15

Slide 15 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 15 Renovate ABEMA では Dependabot に比べて高度な設定ができ Automerge する仕組みも整備されているため Renovate (セルフホスト版) を採用している。セルフホスト版を利用している理由は後述 https://github.com/renovatebot/renovate

Slide 16

Slide 16 text

AbemaTV, Inc. All Rights Reserved
 自動化で直面した課題 16

Slide 17

Slide 17 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 renovate-approve が使えない問題 17

Slide 18

Slide 18 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 18 renovate-approve とは Renovate では renovate-approve という GitHub Apps が提供されており、これを用いることで Automerge を有効化した PR に対して Approve を付与することができるため、Approve を必須にしている リポジトリで Renovate の PR を automerge したい時に便利 https://github.com/apps/renovate-approve

Slide 19

Slide 19 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 19 CODEOWNERS と GitHub Apps 先ほど話したように Terraform リポジトリでは CODEOWNERS ファイルを用いてコードオーナーを設定 し、コードオーナーの Approve を必須にしているが、GitHub App はコードオーナーに指定できない。 そのため renovate-approve で Approve を付与してもマージ条件を満たせない

Slide 20

Slide 20 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 20 解決策 マシンアカウントを指定することはできるので、renovate-approve の利用を諦めて、マシンアカウント を用いて Renovate の PR に Approve を付与する CI を作ることに…😭

Slide 21

Slide 21 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 マネージド版 Renovate が使えない問題 21

Slide 22

Slide 22 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 22 マネージド版 Renovate の制約 マネージド版の Renovate はマシンスペックやタイムアウトの制約が存在する。 最初は問題なかったが、対象ディレクトリを増やしていくと実行に時間がかかるように…(15分以上) https://docs.renovatebot.com/mend-hosted/overview/

Slide 23

Slide 23 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 23 解決策 Renovate はセルフホスト可能なので GKE クラスタ上で動かすことにした (CronJob で定期実行) これによりスペックやタイムアウトは自分たちでハンドリングできる上にキャッシュも利用可能になった

Slide 24

Slide 24 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 24 Tips: セルフホストの場合 renovate-approve はどうなる? セルフホスト版 Renovate を利用する場合、renovate-approve もセルフホストが必要になる ドキュメントは存在しないが、単なる Webhook サーバで実装が公開されているので比較的簡単に構築 できる (実装は70行ほど) https://github.com/renovatebot/renovate-approve-bot

Slide 25

Slide 25 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Renovate の PR 通知がノイズになる問題 25

Slide 26

Slide 26 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 26 通知のノイズ問題 Branch Protection の「Require review from Code Owners」を有効化すると指定したコードオーナーが reviewer として強制アサインされ Renovate の PR が作られるたびにコードオーナーに通知される

Slide 27

Slide 27 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 27 解決策 バージョン等が記載される .tf ファイルの命名規則が揃っていたので、特定のファイルだけコードオーナー を外した。 CODEOWNERS ファイルでは明示的にオーナーを指定しない場合にコードオーナーを外すことができる

Slide 28

Slide 28 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 28 CODEONWERS Bypass 対策 コードオーナーを設定しないようにしたファイルに対して resource blockを書き込むことでコードオーナー のレビューをバイパスできてしまう 😱 Atlantis の Custom Workflows でバージョンなどが記載されるファイルをパースし resource block が存在 していたら CI を fail させることで Bypass を対策した

Slide 29

Slide 29 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 29 副次的な効果 特定ファイルのコードオーナーが不在になったことで、renovate-approve が使えるようになった 👍👍👍 (先ほど話した通り、Renovate がセルフホストのため renovate-approve もセルフホスト)

Slide 30

Slide 30 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 Drift 問題 30

Slide 31

Slide 31 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 31 Drift 問題 いざ Renovate を動かしてみると Drift が大量発生 🤯 ● 手動変更が加えられていて差分が出ているパターン ● apply を忘れてマージしたパターン (Atlantis では PR コメントで apply をトリガーするため) ● 社内 Module がバグっていて無限に差分が出るパターン ● Provider アップデートに伴うスキーマ変更 などなど…いずれも人間が手動で対応する必要がある

Slide 32

Slide 32 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 32 解決策 Drift が発生している PR は自動的に close し、更に Issue を自動生成して担当者をアサインするように した。対応ドキュメントも用意し、みんなでちまちま修正していった

Slide 33

Slide 33 text

AbemaTV, Inc. All Rights Reserved
 今後について 33

Slide 34

Slide 34 text

AbemaTV, Inc. All Rights Reserved
 AbemaTV, Inc. All Rights Reserved
 34 今後について ● 頑張って全部ディレクトリ正常化したい ○ 2000 以上対象があるうち、ようやく半分くらい正常化できた ● 各サービスオーナーが自律的に Drift を解消できるようにしたい ○ 今は Cloud Platform チームが直している

Slide 35

Slide 35 text

AbemaTV, Inc. All Rights Reserved