プラットフォームエンジニアリングのためのセルフサービス基盤の実装

7.6K Views

August 09, 24

スライド概要

GitHub Actions Meetup Tokyo #4
https://gaugt.connpass.com/event/324715/

profile-image

Microsoft MVP for Microsoft Azure

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

GitHub Actions Meetup Tokyo #4 プラットフォームエンジニアリングのためのセルフサービス基盤の実装 2024年08月09日(金) 株式会社バンダイナムコスタジオ 技術スタジオ 第3グループ オンラインテクノロジー部 サーバソリューションユニット DXセクション 八重樫 剛史 Takeshi Yaegashi

2.

自己紹介 • 八重樫 剛史 Takeshi Yaegashi • 株式会社バンダイナムコスタジオ (BNS) 技術スタジオ 第3グループ オンラインテクノロジー部 サーバソリューションユニット DXセクション テクニカルディレクター • 社内開発者向けのクラウドサービス導入推進 プラットフォームエンジニアリングのプロジェクトに従事 • Microsoft MVP for Microsoft Azure (2023, 2024) https://mvp.microsoft.com/ja-jp/PublicProfile/5005134 • Web (blog) X (Twitter) GitHub https://l0w.dev https://x.com/hogegashi https://github.com/yaegashi 2

3.

本日のお話 • バンダイナムコスタジオのプラットフォームエンジニアリングプロジェクト • GitHub Actions を使ったプラットフォームエンジニアリングのためのセルフサービス基盤の実装 • Azure Container Apps による GitHub Actions セルフホストランナーの実装 3

4.

バンダイナムコスタジオのプラットフォームエンジニアリング • Bandai Namco DX Cloud Studios • コロナ禍をきっかけに始まった「クラウド上のゲーム開発スタジオ」を構築しようという取り組み • サービスよりも開発者を顧客とする開発・テスト環境の提供にフォーカス • 例: GPU搭載VMによる仮想デスクトップやゲームアプリビルドのCI/CD環境などを提供する • プラットフォームエンジニアリング、インナーソースに関する登壇 • 2023/08/24(木) CEDEC 2023 [1] 「ゲーム開発インフラのDXを推進するCCoEとプラットフォームエンジニアリング」 • 2024/07/09(火) Platform Engineering Kaigi 2024 [2] 「大規模エンタープライズの全員参加が可能な内部開発者ポータルの野望」 • 2024/08/23(金) CEDEC 2024 [3] 「社内開発者ポータルを活用したインナーソースの推進と技術的課題の解決」 [1] https://cedec.cesa.or.jp/2023/session/detail/s642a0ffc4b8d7.html [2] https://www.cnia.io/pek2024/sessions/342bb6b7-33c0-48ef-9476-4a87529c2a37/ [3] https://cedec.cesa.or.jp/2024/session/detail/s6609d4c7012c9/ 4

5.

Bandai Namco DX Cloud Studios (2022) • CEDEC 2022「DX(開発者体験)の向上を目指すゲーム開発インフラの進化とDX(デジタル変革)」 • コロナ禍の在宅勤務の開始をきっかけとしてAzureでクラウド上のゲーム開発スタジオ構築を目指す • 新人研修ゲーム開発プロジェクトなどで活用実績を残したが、ほぼワンオペであったため規模拡大できず [1] https://cedec.cesa.or.jp/2022/session/detail/184 5

6.

