Share
Embed
マルチテナントでのサービスコネクションを使用したAzure DevOps⇔Azure でのデプロイ実践
TFSUGのAzure DevOpsオンラインVol.10で登壇させていただいた際の資料です。
https://tfsug.connpass.com/event/305525/
複数のAzureテナント構成でのAzure DevOpsでのCD pipelineの作り方とポイントについてお話させて頂きました。
yuriemori
January 27, 2024
Transcript
50 slides
-
Agenda Introduction 自己紹介 マルチテナントでのAzure DevOps – Azureのリソース運用
サービスコネクションによるテナントまたぎでのCD pipeline構築 Demo(Azure DevOpsで作成したサービスコネクションを経由して、Azure のAppServiceへデプロイ) まとめ -
Yurie Mori(森 友梨映) Agile Specialist @Avanade Japan お仕事
AgileとDevOpsの実践の支援 DevOpsソリューション( Azure DevOps/GitHub )の導入・構築 技術スタック Azure DevOps, GitHub, Azure, .NET, C# Please follow me -
Yutaka Osada(⾧田 豊) Backend Developer @Avanade Japan お仕事
Azureコンポーネントを活用したサービス構築 技術検証、パフォーマンスチューニングを得意とし、T-SQLが好き。 技術スタック C#, .NET, Azure(PaaS), Azure DevOps, Sitecore Please follow me -
背景 こんなお悩み相談がありました 単純にソース管理、プロジェクト管理としてAzure DevOpsを立てていて、Azureのリ ソースはAzure DevOpsをホストしているテナントとは別のテナントで運用していた いざCDしたい!となったとき、テナントを超えてCD
pipelineを構築しないといけなく なって困った(´・ω・`) テナントA Azure DevOps テナントB リソースグループ App Service Repos ソース管理 Pieplines CD pipeline Boards プロジェクト管理 どうやってテナントを超 えてデプロイする? -
サービスコネクションを使ってテナント跨ぎでサー ビスプリンシパルを使う サービスコネクションとサービスプリンシパルを作成して、Azure DevOpsでテ ナントを跨いでテナントBのAzureリソースにアクセスするようにしてみる 手順はこんな感じ Azureのリソース管理・運用を行っているテナントBで、テナントBのAzureリソース
にアクセスできるサービスプリンシパルを作成 テナントAでホストされているAzure DevOpsで、テナントBのサービスプリンシパル へのサービスコネクションを作成して、それを経由してテナントを跨いでAzureリ ソースにアクセス -
アーキテクチャ構成イメージ テナントA Azure DevOps テナントB Repos ソース管理 Pieplines CD pipeline
Boards プロジェクト管理 Service connection 権限設定 Entra ID サービスプリンシパル リソースグループ App Service Verify ①サービスプリンシパルを 作成 ②サブスクリプション(orリソース グループ)にサービスプリンシパル に対する使用権限(共同作成者)を 与える(※) ③ARMのサービスコネクションを作成して、 テナントBのサービスプリンシパルへのコ ネクションを確立 -
ポイント ターゲットのテナントでサービスプリンシパルを作成する 更に、サブスクリプションもしくはリソースグループにサービスプリンシパル の使用権限(共同作成者)を与えないといけない テナント跨ぎでない場合はサービスコネクション作成の際にサービスプリンシパル (自動)を追加すれば自動でサービスプリンシパルの作成&リソースグループへの権 限が付与される
テナント跨ぎの際にサービスプリンシパル作ってAzDOでサービスコネクション作っ る、というケースのdocsがなくて大変だった、、、 -
アーキテクチャ構成イメージ テナントA Azure DevOps サービスコネクション パイプライン テナントB Entra ID リソースグループ
サービスプリンシパル App Service Repos Src 開発端末 Verify 権限設定 CI/CD Pullリクエストトリガー Src プッシュ mainブランチへのmergeをトリ ガーとして、テナントBにあるApp Serviceにデプロイする -
Azure DevOpsで作成したサービスコネクションを経由して、 AzureのAppServiceへデプロイ ▪前提条件 1.1 デプロイ対象のAzureテナントにリソースグループ、および、空のAppServiceが存在している こと
1.2 AppService用のSrcがPipelineを実行するAzDOのReposに登録されていること ▪デモの流れ 2.1 デプロイ対象のAzureテナントでサービスプリンシパルを作成する 2.2 [2.1]のAzureテナントでAppServiceが所属するリソースグループに対して[2.1]のサービス プリンシパルを追加し、権限(共同作業者)を設定する 2.3 Pipelineを実行するAzDOでサービスコネクションを作成し[2.1]の情報を設定し、Verifyす る 2.4 Pipelineを作成する 2.5 Pipelineの実行し、AppServiceへデプロイが成功することを確認する 2.6 AppServiceのエンドポイントをWebブラウザで開き、正常にWebサイトが表示されることを 確認する -
Azure DevOpsで作成したサービスコネクションを経由して、 AzureのAppServiceへデプロイ (2/2) テナントA Azure DevOps サービスコネクション パイプライン テナントB
Entra ID リソースグループ サービスプリンシパル App Service Repos Src 開発端末 Verify 権限設定 CI/CD Pullリクエストトリガー Src プッシュ 2.1 デプロイ対象のAzureテナント でサービスプリンシパルを作成す る 2.2 [2.1]のAzureテナントでAppService が所属するリソースグループに対して [2.1]のサービスプリンシパルを追加し、 権限(共同作業者)を設定する 2.3 Pipelineを実行するAzDOで サービスコネクションを作成し [2.1]の情報を設定し、Verifyする 2.4 Pipelineを作成する 2.5 Pipelineの実行し、AppService へデプロイが成功することを確認 する 2.6 AppServiceのエンド ポイントをWebブラウザ で開き、正常にWebサイ トが表示されることを確 認する -
まとめ Azure DevOpsからテナントを跨いでAzureリソースにアクセスしたい場合は、 ターゲットのテナントにサービスプリンシパルを作成する Azure DevOpsからサービスコネクションを作成することによって、ターゲッ トのテナントに作成したサービスプリンシパルへの接続が可能になる
DevOpsのプロセス(Plan-build-release-maintenance)の中では、Azure DevOpsだけでなくAzureとのコラボレーションが想定されるので、それを前提 としたテナント構成を考えることが大事 環境構築(IaCによるApp Service等のAzureリソースの作成) release以降のプロセス(今回のようなCD pipelineによる自動デプロイ、 Application Insightの結果をダッシュボードに表示する等) -
1.1 デプロイ対象のAzureテナントにリソースグループ、および、空のAppServiceが存在していること (1/3) 名前:任意 ※命名規則に従うこと 公開:コード ランタイムスタック:.NET 6(LTS) 地域:Japan East
Linux プラン:任意 ※命名規則に従うこと 価格プラン:Free F1 ※無料なのでPoCならこれがいい -
1.1 デプロイ対象のAzureテナントにリソースグループ、および、空のAppServiceが存在していること (3/3) サブスクリプション:Azure サブスクリプション リソースグループ:任意 名前:任意 公開:コード ランタイム スタック:.NET
6(LTS) App Service プラン Free 作成をクリック -
1.2 AppService用のSrcがPipelineを実行するAzDOのReposに登録されていること (1/1) サンプルのソースコードは下記のMSドキュメントを参考に実装 https://learn.microsoft.com/ja-jp/azure/devops/pipelines/ecosystems/dotnet-core?view=azure-devops&tabs=dotnetfive 具体的には、任意のフォルダを作成し、コマンドプロンプトを起動し、カレントディレクトリへ移動し下記コマンドを実行 dotnet new webapp -f
net6.0 dotnet run 後述のパイプライン側は下記の [サービス接続を使用する] を参考に作成 https://learn.microsoft.com/ja-jp/azure/app-service/deploy-azure-pipelines?tabs=yaml -
2.3 Pipelineを実行するAzDOでサービスコネクションを作成し[2.1]の情報を設定し、Verifyする (3/3) Scope Level:Subscription Subscription Id:テナントBのサブスクリプショ ンID Subscription Name:テナントBのサブスクリ
プション名称 Service Principal Id:クライアントID Service Principal Key:クライアントシーク レット Tenant ID:テナントID Service connection name:任意 ※この名称をpipelineで指定する Security: Grant accsess permission to all pipelines チェックOn ※ここでオンにすることで全てのPipelineでこの コネクションを利用できるようになる Verifyを押してSucceedsとなることを確 認する -
2.4 Pipelineを作成する (4/4) Pipeline Src ``` :yaml trigger: - main
pool: vmImage: 'ubuntu-latest' variables: buildConfiguration: 'Release' steps: - script: | cd DemoSite dotnet build --configuration $(buildConfiguration) displayName: 'dotnet build $(buildConfiguration)' - task: DotNetCoreCLI@2 inputs: command: 'publish' publishWebProjects: true projects: '**/*.csproj' arguments: '--configuration $(BuildConfiguration) -- output $(Build.ArtifactStagingDirectory)' - task: AzureWebApp@1 inputs: azureSubscription: 'TfsudDemoAzureResourceConnection' appType: 'webAppLinux' appName: 'asp-tfsud-demo-dev-001' package: '$(Build.ArtifactStagingDirectory)/**/*.zip' ```