Cloud Native Days Tokyo 2022
DevOps実装初期フェーズの組織がTerraformとecspressoで求めるAmazon ECS CI/CDの最適解
View Slide
自己紹介名前:Tocyuki(としゆき)所属:株式会社トラストバンク CTO室 SRE経歴:Network→Infra→SRE趣味:ギター、柔術(紫帯)SNS:@Tocyuki2
会社紹介
会社概要4資本金 122,243,816円親会社 株式会社チェンジ(東京証券取引所第一部) 100%連結子会社子会社 株式会社Orb決算期 3月主な事業・サービス ふるさと納税ポータルサイト「ふるさとチョイス」 パブリテック事業 「LoGoシリーズ」 エネルギー事業 ふるさとエネルギーチョイス「えねちょ」 地域通貨事業 「chiica(チーカ)」
Vision5目指すは「自立した持続可能な地域をつくる」こと。トラストバンクが目指す地域共創で実現する経済循環図
6ふるさと納税事業 パブリテック事業エネルギー事業地域通貨事業主な事業・サービス
SECTION700 DevOps実装初期フェーズの組織がTerraformとecspressoで求めるAmazon ECS CI/CDの最適解
聴講対象者• 開発者にもインフラ、IaCに触れてほしい• DevOpsの実装例に興味がある• Amazon ECSでシンプルなCI/CDを実現したい8
今回お話しすること• DevOps実装設計の肝• CI/CDで採用したツール、サービス• Amazon ECSのCI/CD9
10DevOps実装初期フェーズの組織?
とある開発組織11バグで障害起こされたらやだからしっかりテストしてくれやリリースしたい新機能が盛りだくさんだぜOperatorDeveloperテスト書けてないけど多分動くと思うからリリースしようぜいや、そんなんリリースすんなし
とある開発組織12バグで障害起こされたらやだからしっかりテストしてくれやリリースしたい新機能が盛りだくさんだぜOperatorDeveloperテスト書けてないけど多分動くと思うからリリースしようぜいや、そんなんリリースすんなし協力しようぜ!!
とある開発組織13よし、まずは踏み台サーバーにSSHして、アプリサーバーに SSHしてgit pullしてとテストしたからリリースしてよOperatorDeveloperはやくしてくれ〜ふー、あと100台同じことやらなきゃ
とある開発組織14よし、まずは踏み台サーバーにSSHして、アプリサーバーに SSHしてgit pullしてとテストしたからリリースしてよOperatorDeveloperはやくしてくれ〜ふー、あと100台同じことやらなきゃ自動化しようぜ!!
DevOpsとは15ざっくり説明すると、開発チームと運用チームのサイロ化や様々な場面での自動化プロセスの欠如により迅速なソフトウェアデリバリーが実現できていないような状況を改善するための手法、文化、思想
DevOpsで目指したいこと16OperatorとDeveloperが共にプロダクトにオーナーシップを持ち、開発、リーリース、運用のサイクルを協力しながら迅速にまわしていく状態を目指したい
弊社のDevOps実装前の状況17• 開発者がインフラの構築や変更に関心がない• インフラ構築、変更は外部のMSPへ委託していた• 開発者が運用監視について関心がない• インフラ運用監視は外部のMSPへ委託していた• 開発者が運用を考慮した設計、実装に関心がない• 開発者が運用に参加していないため、運用を考慮した発想が出ない• 各種運用が自動化されておらず作業工数負荷が高い• 運用改善や自動化の文化もリソースもなく惰性で対応
18class SRE implements DevOpsSREはDevOpsというinterfaceの実装である
DevOps実装を始めて弊社に起こった変化19• 開発者がIaCへコントリビュートを始める• AWSへの移行に伴いInfrastructure as Codeを実践• 開発者が監視アラートやダッシュボードを仕込み始める• New Relicをオブザーバビリティ基盤として導入• 開発者が運用を考慮した設計、実装をし始める• 運用に参加する開発者が増え、運用を考慮し始める• 様々な運用が自動化され開発に割ける工数が増えた• デプロイ、ビルド、テスト等様々な部分を自動化
20どのようにDevOpsを実装するか?
21Amazon ECSのCI/CDの事例を元にDevOps実装の一例をご紹介します
SECTION2201 DevOps実装設計の肝
DevOpsが扱う5つの領域23Reduce organizational silos 組織のサイロを削減するAccept failure as normal エラーが発生するのを許容するImplement gradual change 段階的に変更するLeverage tooling and automation ツールと自動化を活用するMeasure everything すべてを計測する
24OperatorDeveloperなぜサイロ化が起こるのかインフラ運用監視障害対応テスト開発 機能追加リリース関心のスコープは関与できる領域にしか広がりにくい関心のスコープ 関心のスコープ
25OperatorDeveloperなぜサイロ化が起こるのかインフラ運用監視障害対応テスト開発 機能追加リリース関心のスコープが異なる組織は目的も異なりやすい関心のスコープ 関心のスコープ多少のリスクは負っても新機能、価値をユーザーへ届けたいユーザーへ届けるべき一番の価値は安定稼働
26OperatorDeveloperインフラ運用監視障害対応テスト開発 機能追加リリース関心のスコープ 関心のスコープ関心のスコープの共通化が有効サイロ化を起こさせないために
27インフラ運用監視障害対応テスト開発機能追加リリース関心のスコープ理想の姿Operator & Developer
28千里の道も一歩から
段階的に共通化を広げていくことが大事• お互いの関心のスコープに関与できるような仕組み作り• プログラムを共通言語とするInfrastructure as Codeの実践• Infrastructure as Codeを実践しやすいパブリッククラウドの採用• いきなりすべてに関与することは難しいので切り出す• アプリケーションリポジトリにインフラの定義を一部持たせる• 利用しやすい仕組みとしてCI等で自動化する29とは言うものの、どうやって実現しよう?
DevOpsが扱う5つの領域30Reduce organizational silos 組織のサイロを削減するAccept failure as normal エラーが発生するのを許容するImplement gradual change 段階的に変更するLeverage tooling and automation ツールと自動化を活用するMeasure everything すべてを計測する
DevOps実装設計の肝まとめ31• 関心のスコープの共通化が有効• 共通化の範囲は一気に広げず、段階的に適用していく
SECTION3202 CI/CDで採用したツール、サービス
採用したツール、サービス33名称 役割TerraformHashiCorp社謹製のパブリッククラウドやオンプレミスのリソースを安全かつ効率的に構築、変更バージョン管理するためのInfrastructure as Codeツールecspressoカヤック藤原さん謹製のAmazon ECS用のとても薄いレイヤーで作られたAWS APIラッパーなデプロイツールで「エスプレッソ」と読みますGitHub Actions GitHub謹製のCIツール
• ECSのサービス、タスク定義の管理に特化している• アプリケーションのライフサイクルに近い部分のみを切り出せる• アプリケーションリポジトリに定義を配置することで開発者が変更できる• tfstateファイル内の値を参照できる• tfstateのバックエンドにS3を利用している場合、Terraformで構築したAWSのリソースを呼び出せるため、サービスやタスクを環境毎に分ける必要がなくDRYに書ける• 開発者がTerraformのどこで定義されているか読み取ることができるecspresso採用理由34
• ECSのサービス、タスク定義の管理に特化している• アプリケーションのライフサイクルに近い部分のみを切り出せる• アプリケーションリポジトリに定義を配置することで開発者が変更できる• tfstateファイル内の値を参照できる• tfstateのバックエンドにS3を利用している場合、Terraformで構築したAWSのリソースを呼び出せるため、サービスやタスクを環境毎に分ける必要がなくDRYに書ける• 開発者がTerraformのどこで定義されているか読み取ることができるecspresso採用理由35段階的且つ効果的にインフラの一部を開発者の関心のスコープへ入れることができる
アプリケーションのリポジトリ構成36
• ECSのサービス、タスク定義の管理に特化している• アプリケーションのライフサイクルに近い部分のみを切り出せる• アプリケーションリポジトリに定義を配置することで開発者が変更できる• tfstateファイル内の値を参照できる• tfstateのバックエンドにS3を利用している場合、Terraformで構築したAWSのリソースを呼び出せるため、サービスやタスクを環境毎に分ける必要がなくDRYに書ける• 開発者がTerraformのどこで定義されているか読み取ることができるecspresso採用理由37ecspressoをハブにしたTerraformへの導線確保を行うことで、今後さらに開発者の関心のスコープを広げるための下地作りができる
こんな感じで参照できる38
すると・・・?39開発者DBの設定確認したいなぁ。お、Terraformのこの定義を見に行けばええんやな。じぃ〜〜〜〜〜なるほど、Terraformはこう書けばええんやな。いっちょ PR出してみよか。
• ECS execもラップしてくれている• やっぱりコンテナ入りたいをecspressoで叶えてくれる• ECSタスクのイベントログを一括表示する機能がある• デバッグで超絶便利ecspresso採用理由40
たとえばこんな時41ecspresso 開発者ローカルでは動くのに ECSだとうまく動かないのよなぁ。あー、こんなときに ECSのコンテナ入ってデバッグできればなぁ。ecspresso execコマンドを使うのです …なんだ!??ecspresso exec??お、コンテナ入れた!!!これで!!!かてる!!!
• ECS execもラップしてくれている• やっぱりコンテナ入りたいをecspressoで叶えてくれる• ECSタスクのイベントログを一括表示する機能がある• デバッグで超絶便利ecspresso採用理由42
たとえばこんな時43ecspresso 開発者あー、ECSのデプロイがうまくいかないー。原因もよくわからんし、そもそもどうやってデバッグすればええんやー。つらー。--traceでイベントログを出力させるのです …なんだ!??--traceオプション??お、イベントログが表示された!?また IAM権限不足!!貴様か!!これで!!!かてる!!!
AWS ResourcesECSオブジェクトとツールの関連図44ECS ClusterECS ServiceECS Task definitionContainer definitionDockerfileecspressoecspressoTerraformTerraform
AWS ResourcesECSオブジェクトとツールの関連図45ECS ClusterECS ServiceECS Task definitionContainer definitionDockerfileecspressoecspressoTerraformTerraformアプリケーションリポジトリに配置Terraformリポジトリに配置
CI/CDで採用したツール、サービスまとめ46• ecspressoはECSのサービス、タスク定義などのアプリケーションのライフサイクルに近い部分を切り離して管理できる神ツール• ecspressoをハブにTerraformへ誘導し、IaCへのコントリビュートにも参加してもらおう
SECTION4703 Amazon ECSのCI/CD
• Dockerコンテナのビルド• コンテナレジストリへのプッシュ• タスク定義のデプロイAmazon ECSのデプロイで必要なこと48
• Dockerコンテナのビルド• コンテナレジストリへのプッシュ• タスク定義のデプロイAmazon ECSのデプロイで必要なこと49
コンテナのビルドとECRへのプッシュ50開発者 GitHub GitHubActionsECRpushbuildpush
• Dockerコンテナのビルド• コンテナレジストリへのプッシュ• タスク定義のデプロイAmazon ECSのデプロイで必要なこと51
ECS Clusterタスク定義のデプロイ52 ServiceTask definition開発者 GitHub GitHubActionsecspressopushdeployjobs:deploy:runs-on: ubuntu-lateststeps:- uses: actions/[email protected]- uses: kayac/[email protected]with:version: v1.7.14- run: |ecspresso deploy --config ecspresso.yml
ECS ClusterCI/CD全体の流れ53 ServiceTask definition開発者 GitHub GitHubActionsECRecspressopushbuildpushdeploy
• Blue/Greenデプロイが必要な要件がとくにない• ロールバックなどECSに任せることができる• なるべくシンプルなデプロイにしたいデプロイ方式はローリングアップデート54
デプロイイメージ55 ECS Cluster ServiceTask definition revision 1ALBユーザー
デプロイイメージ56 ECS Cluster ServiceTask definition revision 1Task definition revision 2開発者 GitHub GitHubActionsecspressoALBユーザー
デプロイイメージ57 ECS Cluster ServiceTask definition revision 1Task definition revision 2ALBユーザー
デプロイイメージ58 ECS Cluster ServiceTask definition revision 1Task definition revision 2ALBユーザー
デプロイイメージ59 ECS Cluster ServiceTask definition revision 2ALBユーザー
ロールバックイメージ60 ECS Cluster ServiceTask definition revision 1Task definition revision 2開発者 GitHub GitHubActionsecspressoALBユーザー
ロールバックイメージ61 ECS Cluster ServiceTask definition revision 1Task definition revision 2ALBユーザーhealthcheck failed
ロールバックイメージ62 ECS Cluster ServiceTask definition revision 1ALBユーザー
Amazon ECSのCI/CDまとめ63• GitHub Actionsのシンプルで簡素な記述でDockerのビルド、ECRへのプッシュ、ecspressoによるデプロイをシンプルに実装することができた• デプロイ方式もローリングアップデートにすることでロールバックもECSのマネージドに任せることができシンプルでわかりやすいデプロイにすることができた
SECTION6404 まとめ
• DevOpsの意図をアーキテクチャに組み込むことで仕組みレベルでのDevOps推進を進めることができた• ecspressoとTerraformを使ったECS環境、CI/CDはDevOps実装の一歩目としてとても有効だと感じた• 組織のレベル、状況によって最適解は異なるので色々試して自組織の最適解を模索してみてくださいまとめ65
66絶賛SRE募集中です!