Skip to content

Instantly share code, notes, and snippets.

@suzuki-shunsuke
Last active December 2, 2019 13:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save suzuki-shunsuke/0f6f602571920e95be279044c2f44ea8 to your computer and use it in GitHub Desktop.
Save suzuki-shunsuke/0f6f602571920e95be279044c2f44ea8 to your computer and use it in GitHub Desktop.
突撃!隣のTerraform

最初に 5 ~ 10 分程度お時間を頂いて本日お時間を頂いた経緯などを説明したあと、色々お話を聞かせてもらえたらと思います。

本日のトピックを簡潔に言うと

  • 如何に Terraform の state を分割するか
  • 如何に Terraform によるリソースの管理を SRE から developer に委譲するか

弊社の現状の簡単な説明

  • AWS のリソースを Terraform で管理している
  • 様々なサービスのリソースが同じ state, リポジトリで管理されている
  • いわゆるモノレポ
  • state をサービスドメインによって分割しようとしている(モノレポのまま)
  • そもそものモチベーションとして、 terraform によるリソースの管理を出来るだけ SRE から developer に委譲したい
    • 現状は SRE に対して依頼がくることがある(Elasticsearch使いたいから用意して etc)

  • developer やサービスの数はどんどん増えていく
  • Terraform に限ったことではなく、SRE しかできないようなことを上手く developer に委譲できるようにしないと scale しない
  • SRE としては丸投げするのではなく、 developer でも出来るような仕組みづくりをしていきたい
  • developer としても一々依頼しないでできた方が楽なはず

本日ご相談させていただきたいこと

  • 御社で Terraform の運用をどういうふうにしているか
    • モノレポ?
    • state をどういう風に分割している?
      • サービスとチームって必ずしも一対一じゃない
      • 適切な粒度とは?
    • リポジトリのディレクトリ構成
    • Terraform によるリソースの管理は developer に委譲できている?
      • 委譲する上でなにか工夫していること
      • state の分割以外になにをやっているか(ex. ジェネレータの開発)
    • data source と state の output どっち使ってるか
      • data source のほうが良さそうだと思っている
    • マルチリージョン・マルチクラウドのリポジトリを分けているか、どのようにリリースをしているか
    • Terraform Cloud 使っているか、どう思うか
    • workspace 使ってるか
      • 弊社は使ってない(環境毎にディレクトリ、tfファイルを完全に分けている)
      • 複雑になるし、 DRY じゃなくても完全に分けたほうがいいんじゃないかと思ってる(developer に委譲するなら尚更)
    • module 使ってるか、どういう粒度で module 化するか

Terraform の規模感

  • 国内向けのサービスと海外向けのサービスでリポジトリが分かれている
  • 海外向けのリポジトリは割愛 (国内のほうが大きい)

  • 3600 commits
  • 29 contributors
  • .tf 161 ファイル 11479 行
  • リソースの数(state list):
  • state 数: 3 (環境ごと。 manage, staging, production)

リリースフロー

  • GitHub フローと Gitフローの中間的な感じ
  • ブランチ 3 種類
    • master
    • feature
    • release (リリース先(state)ごとにブランチが分かれている)
master -(checkout)-> feature -(PR)-> master -(PR)-> release
  • CircleCI で terraform plan, apply を実行
  • release branch にマージされたらリリースされる

現状の課題感

  • 同じ state を共有しているのでリリースタイミングに気を使わないといけない
    • リリースしようとしたら別の PR も混じってるけど、これリリースして大丈夫?
  • plan したら関係ない差分出てくることがある(別のサービスの差分)

ディレクトリ構成

現状

environments/
  manage/
  staging/
  production/
modules/

現在構想しているもの

shared/ # common resouces such as VPC
  network/
    production/
      terraform.tfvars
      vpc.tf
      ...
    staging/
    manage/
    modules/
  ...
services/
  service-1/
    production/
      ec2.tf
      ...
    staging/ tfstate
      ec2.tf
      ...
    modules/
  ...
modules/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment