9.4K Views
November 13, 25
スライド概要
この講演では、株式会社キッズスターのウェブサービスのアーキテクチャを Azure Container Apps を軸にしながら解説しています。
- CTO at KidsStar Inc. - Unity Ambassador - Microsoft MVP for Developer Technologies - Unity 〇〇完全に理解した勉強会 主催 - 「Unity バイブル」シリーズ執筆
2025/11/13 第56回 Tokyo Jazug Night at 日本マイクロソフト Azure 1年生が C#大統一なウェブサービスを 半年でリリースしたお話 - はじめての Container Apps 株式会社キッズスター CTO 森 哲哉
こんばんは! 2
アジェンダ おしながき •はじめに •サービス概要と C# 大統一理論 •UniLinks のインフラアーキテクチャ •ハマった落とし穴 •まとめ 3
はじめに 4
はじめに 自己紹介 •Job: CTO at KidsStar Inc. •Tw, Gh: @monry •a.k.a. もんりぃ先生 •Microsoft MVP for Developer Technologies •Unity Ambassador •Unity 〇〇完全に理解した勉強会 主催 •C# 大統一理論推進委員会 野良会員 •東京情報デザイン専門職大学 非常勤講師 5
はじめに 資料・動画 撮影 🙆 (シャッター音 🙅) スライド共有 🙆 アーカイブ動画 🙆 6
はじめに 今日お話しすること •Azure Container Apps を軸にした ウェブサービスのアーキテクチャ •Container Registry Tasks も少し •C# 大統一理論 •CDKTF/デプロイまわり 7
はじめに 今日お話ししないこと •アーキテクチャ選定に関する詳細 •認可・認証まわり •DeepLink の実装詳細 •Terraform のアレコレ 8
はじめに おことわり(予防線) •私の MSMVP カテゴリは Developer Technologies (しかも Unity メイン)なので、Azure は専門外です •よって、アーキテクチャ的に至らない点も多いかと思われます (マサカリは優しく投げてください) •「こんな構成で作ってみたよ」の共有だと思ってください🙇 •今回お話しする構成の一部に C# 以外の言語も含みます 9
サービス概要と C# 大統一理論 10
サービス概要と C# 大統一理論 株式会社キッズスター •子どもの“夢中”を育て、応援する •2014年創業、2024年9月東証グロース市場上場 •後述する「ごっこランド」を軸に、子ども向けのモバイルアプリを展開 •過去には Kinect V2 を使ったプロダクトも開発 •ごっこランドの海外版 GokkoWorld をローンチし、ベトナム支社 をハブにして東南アジア圏を中心に事業を拡大中 11
サービス概要と C# 大統一理論 ごっこランド •株式会社キッズスターが運営する社会体験アプリ •ゲームを通じて90社以上の実在企業のお仕事を体験 •対象ユーザ:未就学児〜小学校低学年 •累計800万DL(2025年11月時点) •月間プレイ回数2,000万回以上 12
サービス概要 ごっこランド •クライアント企業に訴求ポイントなどをヒアリングし 1から Unity で開発したゲームコンテンツを パビリオンと呼ぶ 13
サービス概要と C# 大統一理論 ごっこランド •各企業の SNS や店頭ポップや商品パッケージなど からパビリオンを直接起動可能 •コンテンツが遊ばれた回数や 遊び終わりに表示される広告の 表示・タップ回数とともに 起動回数もクライアントに報告 14
➡︎ サービス概要と C# 大統一理論 URL からのアプリ起動 •これまでは Firebase DynamicLinks を利用していた •DynamicLinks は2025年8月25日を以てサービス終了😇 •代替サービスを使う or 自前で開発する •代替サービスを使う場合、新たに広告SDK的なものを入れる必要あり •子ども向けアプリは広告SDKを入れるとリジェクトされるおそれがある • 良い機会なので自前で作ろう! 15
サービス概要と C# 大統一理論 URL からのアプリ起動 •以下の要件のサービスを UniLinks と名付けて開発 1. UniversalLinks (iOS) / AppLinks (Android) を用いた DeepLink が行える •未インストール:AppStore / Google Play •インストール済:アプリを起動してコンテンツを表示 2. 短縮 URL としてリダイレクトを行える 3. 遷移回数などを計測できる 16
サービス概要と C# 大統一理論 C# 大統一理論 is 何? •ざっくり「サーバサイドもフロントエンドもゲームも 全部 C# で書くと幸せになれるよね」といった考え方 •Cysharp 社 CEO/CTO で Microsoft MVP の Yoshifumi Kawai さん (@neuecc さん) が提唱 •一方的に師匠と崇めています🤩 17
サービス概要と C# 大統一理論 C# 大統一理論 is 何? 例えば、クライアント サーバの通信に於ける通信規約に • ついても C# の型そのものが Contracts になるので JSON やら XML やらのスキーマ定義が不要 •例えば、Unity を使えるゲームエンジニアが サーバサイドのコードを読み書きしたり、インフラや ビルド基盤のコードを読み書きする際の学習コストが低い ↔︎ 18
サービス概要と C# 大統一理論 UniLinks での C# 大統一 •ASP.NET Core •登録済の遷移先にリダイレクト •遷移先がアプリである場合のクッションページ •MagicOnion (gRPC) •アプリ起動時の DeepLink URL から表示するコンテンツを問い合わせ •Deferred DeepLink の有無を問い合わせ 19
サービス概要と C# 大統一理論 UniLinks での C# 大統一 • Worker Service •EntityFramework Core のマイグレーション •一部の集計を行うバッチ •CDKTF (Cloud Development Kit for Terraform) •IaC としてほぼ全てのリソースをデプロイ •.NET Aspire •ローカル開発や運用環境での Service Discovery など 20
UniLinks のインフラアーキテクチャ 21
UniLinks のインフラアーキテクチャ UniLinks のインフラアーキテクチャ •アプリケーションは Container Apps に展開 •データベースは Azure SQL Server / SQL Database •コンテナイメージは Container Registry Tasks でビルド •KeyVault や AppCon guration も利用 •通信は可能な限り Private に fi •社内ネットワークからは自由に繋げるようにもする 22
UniLinks のインフラアーキテクチャ Container Apps Private Container Apps Environment Public Container Apps Environment gRPC HTTP SQL Database gRPC ASP.NET Core Browser MagicOnion Server App Con guration gRPC Unity App SQL Server MagicOnion Server Worker Service fi KeyVault 23
UniLinks のインフラアーキテクチャ Container Apps •Unity App からアプリ起動時 URL に対応する DeepLink URL を問い合わせるための API サーバ (MagicOnion Server) •アプリ未インストールユーザのためのクッションページ表示、 .well-known/ 以下の静的ファイル配信、リダイレクトを行う WebApp (ASP.NET Core) •URL を登録するための管理コンソール (ASP.NET Core) •DB や Cache サーバと直接対話する窓口 (MagicOnion Server) 24
UniLinks のインフラアーキテクチャ Container Apps •ブラウザや Unity App から直接接続されるエンドポイントを持つコンテナを Public Network Access が有効な Environment に配置 •Custom Domain を有効にして個々の ACA に対して CNAME を張る (Custom Domain Suf x は未使用) •Managed Certi cates を作成し、SNI SSL としてバインド •内部ネットワークを有効にした Environment に SQL Database や Redis for Cache などとの対話機能を持ったコンテナを配置 fi fi •Public な CAE に配置した ACA から gRPC を用いて Internal に通信 25
UniLinks のインフラアーキテクチャ Container Apps •Public gRPC サーバと Unity App との通信を暗号化 •MessagePack で難読化されているとはいえ、読める 人には読める •サーバから公開鍵もらって、セッション共通鍵を渡す方式 •MagicOnion の Serializer を拡張 26
UniLinks のインフラアーキテクチャ Container Registry Tasks Container Registry Fetch Push Pull GitHub Build Task KeyVault Container Apps Run GitHub Actions 27
UniLinks のインフラアーキテクチャ Container Registry Tasks •Container Apps に展開するコンテナイメージをビルド •Container Apps 毎に Task を構築 •Encoded Step として YAML な文字列を食わせる •Private な NuGet Registry を使っている場合は Credentials を Volume Mount 経由で渡す •KeyVault の Resource ID を渡すのが良さそう 28
UniLinks のインフラアーキテクチャ
Container Registry Tasks
m
i
m
i
m
$$$"""
version: v1.0.0
secrets:
- id: nuget_package_source_credentials
keyvault: {{{vaultSecretNuGetPackageSourceCredentials.Id}}}
volumes:
- name: build_secrets
secret:
nuget_package_source_credentials: {{.Secrets.nuget_package_source_credentials | b64enc}}
steps:
- build: >-t {{{registry.LoginServer}}}/unilinks.{{{name}}}:{{.Values.docker_ age_tag}}
-f config/dockerfiles/Dockerfile.{{{name}}}
--secret id=nuget_package_source_credentials,src=/opt/run/secrets/nuget_package_source_credentials
.
volumeMounts:
- name: build_secrets
ountPath: /opt/run/secrets
env:
- DOCKER_BUILDKIT=1
- push:
- {{{registry.LoginServer}}}/unilinks.{{{name}}}:{{.Values.docker_ age_tag}}
"""
29
UniLinks のインフラアーキテクチャ Private Network UniLinks VNet Of ce VNet Private Endpoints Subnet Cloud are Tunnel Subnet … cae private appcs sqldb … appcs sqldb 💻 cloud ared fl fl fi 30
UniLinks のインフラアーキテクチャ Private Network •Private Link を使ってプライベートな通信を実現 •Private Endpoint は専用の Subnet に配置 •Private な CAE も Private Link を張る •社内からのアクセス用に Cloud are Tunnel をインストールした VM を建ててトラフィックをルーティング •例えば database.windows.net への通信をルーティングすることで fl VNet 内部の通信になり、IP 開けしなくてもクエリエディタ利用可能 31
UniLinks のインフラアーキテクチャ Private Network •Cloud are Tunnel 設定済の Docker Container から cdktf deploy することで、KeyVault などの Private なリソースに値を流し込める •SQL Server への CREATE USER や ALTER USER も同様 •GitHub Actions の Self-hosted Runner を インストールし、デプロイ用 Runner として設定 fl 32
UniLinks のインフラアーキテクチャ Development Branch Development on: create GitHub Actions deploy CDKTF SQL Database Container Apps 33
UniLinks のインフラアーキテクチャ Development Branch •ブランチ毎の開発環境を自動デプロイ •条件に一致するブランチが作成されると GitHub Actions が発火して cdktf deploy 実行 •ブランチ削除時に cdktf destroy 実行 •ブランチ単位に Stack を分離 •SQL Database はコピーで作らずに EF Core のマイグレーションに 任せる 34
ハマった落とし穴 35
ハマった落とし穴 gRPC の前に WAF を置けない? •Public な CAE に配置した gRPC サーバの前段に WAF を置きた かったが、少なくとも FrontDoor は HTTP/2 バックエンドに対 応していないので🙅 •Application Gateway なら?とも思ったが、あまり情報がヒッ トせず😢 •チャッピー(流行語)に聞いても微妙な回答しか得られず…。 •ご存知の方いらっしゃれば教えてください! 36
ハマった落とし穴 GitHub の Fine-grained PAT •ACR Tasks で Error: failed to download context. Please check if the URL is incorrect. If it has credentials, please check if they are expired ってエラーが出た際には contextAccessToken に渡している Fine-grained Personal Access Token の権限を確認する •Submodule を含む場合は、そちらも read できないと🙅 •PAT は Task 構築時に渡すので忘れがち 37
ハマった落とし穴 Submodule は https にする •ACR Tasks のコンテキスト(GitHub repo など) に submodule を含む場合、.gi odules にリストさ れる URL は git+ssh ではなく https にする •OIDC 認証によって得られる AccessToken 的なも のを Authorization ヘッダに付与する仕組みっぽい m t •個人的には見落としがちなポイントでした 38
ハマった落とし穴 gRPC サーバなコンテナが起動しない •Container Apps の Ingress の Transport は HTTP/2 として設定する必要がある Kestrel の Endpoint も HTTP/2 にしないと🙅 • > = > = var builder = WebApplication.CreateBuilder(args); builder.WebHost.ConfigureKestrel(options { options.ConfigureEndpointDefaults(endpointOptions { endpointOptions.Protocols = HttpProtocols.Http2; }); }); 39
ハマった落とし穴 Managed Identity を使って SQL Server 認証 •SQL Server への認証に Managed Identity を使う場合、 CREATE USER や GRANT が必要になる •Managed Identity を作って、Container Apps に User Assigned Managed Identity として割り当てておくと便利 •SQL Server の System Assigned Managed Identity な Principal に Microsoft Entra Directory Readers ロールが必要 •Group を作っておいて、そこに所属させると色々楽になるかも 40
ハマった落とし穴 Managed Certi cates で卵鶏問題 •Managed Certi cates の作成には Container Apps が必要だが、Container Apps 構築時に Bind するには Managed Certi cates が必要、という卵鶏問題が起きる •少なくとも Terraform の AzureRM Provider を 使ったデプロイではこの問題を解消できなかった • az container app hostname bind コマンドを実行する Bash fi fi fi スクリプトを書いてどうにかした(C# 完全統一ならず🥲) 41
ハマった落とし穴 Azure Monitor の動的閾値が荒ぶる •サービスの特性的に、土日祝や長期休みの 際にリクエストが跳ねる •平日は朝と夕方〜夜に山があるが、 平日 お子様がお休みの日は朝に山を登ってから 夜までずっと高いまま • この辺りは流石に学習してくれないので、 参考程度にしか使えない 休日 42
まとめ 43
まとめ まとめ •C# はいいぞ! •開発環境を JetBrains Rider に一本化できた(iOS 的 な事情で macOS で開発してます)ので、開発効率は相当 高かったと思います •比較的新しい Container Apps や Container Registry Tasks に関するドキュメントも結構揃っていた (翻訳はさておき)ので Azure 1年生にも安心 44
Thank you for your attention !! 45