こんにちは。SmartHR SRE チームの吉成です。
先日、KARTE や Shopping Tribe を運用されている 株式会社プレイド さんと一緒に、【KUFU×プレイド】Tech Meetup ~Docker編~というイベントを開催しました。 「ECS を使って PR ごとに検証環境を用意した話」というテーマのもと、Docker と AWS を使って誰でも簡単に動作確認のできる環境の作り方を紹介しました。
プレイドさんも記事を書かれていますので、合わせてお読みください!
【KUFU×プレイド】Tech Meetup ~Docker編~を開催しました!
背景
当初、新しい機能の動作を確認できる環境は Staging 環境 1台のみでした。そのため、並行的に開発されている機能を開発者以外は同時に検証できませんでした。そこで、Docker と AWS を使って GitHub のプルリクエストごとに検証環境を用意できないかと考えたのが今回の発端です。 PR ごとに検証環境が用意され、細かい単位での検証ができるようになれば、不具合の特定や改修も簡単になるので、開発速度の向上と品質の向上が同時に達成できそうです!
概要
プルリクエストごとに Docker Image を作成し、そのイメージを ECR (EC2 Container Registry) に保存、ECS (EC2 Container Service) を使って AWS 上で起動する方法を取りました。 SmartHR ではサブドメインによってお客様の環境を提供しているため、各環境へのアクセスはサブドメインではなく、ポート番号を使って割り振るようにしました。ポート番号でのアクセス振り分けには ALB (Application Load Balancer) を用いています。 ECS で立ち上げたインスタンスには、検証用の SmartHR イメージだけではなく、MySQL、Redis など、SmartHR の動作に必要なものを一通り含めており、外部の DB や他環境との競合を出来る限り避けられるものにしてあります。
システム構成図
実際の構成図を下記に示します。
- 開発者が GitHub でプルリクエストを作成します
- CircleCI がテストと Docker Image のビルドを行います
- ECR にイメージを保存します
- ECS のクラスタおよび EC2 インスタンスを作成します
- VPC のインバウンドポートを開放します
- ALB に該当ポートに対するリスナーと、そのポートに紐づくターゲットグループを設定します
- 環境の構築が終わると Slack および GitHub に通知されます
ユーザからのアクセス
ユーザからのアクセスは下記のような流れで割り振られます。
- Route53 が検証用のドメインを判定し VPC を割り振ります
- ALB がポート番号によってインスタンスを割り振ります
- 検証用の SmartHR、MySQL、Redis は各インスタンス内でのみ相互にアクセスします
発表資料
その他、詳細な点はコチラの発表資料をご確認ください。
【2023/05/19 追記】 発表資料ですが、諸事情によりアカウントごと削除されてしまったようです 😇
また、資料の内容自体も古く、現在は GCP 環境を利用しております。新しい記事( GCPを使ってPRごとに検証環境を用意した話 )もありますので、今後はそちらを参照ください。
さいごに
KUFU では Docker や AWS を使って開発・運用方法を共にカイゼンしてくれる人材を募集しています! ご興味のある方は、以下のリンクよりお気軽にご連絡ください。
引き続き、SmartHR をよろしくお願い致します。