Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

2016年にローンチして以降、不動産/住宅分野を中 心にしたVerticalな不動産領域と、大手製造業や飲 食店など研修領域で成長を続けています。 
 
 会社・サービス紹介 「どこでもかんたんVR」がコンセプト 
 VR SaaSという未開拓領域のクラウドソフトウェア 
 「スペースリー」の研究開発、提供をしています 


Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Terraform workspace使っていますか?
 5 Copyright Spacely, Inc. All Rights Reserved 世の中のディレクトリ構造ベストプラクティス
 ● ディレクトリ分割
 ○ 環境ごとにディレクトリを分けて構築する
 ● モジュール分割
 ○ サービスをモジュール定義して環境ごとに読み込む
 ● workspace切り替え
 ○ terraform workspaceで対象の環境を切り替える


Slide 6

Slide 6 text

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


Slide 7

Slide 7 text

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


Slide 8

Slide 8 text

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/
 
 
 


Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

スペースリーにおけるディレクトリ構成 10 Copyright Spacely, Inc. All Rights Reserved サービスごとに1つのディレクトリ
 ● service-Aは開発も本番も同一ディレクトリ
 ● Terraform workspaceで開発と本番を区別
 共通モジュールとサブモジュール
 ● 複数サービスで利用する場合はmodulesに配置
 ● 環 境 差 分を表 現する場 合はサブディレクトリを 切ってモジュール化
 ● 詳細後述


Slide 11

Slide 11 text

Terraform workspaceとTerraform Cloudの関係 11 Copyright Spacely, Inc. All Rights Reserved ● workspaceの切り替えがTerraform Cloud workspaceの切り替えに対応
 (左下図の赤矢印)
 ● 一部workspaceを使わないサービスも存在 (左下図の黒矢印)
 ● terraformの設定では workspacesのprefixを指定 (右下図)


Slide 12

Slide 12 text

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


Slide 13

Slide 13 text

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


Slide 14

Slide 14 text

workspaceの対応関係もTerraformで管理(実装抜粋) 14 Copyright Spacely, Inc. All Rights Reserved Terraform Cloud workspaceの
 ディレクトリ構成
 Terraform Cloud workspaceの実装例


Slide 15

Slide 15 text

開発の流れ 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スキップ


Slide 16

Slide 16 text

環境差分を表現するためにモジュールを利用 16 Copyright Spacely, Inc. All Rights Reserved 本番と開発(ステージング)で構成が異なる場合はモジュールを利用
 ● 大抵の構成差分は変数や三項演算子で切り分け
 ○ インスタンスサイズやリソース名など
 ● 複数のサービス間で共有するモジュールはmodulesディレクトリで管理
 ○ 一部のリソースのみで利用量は多くない
 ● 環境差分はサブディレクトリで構成
 ○ service-Aの差分はservice-A/sub-resource ディレクトリを読み込み
 


Slide 17

Slide 17 text

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


Slide 18

Slide 18 text

まとめ 18 Copyright Spacely, Inc. All Rights Reserved ● Terraform workspaceを使いDRYで見通しのよいコードを実現
 ● Terraform Cloudを使い運用フローをシンプルに
 ● 本番リソースインポートや並行開発時が課題
 ● We are hiring!