20220825 HashiTalks: Japan の発表資料です。 https://events.hashicorp.com/hashitalksjapan
コード化できていなかったヤプリをTerraform文化に変えていった話株式会社ヤプリ 羽渕元紀
View Slide
● 羽渕元紀 / @modokkin● 株式会社ヤプリ● 2018年 インフラエンジニア第一号として入社● インフラ周りからYoutubeまで● Terraform歴 4年ちょっと自己紹介
● アプリ開発・運用・分析をノーコードで提供するアプリプラットフォーム● 年間200以上のアップデート● 導入実績600社以上● 累計アプリ数1億DL以上● 2013年創業、2020年上場Yappli について
Yappli のサービスイメージ
● かっこ悪いかもしれないけど我々の開発フローの改善、Terraform活用の取り組みをお話します● 同じ轍を踏まないためのヒントをおすそ分けお話すること
● 創業当初は全部CTO1人で開発していた● 開発はスピード重視で新機能、機能改修● そこにフルスタックなエンジニアが登場● AWSにリフト&シフト● Rubyベースで当時の開発者と相性の良かったChefを活用歴史的背景
● サーバーサイドのエンジニアがインフラを管理● Terraformは実績はあったものの運用できていなかった● php+nginx環境をchef(AWS OpsWorks)で構築、運用● Vagrantによるローカル環境で開発を行い、リリース前の動作検証は共通のステージング環境でおこなっていた私が入社する前の状況
● 複数のAmazon EC2インスタンスで構成されるサービスを開発用に1つに集約する試みをAnsibleで行っていた● それまでPHPで開発していたが新規開発はGo言語を採用● AWS上に開発環境のインフラを構築するPythonスクリプトが誕生入社直後の状況
構成イメージPython製スクリプトでAWSインフラを作成し、AnsibleでAmazon EC2に開発環境(ミニヤプリ)を作成
ここからが俺のターン
入社してまずやったこと
課題● ステージング環境と開発環境が同じVPCに同居していた● 開発環境を量産できるようになったとはいえ、状態がバラバラで品質の担保が難しかった
● 開発用のAWSアカウントを新設● 目先で必要なリソースはAWS Cloud Formationを活用○ AWS IAMの一部のIAMロールとIAMグループ(サービスが使うロールは別)○ TerrafomのバックエンドAmazon S3バケット開発環境の見直し
● Terraformに手を付ける前に、手動でAWS VPC、SecurityGroupなどを作成し、まずは目先の課題を解決● 長期的には負債になるので、ここからがTerraformの出番開発環境の作成
Terraform活用のはじまり
● AWS OpsWorksから距離を置きたかった● 統一感のない(浸透しない)コード化を整理したかった● 柔軟性が求められたので AWS CloudFormation もちょっと違う● Terraformは参考事例も多く学習コストが低そうだったWhy Terraform?
Terraform活用 その1
方針● まずはAmazon VPC+SecurityGroupから着手● Moduleを使うぞ● 汎用的に使えるイケてるテンプレート作ったろ!
terraform/├── modules│ └─── vpc│ ├── main.tf│ ├── output.tf│ └── variable.tf└── dev└── vpc├── backend.tf├── main.tf├── output.tf├── provider.tf└── variable.tfディレクトリ構成module "vpc" { source = "../../modules/vpc" common = "${var.common}" vpc = "${var.vpc}" }
振り返り● 最初から理想が高すぎた● variable.tfであらゆる環境に対応しようとしていた○ 本番用VPCと開発用VPCは意外との乖離○ 同じテンプレート郡にSecurityGroupを含めた○ 独自Moduleはまだ早かった
Terraform活用 その2
● 開発環境(ミニヤプリ)のTerraform化に着手● Pythonスクリプトの内容を愚直に移植することにした● 前回の反省からModuleを使うのはやめて、できるだけシンプルにすることを心がけた方針
terraform/└── dev-aws├── vpc├── codedeploy│ ├── backend.tf│ ├── datasource.tf│ ├── main.tf│ ├── output.tf│ ├── provider.tf│ └── variable.tf➚ディレクトリ構成➘└── dev├── backend.tf├── datasource.tf├── main.tf├── output.tf├── provider.tf└── variable.tf
● Pythonスクリプトからの移植なので、スムーズに移行● テンプレートはファイルをコピーしていた振り返り
Terraform活用 その3
● 開発環境を量産する前にTerraformのディレクトリ構成、命名規則、コピー運用を見直すことに● Templateファイルにシンボリックリンクで参照する方式を採用● Workspace機能を使うことに方針
terraform/├── template│ ├── service│ │└── review│ │ ├── serviceA.tf│ │ ├── <一部省略>│ │ ├── provider.tf│ │ └── variable.tf│ └── workspace│ └── base│ ├── main.tf│ ├── <一部省略>│ └── variable.tf続くディレクトリ構成
続き└── {workspace名}├── service│ └── review1│ ├── serviceA.tf -> ../../../templates/service/review/serviceA.tf│ ├── backend.tf│ ├── <一部省略>│ ├── provider.tf -> ../../../templates/service/review/provider.tf│ └── variable.tf└── workspace└── base├── backend.tf├── main.tf -> ../../../templates/workspace/base/main.tf├── <一部省略>└── variable.tfディレクトリ構成
● シンボリックリンク運用にしてみたら考えることがシンプルになり効率的に開発できた● Workspace機能は使って良かった○ Backendのtfstateディレクトリの切り替えが楽○ terraform.workspace変数が使えるのが何気に便利だった振り返り
Terraform導入後の世界
● 新機能開発のインフラは原則Terraformで構築● メンバーが増えたときにもスムーズに引き継ぐ事が出来た● インフラの変更管理が容易になり、変更をGithubのPRでレビューできるようにTerraform後の世界
開発フローがスムーズに回り始めた
開発フロー1. 新機能開発時にインフラ構成を検討2. 既存のパターンなら既存のTerraformテンプレートを流用3. 新しいパターンならまず手動で構築してみて、方針が固まったら開発環境にTerraformテンプレートを追加4. 個別QAが完了したらステージング環境、本番環境に移植
まだまだ課題は山積み
● 50環境あり作成した時期がバラバラ○ 機能開発に支障は無いもののインフラ差分が多数発生● 大規模なリファクタリングを行い、大半を作り直す予定増えまくる開発環境
● モノレポなterraformディレクトリ配下○ 294 directories, 1597 files● tfstate○ 開発環境 45~75 resource、11data source○ 共通リソース 450 resource、87 data source● 全体的にディレクトリ構成を見直す予定Terraformもどんどん成長
terraform/├── template└── {workspace名} prod/stg/dev├── service│ └── review1~50 ←約60リソース×50環境└── workspace└── base ↓47ファイル├── serviceA.tf├── serviceB.tf├── <一部省略>├── serviceXY.tf├── serviceYZ.tf└── variable.tfディレクトリ構成
● Terraform CloudやGithub Actionsで自動化を検討○ Github ActionsはIAMロールを扱えるのが魅力的● 人を信頼して強めの権限を利用しているので、権限の見直しに苦労している○ 例えばIAMロール、IAMポリシーを作るところとかローカルや作業用EC2で実行している
● Terraformを初めて使うときは小さく始める● 当たり前だけど開発環境から手を付けるのが良い● 可能なら早い段階からインフラをコード化しておく● 開発スケジュールを優先するときは一旦手動で構築してあとからコード化するのもありまとめ
最後にひとこと
https://open.talentio.com/r/1/c/yappli/homes/3493 https://yappli.co.jp/recruit/