Slide 1

Slide 1 text

マルチテナントでのサービスコネクションを使 用したAzure DevOps⇔Azure でのデプロイ実践 2024/1/27 yuriemori, yutakaosada

Slide 2

Slide 2 text

Agenda  Introduction  自己紹介  マルチテナントでのAzure DevOps – Azureのリソース運用  サービスコネクションによるテナントまたぎでのCD pipeline構築  Demo(Azure DevOpsで作成したサービスコネクションを経由して、Azure のAppServiceへデプロイ)  まとめ

Slide 3

Slide 3 text

Introduction

Slide 4

Slide 4 text

今日話すこと  Azure DevOpsからホスト先とは別のAzureテナントにあるApp Serviceにデプロ イしたい  Azure DevOpsでAzureテナントのリソースにアクセスするためのサービスコネ クションを作成し、それを使ってテナントを超えたCD pipelineを実現する

Slide 5

Slide 5 text

Yurie Mori(森 友梨映)  Agile Specialist @Avanade Japan  お仕事  AgileとDevOpsの実践の支援  DevOpsソリューション( Azure DevOps/GitHub )の導入・構築  技術スタック  Azure DevOps, GitHub, Azure, .NET, C#  Please follow me

Slide 6

Slide 6 text

Yutaka Osada(⾧田 豊)  Backend Developer @Avanade Japan  お仕事  Azureコンポーネントを活用したサービス構築  技術検証、パフォーマンスチューニングを得意とし、T-SQLが好き。  技術スタック  C#, .NET, Azure(PaaS), Azure DevOps, Sitecore  Please follow me

Slide 7

Slide 7 text

マルチテナントでのAzure DevOps – Azureのリソース運用

Slide 8

Slide 8 text

