Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Terraform workspaceとTerraform Cloudを用いたDRYでシンプルな運用フロー / DRY and simple workflow with terraform workspace and terraform cloud

Ea29c26318ea6f0782174174ea42d364?s=47 thaim
October 01, 2021

Terraform workspaceとTerraform Cloudを用いたDRYでシンプルな運用フロー / DRY and simple workflow with terraform workspace and terraform cloud

HashiTalks Japan 2021
14:15 - 14:30 JST
https://events.hashicorp.com/hashitalksjapan

Ea29c26318ea6f0782174174ea42d364?s=128

thaim

October 01, 2021
Tweet

Transcript

  1. Terraform workspaceとTerraform Cloud を用いたDRYでシンプルな運用フロー
 株式会社スペースリー インフラエンジニア 佐藤隆佑 1 Copyright Spacely,

    Inc. All Rights Reserved
  2. 自己紹介 2 Copyright Spacely, Inc. All Rights Reserved 佐藤隆佑 (Ryusuke

    Sato) • 株式会社スペースリー (2019-11〜) • インフラエンジニア • Terraform Ansible Docker GitHub Actions AWS datadog など • twitter: @thaim24 • github: @thaim
  3. 2016年にローンチして以降、不動産/住宅分野を中 心にしたVerticalな不動産領域と、大手製造業や飲 食店など研修領域で成長を続けています。 
 
 会社・サービス紹介 「どこでもかんたんVR」がコンセプト 
 VR SaaSという未開拓領域のクラウドソフトウェア

    
 「スペースリー」の研究開発、提供をしています 

  4. ディレクトリ構造ベストプラクティスと Terraform workspace 4 Copyright Spacely, Inc. All Rights Reserved

  5. Terraform workspace使っていますか?
 5 Copyright Spacely, Inc. All Rights Reserved 世の中のディレクトリ構造ベストプラクティス


    • ディレクトリ分割
 ◦ 環境ごとにディレクトリを分けて構築する
 • モジュール分割
 ◦ サービスをモジュール定義して環境ごとに読み込む
 • workspace切り替え
 ◦ terraform workspaceで対象の環境を切り替える

  6. なぜworkspaceの利用事例が少ないか 6 Copyright Spacely, Inc. All Rights Reserved • workspaceの切り替えが面倒


    開発環境のつもりが本番環境にapplyしてしまった、という事故を懸念
 • 環境により構成が異なる
 開発環境と本番環境の構成が違うのはよくある話 (弊社も差分はある)
 • 利用変数・認証情報が異なる
 workspace毎に変数や認証情報を切り替えるのが面倒
 
 以上を考慮すると、ディレクトリ分割がシンプルでわかりやすい
 
 

  7. workspaceとTerraform Cloudでシンプルに 7 Copyright Spacely, Inc. All Rights Reserved workspaceも便利だよ


    • 開発環境と本番環境で同一コードを書く必要なし(DRY)
 • モジュール化も不要なので見通しがよい
 Terraform Cloudとの組合せでより便利に
 • plan & apply時に workspaceや変数の切り替えを意識する必要なし
 • Terraform Cloudが開発環境と本番環境を分離して混同の心配なし
 
 

  8. Terraform Cloudについて 8 Copyright Spacely, Inc. All Rights Reserved Terraform

    Cloud概要
 • HashiCorpによるマネージドなTerraform実行環境
 • GitHubなどと連携してCI/CDを構築可能
 Terraform workspaceとTerraform Cloud workspaceとの違いに注意
 • 同じ名前だが異なる概念
 • Terraform Cloud workspaceはtfstateに加え変数や実行環境を管理
 • 詳細は公式ドキュメント参照: https://www.terraform.io/docs/cloud/workspaces/
 
 
 

  9. スペースリーにおける Terraform の活用状況 9 Copyright Spacely, Inc. All Rights Reserved

  10. スペースリーにおけるディレクトリ構成 10 Copyright Spacely, Inc. All Rights Reserved サービスごとに1つのディレクトリ
 •

    service-Aは開発も本番も同一ディレクトリ
 • Terraform workspaceで開発と本番を区別
 共通モジュールとサブモジュール
 • 複数サービスで利用する場合はmodulesに配置
 • 環 境 差 分を表 現する場 合はサブディレクトリを 切ってモジュール化
 • 詳細後述

  11. Terraform workspaceとTerraform Cloudの関係 11 Copyright Spacely, Inc. All Rights Reserved

    • workspaceの切り替えがTerraform Cloud workspaceの切り替えに対応
 (左下図の赤矢印)
 • 一部workspaceを使わないサービスも存在 (左下図の黒矢印)
 • terraformの設定では workspacesのprefixを指定 (右下図)

  12. 環境による設定の違い 12 Copyright Spacely, Inc. All Rights Reserved 開発環境のみ実行モードをローカル実行で利用
 •

    開発環境はローカルでapply実行する
 ◦ プルリクマージ前にapplyできるので試行錯誤できる
 ◦ 手動でリソース作成後 importして差分解消する開発方法も
 • ステージング/本番環境はTerraform Cloud上でapply実行する
 ◦ プルリク作成時に自動でplanが実行され差分の確認が可能
 ◦ SSoTを実現し、ローカル環境から間違えてapplyできない
 ◦ 本番用の認証変数と変数を配置すればローカルでもplanは可能
 

  13. workspaceの対応関係もTerraformで管理 13 Copyright Spacely, Inc. All Rights Reserved サービスに応じたworkspaceの対応関係が複雑化
 •

    どのサービスがworkspaceをどう活用しているのかわかりにくい
 • 障害対応のため本番環境の実行モードを変更すると事故のもと
 workspaceの対応関係もTerraformでコード化
 • tfe_workspaceでコード化、execution_mode=localだとローカルapply
 • 本番用/開発用の認証情報(環境変数)も一括管理
 
 

  14. workspaceの対応関係もTerraformで管理(実装抜粋) 14 Copyright Spacely, Inc. All Rights Reserved Terraform Cloud

    workspaceの
 ディレクトリ構成
 Terraform Cloud workspaceの実装例

  15. 開発の流れ 15 Copyright Spacely, Inc. All Rights Reserved 1. ローカル環境で開発・apply


    • 複数人での開発が並行しそうな場合はapplyはプルリク作成まで保留
 2. Terraform Cloud上に必要な変数を設定(ステージング/本番)
 3. プルリク作成・プルリクマージ
 4. Terraform Cloud 上のステージング workspaceでapply承認
 5. Terraform Cloud 上の本番workspaceでapply承認
 • ステージング環境でapply失敗した場合はapplyスキップ

  16. 環境差分を表現するためにモジュールを利用 16 Copyright Spacely, Inc. All Rights Reserved 本番と開発(ステージング)で構成が異なる場合はモジュールを利用
 •

    大抵の構成差分は変数や三項演算子で切り分け
 ◦ インスタンスサイズやリソース名など
 • 複数のサービス間で共有するモジュールはmodulesディレクトリで管理
 ◦ 一部のリソースのみで利用量は多くない
 • 環境差分はサブディレクトリで構成
 ◦ service-Aの差分はservice-A/sub-resource ディレクトリを読み込み
 

  17. 課題 17 Copyright Spacely, Inc. All Rights Reserved リソースインポート
 •

    初期のコード化や手作業で構築したリソース対応
 • 本番環境用の認証情報や環境変数をローカルに配置する必要がある
 複数人での開発
 • マージ前に複数人がapplyするので環境が勝手にロールバックされる
 • -targetで追加分のみ反映させたり、tfstateを分割したり
 • まだ少人数なので問題化されていない

  18. まとめ 18 Copyright Spacely, Inc. All Rights Reserved • Terraform

    workspaceを使いDRYで見通しのよいコードを実現
 • Terraform Cloudを使い運用フローをシンプルに
 • 本番リソースインポートや並行開発時が課題
 • We are hiring!