Upgrade to Pro — share decks privately, control downloads, hide ads and more …

STORES決済におけるEC2からECS Fargateへの移行〜無停止要件も添えて〜

STORES決済におけるEC2からECS Fargateへの移行〜無停止要件も添えて〜

AWS Startup Tech Meetup Online #11
https://aws-startup-community.connpass.com/event/237573/
の登壇資料です。

Ryoma Fujiwara

March 08, 2022
Tweet

More Decks by Ryoma Fujiwara

Other Decks in Programming

Transcript

  1. 自己紹介 藤原 涼馬 ヘイ株式会社 プロダクト基盤本部 SRE (他にもいろいろ) 経歴  SIer R&D

    →      → 趣味  自動車の運転  模型製作  各種寄稿・登壇 好きなAWSサービス  ECS Fargate / AWS SSO + 他 今ここ
  2. 会社概要 会社名 ヘイ株式会社 設立 2012年3月23日 代表取締役社長 佐藤裕介 資本金 1億円 所在地

    〒150-0011 東京都渋谷区東3丁目16番3号 エフ・ ニッセイ恵比寿ビル4階 事業内容 インターネットビジネスの企画・開発・ 運営
  3. 従業員数・職種比率 従業員数 350名 (2021/04 時点) エンジニア 31% セールス・ マーケ・事業開発 30%

    サポート・ サクセス 23% デザイナー 5.5% PM 2.8% コーポレート 8% エンジニア職の比率 31%
  4. 本日話す内容 • STORES決済では様々な改善を継続的に進めています • 改善の一環として  Ruby on Rails実装からSpring Boot実装への切替  Elastic

    Beanstalk(EC2ベース)からECS Fargateへの切替 をまとめて進めています • 切替が完全に完了したわけではありませんが、 方式の判断や判断の根拠となる考え方などを中心にお話しします (AWSのサービス除き、具体的にどんなツール使ってるかなどは末尾に紹介程度です。)
  5. やろうとしたこと Elastic Beanstalk ECS on Fargate Ruby on Rails Spring

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

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

    Boot アプリケーション層 Ruby on Rails → Spring Boot インフラ層 Elastic Beanstalk(EC2) → ECS on Fargate
  8. Elastic Beanstalk(EC2) → ECS on Fargate • 規模の拡大に伴い開発面で辛くなってきた(ある程度型にはめられた部分があるなど) ◦ Beanstalkの知見者があまりいないという現実もある

    ◦ 今後も要件が複雑化することはあってもシンプルになることはないので、 自由度を確保しつつ、管理しなければいけない部分を増やさずに維持したい • 管理しなければいけない部分を少しでも減らすことでもっと注力すべきところ に注力したい Elastic Beanstalk ECS on Fargate インフラ層 Elastic Beanstalk(EC2) → ECS on Fargate
  9. ポイント このような大きな構成要素の変更は大きなリスク(や不安)が伴います。 幸い以下のような点で恵まれていた部分はあります。 • Ruby on Rails から Spring Bootへの切り替えは既定路線

    (あとはHowの問題だった) • 合わせてECS Fargateへの載せ替えも実施したかった 次のスライド以降では、 どうリスクを小さくしていくかという基本的な考え方と その中でどういう選択をしたのかを解説します。
  10. やろうとしたこと Elastic Beanstalk ECS on Fargate Ruby on Rails Spring

    Boot アプリケーション層 Ruby on Rails → Spring Boot インフラ層 Elastic Beanstalk(EC2) → ECS on Fargate いかにして安全に切り替えるかが重要になります
  11. 安全に切り替えるとは? 1. 切替先が正しく動作するように算段する ◦ 自動テストを充実させる ◦ QAによる各種探索テストを実施する 2. 問題が起きてもすぐに戻せるようにする ◦

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

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

    Point of No Return(PNR)を時間軸的に後ろに寄せる ◦ データの修復やリカバリも含む(が、今回は対象外) アプリケーション実装の話 PNR スタート ゴール まだ戻れる もう戻れない PNR スタート ゴール まだ戻れる もう戻れない まだ戻れる まだ戻れる PNRが手前 = リスクが大きい状態 PNRが後ろ = リスクが小さい状態 こちらをメインでお話します
  14. ECS on Fargate CloudFront distribution Beanstalk Environment Blue RoR, Spring

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

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

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

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

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

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

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

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

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

    Boot実装の並行運用の状態 Beanstalk Environment Green ECS on Fargate 安全側に倒して、流量を厳密に制御したい
  24. Spring Boot実装への 流量制御(カナリアリリース) もう少し詳細な図で説明 Listener Listener Rule Listener Rule Listener

    Rule RoR実装 (Elastic Beanstalk) Spring Boot実装 (ECS Fargate) ヘッダルーティングと、 加重ルーティングを使って Spring Boot実装への流量を制御 上記はほとんど切替後のものなので参考までに
  25. コンテナイメージのビルドにおけるツール選定 • 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つから選ぶ
  26. デプロイの流れ • 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
  27. 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