Slide 1

Slide 1 text

   ©hey, Inc 藤原 涼馬 ヘイ株式会社 プロダクト基盤本部 SRE STORES決済におけるEC2からECS Fargateへの移行 ~無停止要件も添えて〜

Slide 2

Slide 2 text

自己紹介 藤原 涼馬 ヘイ株式会社 プロダクト基盤本部 SRE (他にもいろいろ) 経歴  SIer R&D →      → 趣味  自動車の運転  模型製作  各種寄稿・登壇 好きなAWSサービス  ECS Fargate / AWS SSO + 他 今ここ

Slide 3

Slide 3 text

会社概要 会社名 ヘイ株式会社 設立 2012年3月23日 代表取締役社長 佐藤裕介 資本金 1億円 所在地 〒150-0011 東京都渋谷区東3丁目16番3号 エフ・ ニッセイ恵比寿ビル4階 事業内容 インターネットビジネスの企画・開発・ 運営

Slide 4

Slide 4 text

従業員数・職種比率 従業員数 350名 (2021/04 時点) エンジニア 31% セールス・ マーケ・事業開発 30% サポート・ サクセス 23% デザイナー 5.5% PM 2.8% コーポレート 8% エンジニア職の比率 31%

Slide 5

Slide 5 text

heyの事業 お店のデジタルを まるっとサポート。 個人や中小事業の方々に向けて、 お店のデジタル化をまるっと 実現できる価値を提供しています。

Slide 6

Slide 6 text

heyの事業 お店のデジタルを まるっとサポート。 個人や中小事業の方々に向けて、 お店のデジタル化をまるっと 実現できる価値を提供しています。 今回はこの プロダクトの話題です

Slide 7

Slide 7 text

本日話す内容 ● STORES決済では様々な改善を継続的に進めています ● 改善の一環として  Ruby on Rails実装からSpring Boot実装への切替  Elastic Beanstalk(EC2ベース)からECS Fargateへの切替 をまとめて進めています ● 切替が完全に完了したわけではありませんが、 方式の判断や判断の根拠となる考え方などを中心にお話しします (AWSのサービス除き、具体的にどんなツール使ってるかなどは末尾に紹介程度です。)

Slide 8

Slide 8 text

   ©hey, Inc やろうとしたこと

Slide 9

Slide 9 text

やろうとしたこと Elastic Beanstalk ECS on Fargate Ruby on Rails Spring Boot アプリケーション層 Ruby on Rails → Spring Boot インフラ層 Elastic Beanstalk(EC2) → ECS on Fargate

Slide 10

Slide 10 text

やろうとしたこと Elastic Beanstalk ECS on Fargate Ruby on Rails Spring Boot アプリケーション層 Ruby on Rails → Spring Boot インフラ層 Elastic Beanstalk(EC2) → ECS on Fargate

Slide 11

Slide 11 text

Ruby on Rails → Spring Boot 数年かけて徐々に進めてきた案件。 メインとなる処理部分の本格的な入れ替えのフェーズ Ruby on Rails Spring Boot アプリケーション層 Ruby on Rails → Spring Boot

Slide 12

Slide 12 text

やろうとしたこと Elastic Beanstalk ECS on Fargate Ruby on Rails Spring Boot アプリケーション層 Ruby on Rails → Spring Boot インフラ層 Elastic Beanstalk(EC2) → ECS on Fargate

Slide 13

Slide 13 text

Elastic Beanstalk(EC2) → ECS on Fargate ● 規模の拡大に伴い開発面で辛くなってきた(ある程度型にはめられた部分があるなど) ○ Beanstalkの知見者があまりいないという現実もある ○ 今後も要件が複雑化することはあってもシンプルになることはないので、 自由度を確保しつつ、管理しなければいけない部分を増やさずに維持したい ● 管理しなければいけない部分を少しでも減らすことでもっと注力すべきところ に注力したい Elastic Beanstalk ECS on Fargate インフラ層 Elastic Beanstalk(EC2) → ECS on Fargate