背景  こんなお悩み相談がありました  単純にソース管理、プロジェクト管理としてAzure DevOpsを立てていて、Azureのリ ソースはAzure DevOpsをホストしているテナントとは別のテナントで運用していた  いざCDしたい!となったとき、テナントを超えてCD pipelineを構築しないといけなく なって困った(´・ω・`) テナントA Azure DevOps テナントB リソースグループ App Service Repos ソース管理 Pieplines CD pipeline Boards プロジェクト管理 どうやってテナントを超 えてデプロイする?

Slide 9

Slide 9 text

サービスコネクションを使ってテナント跨ぎでサー ビスプリンシパルを使う  サービスコネクションとサービスプリンシパルを作成して、Azure DevOpsでテ ナントを跨いでテナントBのAzureリソースにアクセスするようにしてみる  手順はこんな感じ  Azureのリソース管理・運用を行っているテナントBで、テナントBのAzureリソース にアクセスできるサービスプリンシパルを作成  テナントAでホストされているAzure DevOpsで、テナントBのサービスプリンシパル へのサービスコネクションを作成して、それを経由してテナントを跨いでAzureリ ソースにアクセス

Slide 10

Slide 10 text

アーキテクチャ構成イメージ テナントA Azure DevOps テナントB Repos ソース管理 Pieplines CD pipeline Boards プロジェクト管理 Service connection 権限設定 Entra ID サービスプリンシパル リソースグループ App Service Verify ①サービスプリンシパルを 作成 ②サブスクリプション(orリソース グループ)にサービスプリンシパル に対する使用権限(共同作成者)を 与える(※) ③ARMのサービスコネクションを作成して、 テナントBのサービスプリンシパルへのコ ネクションを確立

Slide 11

Slide 11 text

リソースグループ単位でサービスプリンシパルに対 する権限を与える 対象のリソースグループの「アクセス制御(IAM)」 で「ロールの割り当て」を選択して、サービスプ リンシパルに共同作成者のロールを与えてくださ い ※この操作はRGの所有者でないといけない

Slide 12

Slide 12 text

ポイント  ターゲットのテナントでサービスプリンシパルを作成する  更に、サブスクリプションもしくはリソースグループにサービスプリンシパル の使用権限(共同作成者)を与えないといけない  テナント跨ぎでない場合はサービスコネクション作成の際にサービスプリンシパル (自動)を追加すれば自動でサービスプリンシパルの作成&リソースグループへの権 限が付与される  テナント跨ぎの際にサービスプリンシパル作ってAzDOでサービスコネクション作っ る、というケースのdocsがなくて大変だった、、、

Slide 13

Slide 13 text

サービスコネクションによるテナン トまたぎでのCD pipeline構築

Slide 14

Slide 14 text

テナントを跨いでpipelineでデプロイする  テナントAのAzure DevOpsでテナントBのApp Serviceにデプロイするための pipelineを作成する  トリガー:mainブランチにコードがmergeされる  PipelineのymlファイルのazureSubscriptionに作成したサービスコネクションの名称 を指定

Slide 15

Slide 15 text

サービスコネクションを使ってCD pipelineを構成す る こんな感じでサービスコネクショ ン名をpipelineのymlの azureSubscriptionでサービスコネ クション名を指定して使います

Slide 16

Slide 16 text

アーキテクチャ構成イメージ テナントA Azure DevOps サービスコネクション パイプライン テナントB Entra ID リソースグループ サービスプリンシパル App Service Repos Src 開発端末 Verify 権限設定 CI/CD Pullリクエストトリガー Src プッシュ mainブランチへのmergeをトリ ガーとして、テナントBにあるApp Serviceにデプロイする

Slide 17

Slide 17 text

demo

Slide 18

Slide 18 text

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サイトが表示されることを 確認する

Slide 19

Slide 19 text

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サイ トが表示されることを確 認する

Slide 20

Slide 20 text

まとめ

Slide 21

Slide 21 text

まとめ  Azure DevOpsからテナントを跨いでAzureリソースにアクセスしたい場合は、 ターゲットのテナントにサービスプリンシパルを作成する  Azure DevOpsからサービスコネクションを作成することによって、ターゲッ トのテナントに作成したサービスプリンシパルへの接続が可能になる  DevOpsのプロセス(Plan-build-release-maintenance)の中では、Azure DevOpsだけでなくAzureとのコラボレーションが想定されるので、それを前提 としたテナント構成を考えることが大事  環境構築(IaCによるApp Service等のAzureリソースの作成)  release以降のプロセス(今回のようなCD pipelineによる自動デプロイ、 Application Insightの結果をダッシュボードに表示する等)

Slide 22

Slide 22 text

 今回の内容(サービスプリンシパル、サービスコネクションの作成)はこちら のzennの記事を基にしています  デモのソースコードはこちらになります。※GitHub  関連の公式docs等が知りたい方はアクセスしてみてください References zenn GitHub

Slide 23

Slide 23 text

Appendix

Slide 24

Slide 24 text

1.1 デプロイ対象のAzureテナントにリソースグループ、および、空のAppServiceが存在していること (1/3) 名前:任意 ※命名規則に従うこと 公開:コード ランタイムスタック:.NET 6(LTS) 地域:Japan East Linux プラン:任意 ※命名規則に従うこと 価格プラン:Free F1 ※無料なのでPoCならこれがいい

Slide 25

Slide 25 text

1.1 デプロイ対象のAzureテナントにリソースグループ、および、空のAppServiceが存在していること (2/3) 継続的デプロイ:無効化 パブリックアクセスを有効にする:オン Application Insights:いいえ

Slide 26

Slide 26 text

1.1 デプロイ対象のAzureテナントにリソースグループ、および、空のAppServiceが存在していること (3/3) サブスクリプション:Azure サブスクリプション リソースグループ:任意 名前:任意 公開:コード ランタイム スタック:.NET 6(LTS) App Service プラン Free 作成をクリック

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

2.1 デプロイ対象のAzureテナントでサービスプリンシパルを作成する (1/6)

Slide 29

Slide 29 text

2.1 デプロイ対象のAzureテナントでサービスプリンシパルを作成する (2/6)

Slide 30

Slide 30 text

2.1 デプロイ対象のAzureテナントでサービスプリンシパルを作成する (3/6)

Slide 31

Slide 31 text

2.1 デプロイ対象のAzureテナントでサービスプリンシパルを作成する (4/6) アプリケーションID、とディレクトリIDはあとで使うので控えておきます。

Slide 32

Slide 32 text

2.1 デプロイ対象のAzureテナントでサービスプリンシパルを作成する (5/6)

Slide 33

Slide 33 text

2.1 デプロイ対象のAzureテナントでサービスプリンシパルを作成する (6/6) シークレット値はあとで使うので控えておきます。 ※閉じると二度と表示されないので注意

Slide 34

Slide 34 text

2.2 [2.1]のAzureテナントでAppServiceが所属するリソースグループに対して[2.1]のサービスプリンシパルを追加し、権限(共同作業者)を設定する (1/4)

Slide 35

Slide 35 text

2.2 [2.1]のAzureテナントでAppServiceが所属するリソースグループに対して[2.1]のサービスプリンシパルを追加し、権限(共同作業者)を設定する (2/4)

Slide 36

Slide 36 text

2.2 [2.1]のAzureテナントでAppServiceが所属するリソースグループに対して[2.1]のサービスプリンシパルを追加し、権限(共同作業者)を設定する (3/4) 作成したサービスプリンシパルで検索します

Slide 37

Slide 37 text

2.2 [2.1]のAzureテナントでAppServiceが所属するリソースグループに対して[2.1]のサービスプリンシパルを追加し、権限(共同作業者)を設定する (4/4)

Slide 38

Slide 38 text

2.3 Pipelineを実行するAzDOでサービスコネクションを作成し[2.1]の情報を設定し、Verifyする (1/3)

Slide 39

Slide 39 text

2.3 Pipelineを実行するAzDOでサービスコネクションを作成し[2.1]の情報を設定し、Verifyする (2/3)

Slide 40

Slide 40 text

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となることを確 認する

Slide 41

Slide 41 text

2.4 Pipelineを作成する (1/4)

Slide 42

Slide 42 text

2.4 Pipelineを作成する (2/4)

Slide 43

Slide 43 text

2.4 Pipelineを作成する (3/4)

Slide 44

Slide 44 text

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' ```

Slide 45

Slide 45 text

2.5 Pipelineの実行し、AppServiceへデプロイが成功することを確認する (1/4) Pipelineを実行前の状況を確認す る ※まだデプロイされていないため、 AppServiceのデフォルトのWebサイ トが表示されることを確認しておく

Slide 46

Slide 46 text

2.5 Pipelineの実行し、AppServiceへデプロイが成功することを確認する (2/4)

Slide 47

Slide 47 text

2.5 Pipelineの実行し、AppServiceへデプロイが成功することを確認する (3/4)

Slide 48

Slide 48 text

2.5 Pipelineの実行し、AppServiceへデプロイが成功することを確認する (4/4) Pipelineが成功するとメール通知さ れる

Slide 49

Slide 49 text

2.6 AppServiceのエンドポイントをWebブラウザで開き、正常にWebサイトが表示されることを確認する (1/2) エンドポイントへ再度ブラウザでアクセ ス 正常に表示されることを確認する

Slide 50

Slide 50 text

2.6 AppServiceのエンドポイントをWebブラウザで開き、正常にWebサイトが表示されることを確認する (2/2) デプロイセンターから履歴を確認でき る