Bandai Namco DX Cloud Studios (2024) • 自動化と運用体制の不備を反省して2023年にリブートしたプロジェクト • 目標: 高度なセルフサービスが可能で実用的なインフラプラットフォームの構築 • ガードレールを備えた自動化対応のクラウドインフラ → ベストプラクティス (Azure Cloud Adoption Framework) の参照と Infrastructure-as-Code (Bicep) の徹底 • セルフサービスを可能にするクラウド管理ポータル → エンジニアだけでなく一般のゲーム開発者も利用できる UI/UX を備える Web App で運用者の負荷を減らす • 汎用のタスクランナー (今日のトピック) → 様々なインフラ管理の自動化タスクの実行基盤を実現 • 2024/06 社内アルファテスト実施 • 当面の目標 → 従業員が完全なセルフサービスで自分専用の開発環境となるクラウドPCを作ったり壊したりできるようにする → Microsoft Intune / Entra Join 完全対応で Microsoft 365 やオンプレミス既存リソースも利用できる (Entra Private Access) → Windows 11 の Dev Home を活用して Configuration-as-Code・使い捨て可能な開発者環境を実現する → Linux コンテナにはかなわないが、10分未満のサイクルでWindows VMを作ったり消したりできたら… 6

7.

Microsoft/Azure におけるプラットフォームエンジニアリング情報 • 参考: Microsoft Learn「開発者向けセルフサービス基盤を設計する」[1] • Microsoftのプラットフォームエンジニアリングのドキュメントに含まれるガイドライン • 今回紹介した Bandai Namco DX Cloud Studios (2024) もこのガイドラインにほぼ従っている [1] https://learn.microsoft.com/ja-jp/platform-engineering/developer-self-service 7

8.

DX Cloud Web App (開発中の画面) • 開発用仮想マシンの作成・削除・メンテナンス、RDP接続などの操作がセルフサービスでできる • Microsoft Dev Box よりも多機能、 Azure Portal よりもシンプルで、かゆいところに手が届く使いやすいアプリを目指す 8

9.

DX Cloud セルフサービス基盤: 汎用タスクランナー • 汎用タスクランナーの要件 • ユーザーは事前に定義された様々な自動化タスクを入力パラメーターを与えて手動実行できる • 非同期に自動化タスクを実行開始し、ログなどの実行結果を後から参照できる • 非開発者・非エンジニアのユーザーでも使いやすいWebアプリ・ドキュメント・導線を備える • できるだけ多くのユーザーが追加費用なく利用できる 9

10.

DX Cloud セルフサービス基盤: 汎用タスクランナー実装の検討 • 従来のサービス・ソフトウェアによる実装の検討 • GitHub Actions・Azure Pipelines・CircleCI・GitLab CI・Jenkins CI・Rundeck・etc. • UIや導線が直感的ではない、Git履歴管理が難しい、セルフホストしたくない、SaaS利用料金がかかる、etc. • ほとんどのサービスは何らかのAPIを備えており、やろうと思えばUIの外付けが可能 10

11.

DX Cloud Async Job Executor (非同期ジョブ実行基盤) • 自動化タスクGitHub Actionsワークフローの実行・結果確認ができるWeb Appを独自開発 • Web AppはAzure PaaSで実装、認証・認可にMicrosoft Entra IDを使用することで全従業員が利用可能 • GitHub AppによるAPI操作のみを使用するためユーザーのGitHub Enterpriseライセンス料金は不要 • Web Appで表示する入力パラメーターフォームやドキュメントをGitリポジトリ内の別のYAMLファイルで定義する 11

12.
[beta]
DX Cloud Async Job YAML → GitHub Actions Workflow YAML 記述例
(asyncjob repo)
asyncjob/configs/asyncjobConfig-NewAvdSessionHost.yml

(workflow repo)
.github/workflows/asyncjob-NewAvdSessionHostForUser.yml

id: newavdsessionhostforuser
name: New AVD Session Host
type: github
repo: bns-dxcloud/asyncjob-bandainamco-release
branch: main
workflow: asyncjob-NewAvdSessionHostForUser.yml
complete: github
deployment_protection: true
overview: "新規にVMを作成します。"
description: |
# New AVD Session Host
## 概要
新規にVMを作成します。
...
inputs:
parent_vdpool:
type: string
description: 'parent vdpool(例: /p/000/vdws/000/vdpool/000)'
required: true
parent: true
permission:
role: create
scope: /p/EXIST/vdws/EXIST/vdpool/EXIST/vdvm
displayName:
type: string
required: false
default: ''
description: 'VMの表示名(既定値は仮想マシンのリソース名と同じ)'
vmSize:
type: choice
default: Standard_D2s_v5
required: true
description: 'VMサイズ'
options:
- Standard_D2s_v5
- Standard_D4s_v5
- Standard_D8s_v5
- Standard_D16s_v5