Slide 14

Slide 14 text

ポイント このような大きな構成要素の変更は大きなリスク(や不安)が伴います。 幸い以下のような点で恵まれていた部分はあります。 ● Ruby on Rails から Spring Bootへの切り替えは既定路線 (あとはHowの問題だった) ● 合わせてECS Fargateへの載せ替えも実施したかった

Slide 15

Slide 15 text

ポイント このような大きな構成要素の変更は大きなリスク(や不安)が伴います。 幸い以下のような点で恵まれていた部分はあります。 ● Ruby on Rails から Spring Bootへの切り替えは既定路線 (あとはHowの問題だった) ● 合わせてECS Fargateへの載せ替えも実施したかった 次のスライド以降では、 どうリスクを小さくしていくかという基本的な考え方と その中でどういう選択をしたのかを解説します。

Slide 16

Slide 16 text

   ©hey, Inc 移行に伴う 基本的な考え方

Slide 17

Slide 17 text

STORES決済の立ち位置 ● 実店舗でのキャッシュレス決済を担う ● ミッションクリティカルです ○ さまざまな業態の店舗の決済を担っている関係上、 原則として24/365での動作が期待されます

Slide 18

Slide 18 text

STORES決済の立ち位置 ● 実店舗でのキャッシュレス決済を担う ● ミッションクリティカルです ○ さまざまな業態の店舗の決済を担っている関係上、 原則として24/365での動作が期待されます

Slide 19

Slide 19 text

やろうとしたこと Elastic Beanstalk ECS on Fargate Ruby on Rails Spring Boot アプリケーション層 Ruby on Rails → Spring Boot インフラ層 Elastic Beanstalk(EC2) → ECS on Fargate いかにして安全に切り替えるかが重要になります

Slide 20

Slide 20 text

安全に切り替えるとは? 1. 切替先が正しく動作するように算段する

Slide 21

Slide 21 text

安全に切り替えるとは? 1. 切替先が正しく動作するように算段する ○ 自動テストを充実させる ○ QAによる各種探索テストを実施する アプリケーション実装の話

Slide 22

Slide 22 text

安全に切り替えるとは? 1. 切替先が正しく動作するように算段する ○ 自動テストを充実させる ○ QAによる各種探索テストを実施する 2. 問題が起きてもすぐに戻せるようにする アプリケーション実装の話

Slide 23

Slide 23 text

安全に切り替えるとは? 1. 切替先が正しく動作するように算段する ○ 自動テストを充実させる ○ QAによる各種探索テストを実施する 2. 問題が起きてもすぐに戻せるようにする ○ Point of No Return(PNR)を時間軸的に後ろに寄せる ○ データの修復やリカバリも含む(が、今回は対象外) アプリケーション実装の話

Slide 24

Slide 24 text

安全に切り替えるとは? 1. 切替先が正しく動作するように算段する ○ 自動テストを充実させる ○ QAによる各種探索テストを実施する 2. 問題が起きてもすぐに戻せるようにする ○ Point of No Return(PNR)を時間軸的に後ろに寄せる ○ データの修復やリカバリも含む(が、今回は対象外) アプリケーション実装の話 PNR スタート ゴール まだ戻れる もう戻れない PNR スタート ゴール まだ戻れる もう戻れない まだ戻れる まだ戻れる PNRが手前 = リスクが大きい状態 PNRが後ろ = リスクが小さい状態

Slide 25

Slide 25 text

安全に切り替えるとは? 1. 切替先が正しく動作するように算段する ○ 自動テストを充実させる ○ QAによる各種探索テストを実施する 2. 問題が起きてもすぐに戻せるようにする ○ Point of No Return(PNR)を時間軸的に後ろに寄せる ○ データの修復やリカバリも含む(が、今回は対象外) アプリケーション実装の話 PNR スタート ゴール まだ戻れる もう戻れない PNR スタート ゴール まだ戻れる もう戻れない まだ戻れる まだ戻れる PNRが手前 = リスクが大きい状態 PNRが後ろ = リスクが小さい状態 こちらをメインでお話します

