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

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

thaim

October 01, 2021
Tweet

Other Decks in Programming

Transcript

  1. Terraform workspaceとTerraform Cloud
    を用いたDRYでシンプルな運用フロー

    株式会社スペースリー
    インフラエンジニア
    佐藤隆佑
    1
    Copyright Spacely, Inc. All Rights Reserved

    View full-size slide

  2. 自己紹介
    2
    Copyright Spacely, Inc. All Rights Reserved
    佐藤隆佑 (Ryusuke Sato)
    ● 株式会社スペースリー (2019-11〜)
    ● インフラエンジニア
    ● Terraform Ansible Docker GitHub Actions AWS datadog など
    ● twitter: @thaim24
    ● github: @thaim

    View full-size slide

  3. 2016年にローンチして以降、不動産/住宅分野を中
    心にしたVerticalな不動産領域と、大手製造業や飲
    食店など研修領域で成長を続けています。 


    会社・サービス紹介
    「どこでもかんたんVR」がコンセプト 

    VR SaaSという未開拓領域のクラウドソフトウェア 

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


    View full-size slide

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

    View full-size slide

  5. Terraform workspace使っていますか?

    5
    Copyright Spacely, Inc. All Rights Reserved
    世の中のディレクトリ構造ベストプラクティス

    ● ディレクトリ分割

    ○ 環境ごとにディレクトリを分けて構築する

    ● モジュール分割

    ○ サービスをモジュール定義して環境ごとに読み込む

    ● workspace切り替え

    ○ terraform workspaceで対象の環境を切り替える


    View full-size slide

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

    開発環境のつもりが本番環境にapplyしてしまった、という事故を懸念

    ● 環境により構成が異なる

    開発環境と本番環境の構成が違うのはよくある話 (弊社も差分はある)

    ● 利用変数・認証情報が異なる

    workspace毎に変数や認証情報を切り替えるのが面倒


    以上を考慮すると、ディレクトリ分割がシンプルでわかりやすい



    View full-size slide

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

    ● 開発環境と本番環境で同一コードを書く必要なし(DRY)

    ● モジュール化も不要なので見通しがよい

    Terraform Cloudとの組合せでより便利に

    ● plan & apply時に workspaceや変数の切り替えを意識する必要なし

    ● Terraform Cloudが開発環境と本番環境を分離して混同の心配なし



    View full-size slide

  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/




    View full-size slide

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

    View full-size slide

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

    ● service-Aは開発も本番も同一ディレクトリ

    ● Terraform workspaceで開発と本番を区別

    共通モジュールとサブモジュール

    ● 複数サービスで利用する場合はmodulesに配置

    ● 環 境 差 分を表 現する場 合はサブディレクトリを
    切ってモジュール化

    ● 詳細後述


    View full-size slide

  11. Terraform workspaceとTerraform Cloudの関係
    11
    Copyright Spacely, Inc. All Rights Reserved
    ● workspaceの切り替えがTerraform Cloud workspaceの切り替えに対応

    (左下図の赤矢印)

    ● 一部workspaceを使わないサービスも存在 (左下図の黒矢印)

    ● terraformの設定では workspacesのprefixを指定 (右下図)


    View full-size slide

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

    ● 開発環境はローカルでapply実行する

    ○ プルリクマージ前にapplyできるので試行錯誤できる

    ○ 手動でリソース作成後 importして差分解消する開発方法も

    ● ステージング/本番環境はTerraform Cloud上でapply実行する

    ○ プルリク作成時に自動でplanが実行され差分の確認が可能

    ○ SSoTを実現し、ローカル環境から間違えてapplyできない

    ○ 本番用の認証変数と変数を配置すればローカルでもplanは可能


    View full-size slide

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

    ● どのサービスがworkspaceをどう活用しているのかわかりにくい

    ● 障害対応のため本番環境の実行モードを変更すると事故のもと

    workspaceの対応関係もTerraformでコード化

    ● tfe_workspaceでコード化、execution_mode=localだとローカルapply

    ● 本番用/開発用の認証情報(環境変数)も一括管理



    View full-size slide

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

    ディレクトリ構成

    Terraform Cloud workspaceの実装例


    View full-size slide

  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スキップ


    View full-size slide

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

    ● 大抵の構成差分は変数や三項演算子で切り分け

    ○ インスタンスサイズやリソース名など

    ● 複数のサービス間で共有するモジュールはmodulesディレクトリで管理

    ○ 一部のリソースのみで利用量は多くない

    ● 環境差分はサブディレクトリで構成

    ○ service-Aの差分はservice-A/sub-resource ディレクトリを読み込み


    View full-size slide

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

    ● 初期のコード化や手作業で構築したリソース対応

    ● 本番環境用の認証情報や環境変数をローカルに配置する必要がある

    複数人での開発

    ● マージ前に複数人がapplyするので環境が勝手にロールバックされる

    ● -targetで追加分のみ反映させたり、tfstateを分割したり

    ● まだ少人数なので問題化されていない


    View full-size slide

  18. まとめ
    18
    Copyright Spacely, Inc. All Rights Reserved
    ● Terraform workspaceを使いDRYで見通しのよいコードを実現

    ● Terraform Cloudを使い運用フローをシンプルに

    ● 本番リソースインポートや並行開発時が課題

    ● We are hiring!


    View full-size slide