name: Asyncjob New AVD Session Host For User
run-name: asyncjob newavdsessionhostforuser ${{inputs.management_values}}
on:
workflow_dispatch:
inputs:
management_values:
type: string
description: '"job_owner index_id repo_type deploy_environment" used for management'
required: true
params_file:
type: string
description: 'parameters file name'
required: true
params_file_blob_storage:
type: string
description: 'azure blob storage account name'
required: true
github_runs_on:
type: string
description: 'github runs on'
required: true
github_environment:
type: environment
description: 'environment'
required: true
permissions:
id-token: write
contents: read
jobs:
new-avd-sessionhost:
runs-on: ${{ inputs.github_runs_on }}
environment: ${{ inputs.github_environment }}
steps:
- uses: actions/checkout@v4
- name: Az Login For Execute Async Task
uses: azure/login@v2

12

13.

DX Cloud Async Job Web App: ジョブ実行 (開発中の画面) • ユーザーはasyncjob repoのYAMLで定義されたジョブを選択し、入力パラメータを指定して実行できる 13

14.

DX Cloud Async Job Web App: ジョブ履歴 (開発中の画面) • ジョブを実行した履歴を確認できる ジョブ完了時にメールによる結果通知も行われる 14

15.

DX Cloud Async Job Web App: ログ表示 (開発中の画面) • ジョブの実行ログを確認できる 現時点では実行完了したジョブのみ 15

16.

DX Cloud Async Job Web App: 事前入力URL (開発中の画面) • ジョブ入力パラメーターのフォームが記入済みになる URLを作成可能 • URLはジョブの説明や外部 Wiki からのリンク先として使える • ユーザーガイドやオペレーションマニュアルなどのドキュメント からの導線の改善に役立つ • 事前入力 URL は Jenkins CI や GitLab CI にはあるが GitHub Actions にはない機能 • Copy URL ボタンは Microsoft Forms の機能をヒントに追加 https://dxcloud.example.com/asyncJob/newavdsessionhostforuser?parent_vdp ool=%2Fp%2F168%2Fvdws%2F001%2Fvdpool%2F001&displayName=%E5%8B%95%E4%BD%9 C%E7%A2%BA%E8%AA%8D%E7%94%A8%20Windows%2011%2023H2&vmSize=Standard_D2s_v 5&vmImage=win11&vmImageVersion=latest 16

17.
[beta]
DX Cloud Async Job Input Parameters の受け渡しと取り出し
• GitHub Actions ワークフロー制約
workflow_dispatch inputs が 10個
まで
• 制約を回避するため asyncjob に
記述した inputs は Azure Blob
Storage にファイルアップロード
して受け渡している
• コードの記述量が多いので
GitHub Action を定義するなど
モジュール化の方法を検討中