Slide 26

Slide 26 text

   ©hey, Inc RoR実装から Spring Boot実装への切替

Slide 27

Slide 27 text

安全に切り替える方法 ローリングデプロイ 多数ある冗長化されたコンポーネントを徐々に入れ替える ブルーグリーンデプロイ 環境を2面用意し、一気に切り替える カナリアデプロイ パフォーマンスやエラーの発生をモニタリングしながら徐々に入れ替える https://speakerdeck.com/rtechkouhou/devopsdao-ru-zhi-nan-ji-ben-bian-26c1a9dc-d1a8-4b3a-b7f4-39cb241c5831 より抜粋

Slide 28

Slide 28 text

CloudFront distribution Beanstalk Environment Blue 改めて移行前の状態を見てみる 移行前の構成 Beanstalk Environment Green

Slide 29

Slide 29 text

CloudFront distribution Beanstalk Environment Blue 改めて移行前の状態を見てみる 移行前の構成 Beanstalk Environment Green シンプルかつ素朴な構成

Slide 30

Slide 30 text

CloudFront distribution Beanstalk Environment Blue 改めて移行前の状態を見てみる デプロイの流れを見てみます Beanstalk Environment Green 新しいバージョンをリリース

Slide 31

Slide 31 text

CloudFront distribution Beanstalk Environment Blue 改めて移行前の状態を見てみる デプロイの流れを見てみます Beanstalk Environment Green QA 別経路からQA実施

Slide 32

Slide 32 text

CloudFront distribution Beanstalk Environment Blue 改めて移行前の状態を見てみる デプロイの流れを見てみます Beanstalk Environment Green URLスワップで リクエストの方向を切り替え

Slide 33

Slide 33 text

CloudFront distribution Beanstalk Environment Blue 改めて移行前の状態を見てみる デプロイの流れを見てみます Beanstalk Environment Green URLスワップで リクエストの方向を切り替え 典型的なブルーグリーンデプロイ

Slide 34

Slide 34 text

安全に切り替える方法 ローリングデプロイ 多数ある冗長化されたコンポーネントを徐々に入れ替える ブルーグリーンデプロイ 環境を2面用意し、一気に切り替える カナリアデプロイ パフォーマンスやエラーの発生をモニタリングしながら徐々に入れ替える https://speakerdeck.com/rtechkouhou/devopsdao-ru-zhi-nan-ji-ben-bian-26c1a9dc-d1a8-4b3a-b7f4-39cb241c5831 より抜粋

Slide 35

Slide 35 text

この時点(切り替え前)のSpring Boot実装の状態 ● 機能的には動作するはず ● 今回デプロイする範囲がプロダクションの負荷に耐えられるかは未知数

Slide 36

Slide 36 text

この時点(切り替え前)のSpring Boot実装の状態 ● 機能的には動作するはず ● 今回デプロイする範囲がプロダクションの負荷に耐えられるかは未知数 本番と同等の負荷を流すことはその時点では、 構成上難しい(社外との連携もあるため)

Slide 37

Slide 37 text

安全に切り替える方法 ローリングデプロイ 多数ある冗長化されたコンポーネントを徐々に入れ替える ブルーグリーンデプロイ 環境を2面用意し、一気に切り替える カナリアデプロイ パフォーマンスやエラーの発生をモニタリングしながら徐々に入れ替える https://speakerdeck.com/rtechkouhou/devopsdao-ru-zhi-nan-ji-ben-bian-26c1a9dc-d1a8-4b3a-b7f4-39cb241c5831 より抜粋

Slide 38

Slide 38 text

安全に切り替える方法 ローリングデプロイ 多数ある冗長化されたコンポーネントを徐々に入れ替える ブルーグリーンデプロイ 環境を2面用意し、一気に切り替える カナリアデプロイ パフォーマンスやエラーの発生をモニタリングしながら徐々に入れ替える https://speakerdeck.com/rtechkouhou/devopsdao-ru-zhi-nan-ji-ben-bian-26c1a9dc-d1a8-4b3a-b7f4-39cb241c5831 より抜粋 ブルーグリーンデプロイとカナリアデプロイの両方 を組み合わせて利用

