投稿日
複数ロケーションに跨るチーム向けの開発環境・実行環境のスタック
もくじ
概要
我々は東京と大阪の2ロケーションに跨ったチームで、スタートアップと協業してサービス開発を行っています。
異なるロケーションに居るチームメンバーとは気軽に会話することは不可能ですが、同じチームで開発を進めるためにはリアルタイムなコミュニケーションは必要不可欠です。
またサービス開発ではサービスのPoC(Proof of Concept)を実施する際、スマートフォンやIoT機器からインターネットを通じてAPIへアクセスする必要があり、広くアクセス可能な実行環境を必要としました。
そのためロケーションの制約を受けずにリアルタイムなコミュニケーションを取りながら開発を進めるための開発環境と、PoCなどで広くアクセス可能な実行環境を、クラウドサービスを利用して構築しました。
更に開発環境はアクセス制御や侵入者対策などを目的に、VPNを介してアクセスするようにしています。
このドキュメントでは、それら「開発環境のスタック」と「実行環境のスタック」を、具体的な活用方法も含めて紹介します。
環境の全体構成
我々が使用している環境を図にまとめました。
AWS上は開発環境VPCと実行環境VPC、2つのVPCがあります。 2つのVPCはVPCピアリングで接続されています。
実行環境に置かれたアプリケーションに何らかの脆弱性があり、そこから開発環境へ侵入してソースコードなどを取得されるといったことを防ぐため、接続を開始できる方向を開発環境VPCから実行環境VPCのみに限定しています。 逆方向では接続を開始できません。
開発環境VPCにはパブリックサブネットとプライベートサブネットがあります。 パブリックサブネットにはVPN接続を行うための製品が置かれています。 プライベートサブネットにはJIRAやGitLabといった開発ツールと踏み台サーバーが置かれています。 開発ツールについては後述します。 踏み台サーバーは実行環境へSSHでアクセスするために置かれています。
実行環境VPCにはプライベートサブネットがあり、PoCなどでアクセスするためのWeb APIが置かれます。 Web APIをメンテナンスするためには開発環境VPCの踏み台サーバーを経由してアクセスします。 インターネットからWeb APIへHTTPでアクセスするためには、API Gatewayを経由します。
PoCを実施する際はスマートフォンやIoT機器からインターネット越しにHTTP通信が行われます。 実行環境に置かれたアプリケーションの認証処理に脆弱性があり、不正にアクセスされることを防ぐため、アプリケーションの認証処理とは別にAPI GatewayでもAPIキーによる認証を行っています。
開発環境・実行環境のスタック紹介
開発環境のスタック
ここでは我々が複数ロケーションに跨るチームで開発を推進するために活用しているツールについて簡単に紹介します。
いずれのツールも機能が十分であることは当然のことながら、いくつかのツールについてはアクセス制御や侵入者対策などの観点からVPN経由で使用する必要があったため、自分たちの環境へインストール可能であることも選定のポイントになりました。
JIRA
・https://ja.atlassian.com/software/jira
Atlassianという企業が提供しているプロジェクト管理のソフトウェアです。
バックログの管理をしたり、かんばん形式で表示させてスクラムイベントでの情報共有に使用しています。
サービスとしても提供されていますが、我々はVPNを介してアクセスできるプライベートサブネット上にサーバー版をインストールして使用しています。
GitLab
バージョン管理システムです。
サービスとしても提供されていますが、我々はJIRAと同じくVPNを介してアクセスできるプライベートサブネット上にインストールして使用しています。
GitLabはバージョン管理の機能以外にもCIの機能を持っており、我々はそのCI機能でソースコードをビルドして、後述するNexusへのデプロイなども行っています。
Nexus
・https://www.sonatype.com/nexus-repository-oss
プライベートなMavenリポジトリやDockerレジストリを構築できるソフトウェアです。
我々は主に成果物のデプロイ先として使用しています。
こちらもJIRAやGitLabと同じようにVPNを介してアクセスできるプライベートサブネット上にインストールして使用しています。
Zoom
・https://zoom.us/jp-jp/meetings.html
PCやスマートフォンでビデオ会議が出来るサービスです。
スクラムイベントの際はZoomで各拠点を繋いで会話をしています。 手軽に使用できますし、画像・音声共に高品質でストレスなくビデオ会議ができています。
Slack
チャットサービスです。
日々のコミュニケーションで使用する主たるツールです。
実行環境のスタック
API Gateway
AWSが提供しているサービスです。
我々が開発する各サービスそのものにも認証は存在しますが、API Gateway自体でもAPIキーによる認証を行えるのでサービスの開発状況によらずセキュリティを担保できます。
スマートフォンやIoT機器から送信されるHTTPリクエストはAPI Gatewayを経由して実行環境のプライベートサブネットにあるサービスへ到達します。 サービスはSpring Bootで構築されておりjava
コマンドで実行されているものや、Ruby on Railsで構築されておりDockerで実行されているものなど様々です。
スクラム開発における開発環境スタックの活用について
複数ロケーションに跨ったスクラムチームでの開発におけるスクラムイベントや日々の活動において、開発環境スタックの各ツールをどのように活用しているのかを紹介します。
どのスクラムイベント・日々の活動で主にどのツールを活用しているのか表にまとめてみました。
JIRA | GitLab | Nexus | Slack | Zoom | |
---|---|---|---|---|---|
スプリント計画 | ○ | ○ | ○ | ||
デイリースクラム | ○ | ○ | |||
スプリントレビュー | ○ | ○ | |||
ふりかえり | ○ | ○ | |||
実装 | ○ | ○ | |||
レビュー | ○ | ||||
ドキュメンテーション | ○ | ||||
日々のコミュニケーション | ○ | ○ |
スプリント計画
バックログ
・使用ツール:JIRA、Zoom
バックログの管理にはJIRAを使用しています。
ロケーションが離れていない場合は、メンバーがミーティングスペースに集まり同じ画面を見ながらバックログの共有を行うことが多いと思われます。
しかしロケーションが離れている場合でも、Zoomで拠点間を繋ぎながら画面共有を用いてバックログやタスクをメンバーで共有することによって実施できます。
・バックログの画面例
プランニングポーカー
・使用ツール:Slack、Zoom
プロダクトバックログアイテムの見積もりはプランニングポーカーで行っています。
プランニングポーカーとは、「1、2、3、5……」といった数字が書かれたカードを使って、 タスクの規模を相対的に見積もる手法です。
ロケーションが離れていない場合は、メンバーが集まりそれぞれのタスクに対して 思いのままに数字のカードを出し合っていました。
ロケーションが離れている場合でも、プロダクトバックログアイテムのタイトルをコピーしてSlackに貼り付け
Zoom上の会話で合図を出してメンバーが一斉に数字のリアクションをつけることで実施が可能です。
視覚的にもどの数字が一番多いか一目瞭然のため、ロケーションが離れているいないに関わらず使用してもよいでしょう。
・Slackでのプランニングポーカーの例
デイリースクラム
・使用ツール:JIRA、Zoom
Zoomで拠点間をつなぎ、画面共有とビデオ通話を用いてデイリースクラムをします。
デイリースクラムではJIRAのタスクを見ながら各自、次の事項を共有します。
・開発チームがスプリントゴールを達成するために、私が昨日やったことは何か?
・開発チームがスプリントゴールを達成するために、私が今日やることは何か?
・私や開発チームがスプリントゴールを達成する上で、障害となる物を目撃したか?
参考:
・https://scrumguides.org/docs/scrumguide/v2017/2017-Scrum-Guide-Japanese.pdf 「デイリースクラム」のセクション
スプリントレビュー
・使用ツール:JIRA、Zoom
Zoomで拠点間をつなぎ、スプリントの状況をJIRAのバックログを見ながら報告とデモをしていきます。
AndroidやiPhone等の実機を使用してデモを行う場合は、他拠点のメンバーにも見えるように意識しましょう。
ふりかえり
・使用ツール:Slack、Zoom
ふりかえりはKPTで行っています。KPTは、Keep、Problem、Tryの略です。
Keepは良かったこと、続けたいこと、Problemは悪かったこと、問題だと感じていること、Tryは次に試したいことをあげます。
参考:ふりかえりガイド (外部サイト)
ロケーションが離れていない場合は、模造紙と付箋を利用してKPTを行っていました。
各々が付箋にKeepを書き、内容を共有、Problemを付箋に書き、共有…といった流れです。
ロケーションが離れている場合はSlackとZoomを用いることで実施が可能です。
後からの見返しやすさを考慮し、SlackにKPT用のチャンネルを用意します。
そしてKPT用チャンネルにKeep、Problem、Tryの順に各々上げていきます。
共感できるコメントがあればスタンプで反応します。
こうすることで発言が苦手な人もリアクションがとりやすくなります。
- SlackでのKPTの例
実装
CI
- 使用ツール:GitLab(GitLab CI)
GitLab CIを使って、開発者がコミットするごとに自動でビルドやテストを実施するようにしています。
Merge Requestを作成した際にもCIが自動で走るようになっており、
ビルドやテストが通らない状態かどうかがすぐにわかるため、レビュー時の余計な手間も減ります。
ロケーションが離れているからこそCIで常にソースコードのバグや問題を監視し、
別拠点の修正によって開発が進まなくなる等の余計なコミュニケーションコストを減らすことが大事になってきます。
成果物の共有
- 使用ツール:Nexus
プロジェクトで使用するライブラリや成果物をNexusを使って管理しています。
VPNで保護された環境にNexusを置くことで、ロケーションが離れていてもVPN経由で安全に成果物を共有できます。
レビュー
・使用ツール:GitLab(Merge Request)
レビューはGitLabのMerge Requestで実施します。
・例:Merge Request画面
レビューイはブランチを切ってソースコードを修正し、GitLabのMerge Requestを使用してレビュー依頼を出します。
レビューアはMerge Requestを確認して、指摘があればGitLab上にコメントを書きます。
GitLab上のみでレビューのやり取りが行えるため、レビューアとレビューイのロケーションが異なっていてもレビューを行えます。
・例:レビュー時のコメント
ドキュメンテーション
・使用ツール:GitLab(Wiki)
ドキュメントの共有はGitLabのWikiの機能を使用しています。
主に環境構築の手順やチームで共有したほうがよいノウハウなどを残しています。
ロケーションが離れていても、手順やドキュメントの連携をWikiのURLをSlackで伝えるだけで済むので便利です。
・例:Wiki画面
日々のコミュニケーション
・使用ツール:Slack、Zoom
コミュニケーション全般として、SlackとZoomを利用しています。
Slackは、チームのチャンネルや独り言チャンネルでコミュニケーションをとります。
「独り言チャンネル」とは、各メンバーに用意する自分専用のチャンネルです。 チャンネルはオープンにして誰もが見られるようにし、「これからやろうとしていること」や「やってみて感じたこと」、「難しくて詰まっているところ」などを不定期に書き込みます。
こうすることでロケーションが離れていても存在感が出せますし、「難しくて詰まっているところ」を素直に呟いてみると解決策を知っているメンバーが助け舟を出してくれたりします。
・例:独り言チャンネル
例:独り言チャンネルまた、ロケーションが離れているといつ出社/退社したかどうかがわからないため「勤怠チャンネル」を作り、出社/退社や休みの連絡をとるように工夫をしています。
- 例:勤怠チャンネル
Zoomは、スクラムイベントや簡易なミーティング、ペアプログラミングの際に使用します。
画面共有やビデオ通話、ホワイトボードの共有もできるため、ロケーションが離れていても円滑にコミュニケーションをとることができます。
本コンテンツはクリエイティブコモンズ(Creative Commons) 4.0 の「表示—継承」に準拠しています。