(workflow repo)
.github/workflows/asyncjob-NewAvdSessionHostForUser.yml
jobs:
new-avd-sessionhost:
runs-on: ${{ inputs.github_runs_on }}
environment: ${{ inputs.github_environment }}
steps:
- uses: actions/checkout@v4
- name: Az Login For Execute Async Task
uses: azure/login@v2
with:
client-id: ${{ vars.ASYNCJOB_AZURE_SERVICE_CLIENT_ID }}
tenant-id: ${{ vars.ASYNCJOB_AZURE_TENANT_ID }}
subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}
enable-AzPSSession: true
- name: New AVD SessionHost
shell: pwsh
run: |
$mgtoken = ConvertTo-SecureString -AsPlainText (Get-AzAccessToken -ResourceTypeName MSGraph).Token
Connect-MgGraph -AccessToken $mgtoken
az storage blob download ¥
--account-name ${{ inputs.params_file_blob_storage }} ¥
-c "asyncjob-parameters-files" ¥
-n ${{ inputs.params_file }} ¥
-f ${{ inputs.params_file }} ¥
--auth-mode login
$inputs = Get-Content -Path ${{ inputs.params_file }} -Raw | ConvertFrom-Yaml -UseMergingParser
Write-Host ">>> parent_vdpool Table:"
$resourceTable = ConvertFrom-BndxcsResourceId -ResourceId $inputs.parent_vdpool
...

17

18.

DX Cloud Async Job: GitHub Actions ワークフロージョブ最適化 • GitHub Actions custom deployment protection rules [1] の活用 • Azure VM デプロイ+デプロイ後処理 のようなジョブを GitHub Actions ワークフローで実行すると、 インフラがデプロイ完了するまで、ワークフローのジョブに長い待機状態が発生することがある → 何もしていない待機中でも GitHub Actions ランナーの実行時間として計上され課金されてしまう • ワークフローをデプロイ開始処理・デプロイ後処理の2つのジョブに分割して待機を解消する → デプロイ後処理のジョブは custom deployment protection rules により webhook 通知が来るまで実行させない • EventGridを使用してAzureリソースのデプロイ完了をフックする [2] [1] https://docs.github.com/ja/actions/managing-workflow-runs-and-deployments/managing-deployments/creating-custom-deployment-protection-rules 18 [2] https://qiita.com/kazu_yasu/items/a22c35f54fb665642c00

19.

DX Cloud Async Job: GitHub Actions ワークフロージョブ最適化の効果 • Azure VM デプロイワークフローのサマリ • トータル実行時間 27m32s に対してランナー実行時間はわずか 1m2s + 3m4s = 4m6s となり 85% 近い削減 • Azureのデプロイだけでなく、他の時間がかかるジョブでも活用できるように仕組みを汎用化していきたい 19

20.

DX Cloud Async Job with Azure Container Apps Jobs • GitHub Actions の self-hosted runner に Azure Container Apps Jobs を活用 [1] • KEDA の機能の一部である GitHub Runner Scaler [2] が簡単にセットアップできるようになっている • GitHub hosted runner に対する利点 • 価格が安い: 時間単価は1/2 程度。scale-to-zero に対応し、コールドスタートでもそんなに待たせない (30秒程度) • カスタムコンテナイメージ: ジョブごとに実行する初期化 (外部ツールのインストールなど) の時間を短縮できる • プライベートVNet接続・マネージドID: Azureリソースアクセスのセキュリティ、認証がシンプルに • ちょっと不満な点 • ジョブごとにコンテナイメージの指定ができたら… (GitLab CI Runner ではよくやっていた) • 本格的に使ってみないとわからない KEDA のバグ オートスケールがうまく働かず待たされる不具合 → 2024/02 GitHub Issues で報告 [3] → 2024/04 KEDA 2.14.0 で修正 → 2024/06 ようやく Azure Container Apps でも修正完了 [1] https://qiita.com/kazu_yasu/items/4fd578b35752968a3bb4 [2] https://keda.sh/docs/2.14/scalers/github-runner/ [3] https://github.com/microsoft/azure-container-apps/issues/1067 20

21.

まとめ • 本日お話したトピック • プラットフォームエンジニアリングのためのセルフサービス基盤を GitHub Actions で作ってみました • Azure Container Apps による GitHub Actions セルフホストランナーを使ってみました • 今後の計画・野望 • DX Cloud Web App アルファテスト → ベータテスト → GA • DX Cloud Web App の内部開発者ポータル (Backstage) との統合 21

22.

Thank You!! 22