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

人気モバイルゲームの裏側で使われたコンテナ・ECSの知見 〜『あんさんぶるスターズ!!Music』における実装〜

人気モバイルゲームの裏側で使われたコンテナ・ECSの知見 〜『あんさんぶるスターズ!!Music』における実装〜

2020年7月29日開催された「夏のAWSコンテナ祭り with Amazon ECS」の登壇資料です。

https://aws.amazon.com/jp/about-aws/events/2020/doc1221/

ーーー
2020年3月15日にリリースいたしました人気モバイルゲーム『あんさんぶるスターズ!!Music』。本作のサーバーサイドは現在Amzon ECSで稼働しています。今回が初めての本格的なコンテナ・ECSの導入ということもあり、つまづくことも多かったですが、構築・運用の過程で多くの知見・ノウハウを得ることができました。今回はその一部をご紹介いたします。
ーーー

Hiroshi SUMI

July 29, 2020
Tweet

More Decks by Hiroshi SUMI

Other Decks in Technology

Transcript

  1. ⾃⼰紹介 • 鷲⾒啓志(すみひろし) • 2019年1⽉よりHappy Elements株式会社 に勤務 • インフラグループのリーダー・インフラエンジニア •

    複数のゲームタイトルのインフラの運⽤と導⼊⽀援 • 前職ではゲームディレクター・ゲームプロデューサー • 趣味は⾃転⾞ • 休⽇は⼤阪の北摂の⼭の中でもがいています • AWS利⽤歴は10年(2010~) • 好きなAWSサービス︓Aurora ©Happy Elements K.K 5
  2. Happy Elements株式会社 北京を拠点にアジア圏でゲームサービスを展開する「Happy Elementsグ ループ」の⽇本⼦会社。⽇本市場に向けたオリジナルゲームの開発・運営 を⾏う。 Happy Elements? 7 ©Happy

    Elements K.K 設⽴ ︓2010年 4⽉ 代表取締役︓新井元基 所在地 ︓京都府京都市下京区⽴売⻄町82 京都恒和ビル6F 従業員 ︓社員数︓228名 学⽣アルバイト12名(2020年6⽉現在) 平均年齢 ︓30歳(2020年6⽉現在) 資本⾦ ︓5,000万円
  3. 既存タイトルと新タイトルについて ©Happy Elements K.K 10 既存タイトル 「あんさんぶるスターズ︕」 (2015/04~2020/03) 新章「あんさんぶるスターズ︕︕」 (2020/03~)

    「あんさんぶるスターズ︕︕Basic」 既存タイトルのリニューアル 従来のプレイスタイル 共通のストーリー/イラストで遊べる︕ 「あんさんぶるスターズ︕︕Music」 新作ゲーム 新しいリズムゲームスタイル ⼤型アップデート
  4. あんさんぶるスターズ︕︕Music ©Happy Elements K.K 12 2020年3⽉15⽇リリース 事前登録者数︓70万⼈ リリース当⽇のDL数︓140万件 出典︓Twitter上のゲームに関する会話の盛り上がり (Twitter社ブログ)

    https://blog.twitter.com/ja_jp/topics/company/2020/April_gaming_on_Twitter.html 2020年4⽉10⽇にTwitter社のブログで公開 された記事では、世界中で今年もっともツ イートされたゲームのTop10にいれていただ きました。
  5. あんさんぶるスターズ︕! Musicの技術構成 ©Happy Elements K.K 14 クライアント サーバーサイド(API) その他ツール CloudFront

    S3 アセット配信/Web ECS EC2 Aurora ElastiCache ALB CodeBuild CodeDeploy Amazon Linux 2 (ECS Optimized) ECR CloudWatch Logs CloudFront
  6. 1. ECRリポジトリの運⽤ Dockerイメージ = デプロイ対象物 latest以外にもう少し情報が欲しい • どのコードベースで動いているのか︖ • 現在稼働しているイメージはどれか︖

    • 前回稼働していたイメージはどれか︖ • いつリリース(デプロイ)されたものか︖ ©Happy Elements K.K 21 → コミットIDタグ → current タグ → old タグ → release⽇時タグ
  7. 1. ECRリポジトリの運⽤ latestタグ • 現在ECRに登録されている最新のイメージを指す • ${environment_name}_latest • ex.) prod_latest

    • ⽤途 • ビルドは正常終了したが、デプロイが失敗したようなときに、 再デプロイすべきイメージをすぐに把握できる • 最新のイメージがデプロイされているとは限らない ©Happy Elements K.K 22
  8. 1. ECRリポジトリの運⽤ コミットIDタグ • GitのコミットIDの先頭7桁をタ グとして付与 • GitHubをみればどのコードが動 いているのか把握可能 •

    ⽤途 • エラー発⽣時の追跡調査 ©Happy Elements K.K 23 例)GitHubのKubernetesのCommits画⾯ コミットIDの先頭7桁が表⽰されておりそ の詳細にリンクしている
  9. 1. ECRリポジトリの運⽤ currentタグ • 現在ECSクラスター上にデプロイされているイメージを指す • ${environment_name}_current • ex.) prod_current

    • ⽤途 • 現在稼働中のイメージを把握しやすくする • エラーの追跡調査 • 次回デプロイ時のoldへの切り替えの参照 ©Happy Elements K.K 24
  10. 1. ECRリポジトリの運⽤ release⽇時タグ • デプロイされた⽇時分をタグとして付与 • ${environment_name}_release_YYYYYMMDDhhmm • ex.) prod_release_202007021902

    • ⽤途 • どの時期にどのイメージが動いていたかの把握 • 追跡調査の参考に ©Happy Elements K.K 26
  11. 1. ECRリポジトリの運⽤ ©Happy Elements K.K 27 1つ前のデプロイイメージ 現在のデプロイイメージ oldタグ currentタグ

    latestタグ release⽇時(20207021212) release⽇時( 202007011000) コミットIDタグ(34cd56e) コミットIDタグ(12ab34d) ※ビルド&デプロイ実施前
  12. 1. ECRリポジトリの運⽤ ©Happy Elements K.K 28 1つ前のデプロイイメージ 現在のデプロイイメージ oldタグ currentタグ

    release⽇時(20207021212) release⽇時(202007011000) コミットIDタグ(34cd56e) コミットIDタグ(12ab34d) 新しいイメージ(ビルド完了) latestタグ ※ビルド完了、デプロイ実施前 新しいイメージのビルドが完了すると
  13. 1. ECRリポジトリの運⽤ ©Happy Elements K.K 29 1つ前のデプロイイメージ 現在のデプロイイメージ oldタグ currentタグ

    release⽇時(20207021212) release⽇時(202007011000) コミットIDタグ(34cd56e) コミットIDタグ(12ab34d) 新しいイメージ(ビルド完了) latestタグ コミットIDタグ(56ef78g) ※ビルド完了、デプロイ実施前 コミットIDタグを付与し、
  14. 1. ECRリポジトリの運⽤ ©Happy Elements K.K 30 1つ前のデプロイイメージ 現在のデプロイイメージ oldタグ currentタグ

    release⽇時(20207021212) release⽇時(202007011000) コミットIDタグ(34cd56e) コミットIDタグ(12ab34d) 新しいイメージ(ビルド完了) コミットIDタグ(56ef78g) latestタグ ※ビルド完了、デプロイ実施前 現在のデプロイイメージから latestタグを付け替える
  15. 1. ECRリポジトリの運⽤ ©Happy Elements K.K 31 1つ前のデプロイイメージ 現在のデプロイイメージ oldタグ currentタグ

    release⽇時(20207021212) release⽇時(202007011000) コミットIDタグ(34cd56e) コミットIDタグ(12ab34d) 新しいイメージ(デプロイ後) コミットIDタグ(56ef78g) latestタグ ※デプロイ完了 デプロイが完了すると
  16. 1. ECRリポジトリの運⽤ ©Happy Elements K.K 32 1つ前のデプロイイメージ 現在のデプロイイメージ oldタグ release⽇時(20207021212)

    release⽇時(202007011000) コミットIDタグ(34cd56e) コミットIDタグ(12ab34d) 新しいイメージ(デプロイ後) コミットIDタグ(56ef78g) latestタグ currentタグ ※デプロイ完了 デプロイしたイメージに1つ前の イメージからcurrentタグを付け替え
  17. 1. ECRリポジトリの運⽤ ©Happy Elements K.K 33 1つ前のデプロイイメージ 現在のデプロイイメージ currentタグ release⽇時(20207021212)

    release⽇時(202007011000) コミットIDタグ(34cd56e) コミットIDタグ(12ab34d) 新しいイメージ(デプロイ後) コミットIDタグ(56ef78g) latestタグ currentタグ oldタグ ※デプロイ完了 1つ前のイメージにはもう⼀つ前の イメージからoldタグを付け替え
  18. 1. ECRリポジトリの運⽤ ©Happy Elements K.K 34 1つ前のデプロイイメージ 現在のデプロイイメージ currentタグ release⽇時(20207021212)

    release⽇時(202007011000) コミットIDタグ(34cd56e) コミットIDタグ(12ab34d) 新しいイメージ(デプロイ後) コミットIDタグ(56ef78g) latestタグ currentタグ release⽇時(20207291540) oldタグ ※デプロイ完了 最後にリリース⽇時タグを付与したら
  19. 1. ECRリポジトリの運⽤ ©Happy Elements K.K 35 1つ前のデプロイイメージ 現在のデプロイイメージ currentタグ release⽇時(20207021212)

    release⽇時(202007011000) コミットIDタグ(34cd56e) コミットIDタグ(12ab34d) 新しいイメージ(デプロイ後) コミットIDタグ(56ef78g) latestタグ currentタグ release⽇時(20207291540) oldタグ 2つ前のデプロイイメージ 1つ前のデプロイイメージ 現在のデプロイイメージ ※デプロイ完了 タグの付替完了︕
  20. 1. ECRリポジトリの運⽤ ©Happy Elements K.K 37 ECSのタスク定義 • デプロイのたびにECSのタスク定義を更新 •

    コンテナ定義のimageでリポジトリURLを指定 • コミットIDタグを利⽤したURLに置換 • ${account_id}.dkr.ecr.ap-northeast- 1.amazonaws.com/${repository_name}:${commit_id_tag} • 確実に該当コミットIDのイメージをデプロイする • 指定したURLが必ず⼀つのイメージを指すように • latestだけだと何がデプロイされているかは分かりづらい • イメージキャッシュの副作⽤の可能性
  21. 1. ECRリポジトリの運⽤ タグの運⽤でイメージに情報付与し、 把握しやすく効率的な運⽤を⽬指す • 最新のイメージはどれか︖ • どのコードベースで動いているのか︖ • 現在稼働しているイメージはどれか︖

    • 前回稼働していたイメージはどれか︖ • いつリリース(デプロイ)されたものか︖ ©Happy Elements K.K 38 → コミットIDタグ → current タグ → old タグ → release⽇時タグ → latestタグ
  22. 2. タスク実⾏・バッチ処理 今回のアプリケーションは Ruby on Rails で稼働 rakeをつかっていろいろなタスクを実⾏ • マイグレーション

    • ActiveRecordの構造にあわせてデータベースの構造を変更 • テーブル作成・カラム追加 etc. • マスタデータのロード • 必要となるゲームのマスタデータの投⼊ • ユーザーデータのロード • 不具合のアイテム補填データの投⼊ ©Happy Elements K.K 40
  23. 2. タスク実⾏・バッチ処理 案1. ECSインスタンスで実⾏ • ECSインスタンス上にはRuby on Railsの環境がない • ECSインスタンス上にはソースコードがない

    • 環境構築して、Gitからソースコードをもってくればできなくは ないが、⼿間暇がかかりすぎるので不採⽤ • コンテナの可搬性活かせない • ECSインスタンスの環境も管理が必要 ©Happy Elements K.K 43
  24. 2. タスク実⾏・バッチ処理 案2. ECSインスタンスで動くコンテナに⼊って実⾏する • ECSインスタンスから稼働中のコンテナに⼊る • docker exec –it

    ${container_id} /bin/bash • タスクの実⾏⾃体は可能 • ただし、ログがlogdriverで指定した先に出⼒されない • 稼働中のコンテナに負荷がかかる • デメリットも多いので不採⽤ ©Happy Elements K.K 44
  25. 2. タスク実⾏・バッチ処理 案3. ECSのタスクをワンショットで起動する • ECSのRun Taskでタスク実⾏ • コンテナにrakeタスクのコマンドを渡す •

    rakeタスクの実⾏が完了するとコンテナとECSタスクは終了する • ログも指定したlogdriverに送信される ©Happy Elements K.K 45 マネージメントコンソールの タスク定義から、もしくは、 AWS CLIで「aws ecs run-task」を実⾏
  26. 2. タスク実⾏・バッチ処理 案2. ECSのタスクのスケジューリング機能を利⽤する • ECSの機能でタスクの実⾏をスケジューリングできる • cronライクな設定が可能 • CloudWach

    Eventsを利⽤ • 1回のイベントで複数回起動される可能性がある • 重複実⾏の副作⽤の懸念があり今回は⾒送り ©Happy Elements K.K 49
  27. 2. タスク実⾏・バッチ処理 ECSでのタスク実⾏とFargate • ワンショットのタスクであればFargateとの相性はとても良い • 最初は利⽤していたが、エラーが発⽣するようになりEC2に変更 • Railsで利⽤するライブラリ側のバグの問題 •

    sassc-rubyのバグ • Fargateで確率でエラーが発⽣ • 割り当てられているリソース・世代の問題か • Fargateはリソースの指定ができない ©Happy Elements K.K 52 AWS Fargate
  28. 2. タスク実⾏・バッチ処理 Ruby on Rails のrakeタスクやバッチ処理 • タスク実⾏ • ECSのタスクをワンショットで実⾏

    • バッチ処理 • Jenkinsの定期実⾏でCLIを使ってECSのタスクを実⾏ ©Happy Elements K.K 53
  29. 1. タスク調査 ©Happy Elements K.K 59 タスクの 状態は Pendingにならない 起動した形跡がない

    Pendingから RunningにならずStop タスクの 起動時間 Runningになった後 すぐ停⽌ Pendingのまま すすまない Runningになった後 しばらくして停⽌ タスクが 起動するか︖ サービスの イベント⼀覧の メッセージ タスクの詳細から コンテナの 状況の理由 Dockerデーモン ECS Agent プロセス インスタンスの 状況確認 コンテナのログ確認 タスクの詳細から タスクの停⽌理由 (ELB HealthCheck) 起動する 起動しない ECS初⼼者向け調査フロー
  30. タスクが起動しない 3.タスクが Pending のまま進まない 滅多に発⽣しないが、想定されるケースは • ECSインスタンスの異常 • コンテナインスタンスにログインできるか確認 •

    Dockerデーモンの異常 • Dockerのプロセスの状況確認 • ECSコンテナエージェントの異常 • ECSエージェントのプロセスの状況確認 ©Happy Elements K.K 67
  31. 1. タスクの調査 ©Happy Elements K.K 72 タスクの 状態は Pendingにならない 起動した形跡がない

    Pendingから RunningにならずStop タスクの 起動時間 Runningになった後 すぐ停⽌ Pendingのまま すすまない Runningになった後 しばらくして停⽌ タスクが 起動するか︖ サービスの イベント⼀覧の メッセージ タスクの詳細から コンテナの 状況の理由 Dockerデーモン ECS Agent プロセス インスタンスの 状況確認 コンテナのログ確認 タスクの詳細から タスクの停⽌理由 (ELB HealthCheck) 起動する 起動しない ECS初⼼者向け調査フロー
  32. 2. キャパシティ設計 ©Happy Elements K.K 74 Amazon ECSとEC2起動タイプを選択した場合、Amazon EC2を含 め各種リソースのキャパシティを検討する必要がある

    タスクあたりのコンテナ数をいくつにするか︖ コンテナあたりのCPU・メモリの割当をいくつにするか︖ インスタンスのイン スタンスファミ リー・サイズ・台数 をどうするか︖ インスタンスあたり のタスク数をいくつ にするか︖
  33. ECSの実装に当たり意識して⼯夫した点 1. ECRリポジトリの運⽤ • タグの運⽤でイメージに欲しい情報を付与 • タスク定義でコミットIDタグを使い必ず1つのイメージを指す 2. タスク実⾏・バッチ処理 •

    タスク実⾏はECSのタスクをワンショットで実⾏ • バッチ処理はJenkinsの定期実⾏でECSタスクを実⾏ • Fargateと相性は良いが、今回は⾒送り ©Happy Elements K.K 79
  34. ECSの実装で困った点 1. タスクの調査 • ECS初⼼者向け調査フローを参照 • タスクが起動するか︖タスクの状態は︖起動時間は︖ • 問題を切り分けて適切な場所を参照する 2.

    キャパシティ設計 • パフォーマンス測定して最適な組み合わせを探る • 詳細はAWS Summit Onlineで︕ ©Happy Elements K.K 80
  35. 82 Happy Elements株式会社では、 ⼀緒に働いてくれるメンバーを募集中です︕ ˔ インフラエンジニア ˔ プログラマー(アプリ) ˔ プログラマー(サーバーサイド)

    ˔ etc... 熱狂的に愛されるコンテンツを、 私達と⼀緒につくりたい熱意のある⽅、 ぜひご応募お待ちしております︕ (詳しい内容については、採⽤サイトをご確認ください) https://www.happyelements.co.jp/recruit/ 積極採⽤中の職種 ©Happy Elements K.K