3.4K Views
April 20, 24
スライド概要
Global Azure 2024
https://jazug.connpass.com/event/311408/
Microsoft MVP for Microsoft Azure
Global Azure 2024 Azure Container Apps によるエンタープライズWebアプリ・サービスのDevOps 2024年04月20日(土) 株式会社バンダイナムコスタジオ 技術スタジオ 第3グループ オンラインテクノロジー部 サーバソリューションユニット DXセクション 八重樫 剛史 Takeshi Yaegashi
自己紹介 • 八重樫 剛史 Takeshi Yaegashi • 株式会社バンダイナムコスタジオ (BNS) 技術スタジオ 第3グループ オンラインテクノロジー部 サーバソリューションユニット DXセクション テクニカルディレクター • 社内開発者向けのクラウドサービス導入推進 プラットフォームエンジニアリングのプロジェクトに従事 • Microsoft MVP for Microsoft Azure (2023) https://mvp.microsoft.com/ja-jp/PublicProfile/5005134 • Web (blog) X (Twitter) GitHub https://l0w.dev https://twitter.com/hogegashi https://github.com/yaegashi 2
直近の登壇実績 • 2023/11/04第25回redmine.tokyo勉強会 Microsoft Entra/Azure によるRedmine の企業内利用向けカスタマイズと運用 • https://redmine-tokyo.connpass.com/event/297351/ • 資料: https://www.docswell.com/s/yaegashi/KENJ7G • 2023/11/25 .NETラボ 勉強会 2023年11月 Microsoft Entra ID と Azure App Service によるエンタープライズ Web アプリ・サービスのプラットフォーム構築 • https://dotnetlab.connpass.com/event/299544/ • 資料: https://www.docswell.com/s/yaegashi/ZJL16J • 2023/12/16 .NETラボ 勉強会 2023年12月 Azure Container Apps と Easy Auth によるレガシー Web アプリ・サービスのモダナイズ • https://dotnetlab.connpass.com/event/303142/ • 資料: https://www.docswell.com/s/yaegashi/KYW6JV • 2024/03/26 InnerSource Commons #12 Enterprise InnerSource Infrastructure DevOps with Backstage • https://innersourcecommons.connpass.com/event/311552/ • 資料: https://www.docswell.com/s/yaegashi/ZM1DMX • 録画: https://www.youtube.com/watch?v=aWnrpvGvi4Q 3
本日のお話 • 大規模なエンタープライズ向けの Web アプリ・サービスのDevOpsの事例紹介 • Azure Container Apps • Azure Easy Auth • Azure Developer CLI • 大規模なエンタープライズ とは? • Microsoft 365 導入済み・Microsoft Entra ID (ME-ID) テナントユーザー総数 10,000 程度の企業グループを想定 • 各WebアプリでME-ID グループを使った自由なアクセス制御を実現したい A会社 A事業部 A部 A課 B課 B会社 B事業部 C事業部 D事業部 B部 C部 D部 E部 C課 D課 E課 F課 Aプロ ジェクト Bプロ ジェクト Cプロ ジェクト 4
事例紹介 ➀ Private NuGet Server on Azure Container Apps [1] • .NET Core の NuGet サーバ BaGetter[2] を Azure Container Apps でサーバレスに運用 • Azure Easy Auth と HTTP Basic 認証に対応する easy-basic-auth-proxy を開発 [1] https://github.com/yaegashi/dx2devops-nuget-server [2] https://www.bagetter.com 5
事例紹介 ➁ Redmine on Azure Container Apps [1] • Ruby on Rails によるプロジェクト管理アプリ Redmine [2] を Azure Container Apps でサーバレスに運用 • 社内で長年活用されているツールで需要が高い [1] https://github.com/yaegashi/dx2devops-redmine-containerapp [2] https://www.redmine.org 6
事例紹介 ➂ Backstage on Azure Container Apps [1] • オープンソースの内部開発者ポータル (IDP) Backstage [2] を Azure Container Apps でサーバーレスに運用 • 企業内で Platform Engineering や InnerSource を推進するための基盤 [1] https://github.com/yaegashi/dx2devops-backstage-containerapp [2] https://backstage.io 7
大規模なエンタープライズ向けの Web アプリ・サービスの提供形態 • https://(アプリインスタンス名).(共通アプリドメイン名) によるWebアプリ・サービスの提供 • Microsoft Entra ID テナント による共通のユーザーの認証・認可の提供 • Infrastructure as Code (IaC) および 自動化ワークフローの整備による管理の省力化 → GitHub Actions の workflow_dispatch など • 最終的には企業内ユーザーがアプリインスタンスをセルフサービスで 作ったり壊したりできるポータルを提供する • 要するに企業内専用 SaaS のようなものを作っている 8
なぜ Azure Container Apps を使うのか • コンテナ化したアプリの運用が簡単で機能が豊富 • マルチコンテナ構成が簡単 • 構成リビジョン機能で Blue/Green デプロイが簡単 • 指定コンテナ内のシェルを開いてトラブルシュートやメンテナンスが簡単 • Scale-to-zero によるコスト削減が可能 • PostgreSQLやRedisなどのアドオンサービスコンテナが利用可能 • 組み込みの認証と認可が利用可能 (Azure Easy Auth) 9
なぜ Azure Easy Auth を使うのか • Easy Auth = コンテナアプリの前段に設置できる ユーザー認証・認可プロキシ • Easy Auth の利点 • アプリで認証・認可をそのものを実装する必要がなくセ キュリティ事故発生の可能性が減る • アプリに不具合が発生した場合でも Easy Auth で直ちにア クセスを限定して落ち着いてメンテナンスができる • 認証完了ユーザーのアクセストークン・IDトークン・リフ レッシュトークンを保持してくれる (トークンストア) • Easy Auth の欠点 • ローカル開発環境での認証・認可テストがやや面倒 • API アクセスの認証がやや面倒 • 既存アプリへの組み込みに工夫が必要な場合が多い (次ページ以降で説明) 10
さまざまなコンテナアプリで Azure Easy Auth を活用していく取り組み ➀ • Redmine: redmine easyauth プラグインによる「Easy Auth ログイン」ボタン追加 • Easy Auth で認証した後に Redmine のローカル認証とも併用可能 11
さまざまなコンテナアプリで Azure Easy Auth を活用していく取り組み ➁ • easy-basic-auth-proxy の開発 [1] • HTTP Basic 認証しか対応できないレガシーアプリを Easy Auth でモダンな認証に対応させる認証プロキシ • NuGet や Subversion などのサーバを社内向けに提供するために開発 • Backstage への貢献 • New backend system に対応した azure-easyauth-provider プラグインの追加 • 今週プルリクエストがマージされ、その後リリースされた v1.26 で利用可能になった [2] [1] https://github.com/yaegashi/easy-basic-auth-proxy [2] https://github.com/backstage/backstage/pull/23909 12
Azure Developer CLI (AZD) [1] による Azure Container Apps の DevOps • AZD = インフラリソースやコンテナビルドのデプロイが楽になるツール • 様々な言語・フレームワークのアプリを関連する Azure インフラとともに適切にデプロイしてくれる • Azure Container Apps のコンテナアプリであれば言語を問わず対応可能 → azure.yaml で language: js を指定して project: で Dockerfile の場所を指定すればよい • AZD環境変数にデプロイ設定を読み込み、デプロイ結果を保存できる → Terraform のステートと似ているが Bicep の output を保持するだけのゆるいもの → コンテナアプリの多数のインスタンスのデプロイや更新に利用できる $ $ $ $ $ $ $ $ $ azd azd azd azd azd azd azd azd azd ← 認証 auth login env new hoge1app ← AZD環境をつくる env set SHARED_RESOURCE_GROUP_NAME rg-bandainamco-shared1 env set APP_ROOT_PATH /redmine env set DNS_ZONE_RESOURCE_GROUP_NAME rg-dns env set DNS_ZONE_NAME rm.example.com env set DNS_RECORD_NAME hoge1 ← Azure Container Apps インフラリソースをデプロイ provision ← コンテナをビルド・レジストリにプッシュ・Azure Container Appsにデプロイ deploy [1] https://learn.microsoft.com/ja-jp/azure/developer/azure-developer-cli/overview 13
GitHub Actions ワークフローによる Azure Developer CLI の実行 14
Azure Developer CLI リモート環境[1]を活用したチーム DevOps 体制 • AZD環境変数を Azure Blob Storage に自動的に保持・共有できる → チームによる CI/CD・DevOps の実践が容易になる → AZD環境変数はテキストファイルで保存されるため、確認や修正が Azure Portal で簡単にできる $ azd auth login $ azd config set state.remote.backend AzureBlobStorage $ azd config set state.remote.config.accountName strmdevops $ azd env list NAME DEFAULT LOCAL REMOTE . false false true bandainamco-x0001-hoge1app false false true bandainamco-x0001-test1 false false true bandainamco-x0001-test2 false false true $ azd env select bandainamco-x0001-hoge1pp $ azd env get-values APP_CERTIFICATE_EXISTS="true" APP_ROOT_PATH="/redmine" AZURE_CONTAINER_APPS_APP_NAME="ca-vgzfex55ah4ri" AZURE_CONTAINER_APPS_JOB_NAME="ca-vgzfex55ah4ri-job" AZURE_ENV_NAME="bandainamco-x0001-hoge1app" .... [1] https://learn.microsoft.com/ja-jp/azure/developer/azure-developer-cli/remote-environments-support 15
Azure Container Apps その他のトピック • Azure Container Apps の Easy Auth トークンストア対応 [1] • Azure Container Apps の Easy Auth は当初トークンストアの機能がなかったが、 最近 Azure Blob Storage を外付けすることでトークンストアを有効化できる • サインインしたユーザーのIDトークンやアクセストークンが HTTP ヘッダで渡されるようになる • Azure Container Apps のカスタムドメイン向けマネージド証明書のデプロイ • 初回のデプロイではコンテナアプリのデプロイを2回行わないと正しく設定できない [2] 1. コンテナアプリ環境をデプロイ 2. DNS TXTレコードをデプロイ ("asuid.カスタムドメイン") 3. コンテナアプリをデプロイ1回目 (bindingType: "Disabled") 4. DNS CNAMEレコードをデプロイ ("カスタムドメイン" → コンテナアプリFQDN) 5. マネージド証明書をデプロイ 6. コンテナアプリをデプロイ2回目 (bindingType: "SniEnabled") • AZD環境変数や containerapps-helloworld コンテナを使って1回の azd provision コマンドで済むように工夫している [1] https://learn.microsoft.com/ja-jp/azure/container-apps/token-store [2] https://johnnyreilly.com/azure-container-apps-bicep-managed-certificates-custom-domains 16
まとめ • 大規模なエンタープライズ向けの Web アプリ・サービスの DevOps について 直近の取り組みを紹介しました。 • Azure Container Apps • Azure Easy Auth • Azure Developer CLI • Azure Developer CLI リモート環境の活用 • Azure Container Apps Azure Easy Auth トークンストア • Azure Container Apps マネージド証明書 • 時間が足りず扱えなかったトピックについてはまた別の機会に解説したいと思います • Azure Deployment Environments の Azure Developer CLI テンプレート管理統合 • 企業内 Backstage SaaS 運用・InnerSource 推進・プラットフォームエンジニアリング 17
Thank You!! 18