Slide 1

Slide 1 text

TerraformのCI/CD - monorepoとTerraform Cloud HashiTalks 2021

Slide 2

Slide 2 text

自己紹介 牧田 力 ● 2017年 7月 マネーフォワード入社 ● サービスインフラグループ ● 主にAWSとマルチテナント Kubernetesの運用を担当

Slide 3

Slide 3 text

今日話すこと Terraformにおけるmonorepoとは マネーフォワードのインフラについて multi reposと比較したmonorepoの利点 monorepoで複数のTerraform versionを利用する

Slide 4

Slide 4 text

マネーフォワードのインフラにつ いて

Slide 5

Slide 5 text

Architecture Overview

Slide 6

Slide 6 text

FYI より詳しく知りたい方は以下のスライドを参照してください https://speakerdeck.com/0gajun/multi-tenant-eks-muti-account-architecture-at-money-forward

Slide 7

Slide 7 text

Terraformにおけるmonorepoと は

Slide 8

Slide 8 text

Terraformにおけるmonorepoとは 本セッション内ではmonorepoを以下のように定義 複数のworkspace及びmoduleがサブディレクトリを切 る形で単一のリポジトリ内でバージョン管理されている 状態

Slide 9

Slide 9 text

multi reposとmonorepoの比較

Slide 10

Slide 10 text

CI/CDのメンテナンスビリティ ● CI/CDの設定をすべてのworkspaceに対し てまとめて行える ● CIならformatterやlinter、policy as codeな どのチェック ● CI/CDの設定はrepository毎に必要 Monorepo 👍 Multi Repos 👎

Slide 11

Slide 11 text

複数workspaceのplanをまとめてトリガーできる ● moduleの変更時にそれを利用する workspaceのplanをトリガーできる ● workspaceのplanが失敗していた場合は 変更直後にそれに気づくことができるので 原因の特定と修正が比較的容易 ● moduleと利用側のworkspaceのrepository 別れているので、moduleの変更をトリガー としてworkspace側のplanを走らせるのは 面倒 ● 時間がたってからworkspace側でplanを走 らせたときに初めて失敗したことに気づき、 変更から発見までが遅れる Monorepo 👍 Multi Repos 👎

Slide 12

Slide 12 text

コードの可視性が高い ● 複数のworkspaceが一つのrepositoryにま とまっているので検索が比較的容易 ● 複数のworkspaceに変更を加える際にもま とめて変更してPRをまとめることができる ● workspace毎にrepositoryが別れているの でコードの検索が面倒 ● repositoryの数だけPRが必要になる Monorepo 👍 Multi Repos 👎

Slide 13

Slide 13 text

コードベースの権限管理 ● GitHubであればCODEOWNERSなどを用 いてサブディレクトリ毎に CODEOWNERを 設定する必要があるためやや複雑になる ● Repository単位で権限をコントロールすれ ばよく、比較的わかりやすい Monorepo 👎 Multi Repos 👍

Slide 14

Slide 14 text

monorepoで複数のTerraform versionを利用する

Slide 15

Slide 15 text

複数のTerraform versionの共存 monorepoで複数versionのTerraformを共存させる場合に formatterやlinterのルールがTerraformのメジャーバージョンごとに 違うことが問題になる

Slide 16

Slide 16 text

複数のTerraform versionの共存 各workspaceに対応するサブディレクトリに .terraform-versionを置 いてworkspaceで利用しているTerraform versionを判定できるよう にしている

Slide 17

Slide 17 text

複数のTerraform versionの共存 それぞれ.terraform-versionの中身をもとに実行対象となるサブディレクトリを絞り込む 例:1.0.x系のTerraformを利用しているworkspaceを探すワンライナー ここで絞り込んだサブディレクトリに対して forを回してformattterやlinterを実行する

Slide 18

Slide 18 text

複数のTerraform versionの共存 CIでは各メジャーバージョン毎に代表する versionをひとつ選び、絞 り込んだサブディレクトリに対して実行している

Slide 19

Slide 19 text

おわり