Slide 39

Slide 39 text

ECS on Fargate CloudFront distribution Beanstalk Environment Blue RoR, Spring Boot実装の並行運用の状態 切替中の構成 Beanstalk Environment Green ECS on Fargate

Slide 40

Slide 40 text

ECS on Fargate CloudFront distribution Beanstalk Environment Blue RoR, Spring Boot実装の並行運用の状態 RoR実装の修正、デプロイ、リリースを行う場合 Beanstalk Environment Green ECS on Fargate URLスワップをつかった B/Gデプロイ(先ほど説明)

Slide 41

Slide 41 text

ECS on Fargate CloudFront distribution Beanstalk Environment Blue RoR, Spring Boot実装の並行運用の状態 RoRの場合と似通ってますがもう少し具体的に解説 Beanstalk Environment Green ECS on Fargate CodeDeploy CodeDeploy をつかった B/Gデプロイ

Slide 42

Slide 42 text

ECS on Fargate CloudFront distribution Beanstalk Environment Blue RoR, Spring Boot実装の並行運用の状態 Beanstalk Environment Green ECS on Fargate CodeDeploy リクエストの流れていない 面にB/Gデプロイ 新ver

Slide 43

Slide 43 text

ECS on Fargate CloudFront distribution Beanstalk Environment Blue RoR, Spring Boot実装の並行運用の状態 Beanstalk Environment Green ECS on Fargate CodeDeploy 新ver QA 別経路からQA実施

Slide 44

Slide 44 text

ECS on Fargate CloudFront distribution Beanstalk Environment Blue RoR, Spring Boot実装の並行運用の状態 Beanstalk Environment Green ECS on Fargate CodeDeploy 新ver URLスワップで リクエストの方向を切り替え

Slide 45

Slide 45 text

ECS on Fargate CloudFront distribution Beanstalk Environment Blue RoR, Spring Boot実装の並行運用の状態 Beanstalk Environment Green ECS on Fargate 新ver 不具合の再現環境など として利用する

Slide 46

Slide 46 text

ECS on Fargate CloudFront distribution Beanstalk Environment Blue RoR, Spring Boot実装の並行運用の状態 Beanstalk Environment Green ECS on Fargate この仕組みでRoR実装とSpring Boot実装を独立かつ、 切り戻しも含めたデプロイとリリースが可能に

Slide 47

Slide 47 text

ECS on Fargate CloudFront distribution Beanstalk Environment Blue RoR, Spring Boot実装の並行運用の状態 Beanstalk Environment Green ECS on Fargate

Slide 48

Slide 48 text

ECS on Fargate CloudFront distribution Beanstalk Environment Blue RoR, Spring Boot実装の並行運用の状態 Beanstalk Environment Green ECS on Fargate 安全側に倒して、流量を厳密に制御したい

Slide 49

Slide 49 text

Spring Boot実装への 流量制御(カナリアリリース) もう少し詳細な図で説明 Listener Listener Rule Listener Rule Listener Rule RoR実装 (Elastic Beanstalk) Spring Boot実装 (ECS Fargate)

Slide 50

Slide 50 text

Spring Boot実装への 流量制御(カナリアリリース) もう少し詳細な図で説明 Listener Listener Rule Listener Rule Listener Rule RoR実装 (Elastic Beanstalk) Spring Boot実装 (ECS Fargate) ヘッダルーティングと、 加重ルーティングを使って Spring Boot実装への流量を制御 上記はほとんど切替後のものなので参考までに

Slide 51

Slide 51 text

Spring Boot実装への 流量制御(カナリアリリース) リソースの状況やエラー発生率などをモニタリングしながら Spring Boot実装への流量解放のスケジュールを設定

Slide 52

Slide 52 text

Spring Boot実装への 流量制御(カナリアリリース) リソースの状況やエラー発生率などをモニタリングしながら Spring Boot実装への流量解放のスケジュールを設定 数値に基づいてGo・Stop・Return判断をする

Slide 53

Slide 53 text

ここまでのまとめ ● Point of No Returnを可能 な限り後ろに倒しましょう ● 様々なデプロイ手法を駆使して リスクを最小にしましょう ● 数値(= 客観的事実)に基づいて Go・Stop・Returnの判断をしましょう

Slide 54

Slide 54 text

   ©hey, Inc もう少し具体的な 技術の話

Slide 55

Slide 55 text

もう少し具体的な技術や流れの話を解説 ● コンテナイメージのビルドをどうしているか? ● デプロイの流れをどうしているか?

Slide 56

Slide 56 text

もう少し具体的な技術や流れの話を解説 ● コンテナイメージのビルドをどうしているか? ● デプロイの流れをどうしているか?

Slide 57

Slide 57 text

コンテナイメージのビルドにおける大前提 ● Dockerfileは書きたくない ○ なんらアプリケーションコードとしては特別な事はしていないので Dockerfileの管理にパワーを費やしたくない

Slide 58

Slide 58 text

コンテナイメージのビルドにおけるツール選定 ● Dockerfileは書きたくない ○ なんらアプリケーションコードとしては特別な事はしていないので Dockerfileの管理にパワーを費やしたくない Spring Boot(Java)なので、 GoogleContainerTools/jib を利用 https://github.com/GoogleContainerTools/jib

Slide 59

Slide 59 text

コンテナイメージのビルドにおけるツール選定 ● Dockerfileは書きたくない ○ なんらアプリケーションコードとしては特別な事はしていないので Dockerfileの管理にパワーを費やしたくない Spring Boot(Java)なので、 GoogleContainerTools/jib を利用 https://github.com/GoogleContainerTools/jib Cloud Native Buildpacks https://buildpacks.io/ Openshift s2i https://github.com/openshift/source-to-image 他のDockerfileレスイメージビルドにおける選択肢 Java以外でDockerfileレスなイメージビルドするなら上記2つから選ぶ

Slide 60

Slide 60 text

もう少し具体的な技術や流れの話を解説 ● コンテナイメージのビルドをどうしているか? ● デプロイの流れをどうしているか?

Slide 61

Slide 61 text

デプロイの流れ ● GitHub Actionsを利用してデプロイ(既存と同様のサービスを利用) ○ リポジトリのタグを指定してデプロイする形 ○ コンテナイメージは、 別のGitHub Actionsワークフローでビルド & テスト済のイメージを利用します 主に使っているAWS関連のGitHubアクション ● aws-actions/configure-aws-credentials ● aws-actions/amazon-ecs-render-task-definition ● aws-actions/amazon-ecs-deploy-task-definition

Slide 62

Slide 62 text

技術的な部分についてのまとめ ● Dockerfileを管理しなくていいようにくらいのこだわりしかないです ● 攻めの部分についてはデプロイ全体の流れで攻め切ったため、 ツールの部分についてはチャレンジはあまりしていません。 強いて言うのであれば、 チャレンジする領域と保守的にする領域を明確に分けるようにする のはあとから振り返って効果を判断する上で重要そうです。

Slide 63

Slide 63 text

エンジニア大!大!大!募集中です https://hello.hey.jp/engineer

Slide 64

Slide 64 text

MORE INFO heyのオープンな社内報 hey note https://days.hey.jp/ Tech イベント hey connpass https://hey.connpass.com/ プロダクト開発の裏側を発信中 hey Product Blog https://tech.hey.jp/ heyのメディア hey MAGAZINE https://mag.hey.jp プロダクトのこと、技術のこと色々お話しましょう カジュアル面談 (Meety) https://meety.net/ heyのひとびとを伝える動画 hey People https://vimeo.com/heyinc

Slide 65

Slide 65 text

ご清聴ありがとうございました!