Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

マルチテナントでのサービスコネクションを使用したAzure DevOps⇔Azure でのデプ...

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

TFSUGのAzure DevOpsオンラインVol.10で登壇させていただいた際の資料です。
https://tfsug.connpass.com/event/305525/

複数のAzureテナント構成でのAzure DevOpsでのCD pipelineの作り方とポイントについてお話させて頂きました。

yutakaosada

January 27, 2024
Tweet

More Decks by yutakaosada

Other Decks in Technology

Transcript

  1. Agenda  Introduction  自己紹介  マルチテナントでのAzure DevOps – Azureのリソース運用

     サービスコネクションによるテナントまたぎでのCD pipeline構築  Demo(Azure DevOpsで作成したサービスコネクションを経由して、Azure のAppServiceへデプロイ)  まとめ
  2. Yurie Mori(森 友梨映)  Agile Specialist @Avanade Japan  お仕事

     AgileとDevOpsの実践の支援  DevOpsソリューション( Azure DevOps/GitHub )の導入・構築  技術スタック  Azure DevOps, GitHub, Azure, .NET, C#  Please follow me
  3. Yutaka Osada(⾧田 豊)  Backend Developer @Avanade Japan  お仕事

     Azureコンポーネントを活用したサービス構築  技術検証、パフォーマンスチューニングを得意とし、T-SQLが好き。  技術スタック  C#, .NET, Azure(PaaS), Azure DevOps, Sitecore  Please follow me
  4. 背景  こんなお悩み相談がありました  単純にソース管理、プロジェクト管理としてAzure DevOpsを立てていて、Azureのリ ソースはAzure DevOpsをホストしているテナントとは別のテナントで運用していた  いざCDしたい!となったとき、テナントを超えてCD

    pipelineを構築しないといけなく なって困った(´・ω・`) テナントA Azure DevOps テナントB リソースグループ App Service Repos ソース管理 Pieplines CD pipeline Boards プロジェクト管理 どうやってテナントを超 えてデプロイする?
  5. サービスコネクションを使ってテナント跨ぎでサー ビスプリンシパルを使う  サービスコネクションとサービスプリンシパルを作成して、Azure DevOpsでテ ナントを跨いでテナントBのAzureリソースにアクセスするようにしてみる  手順はこんな感じ  Azureのリソース管理・運用を行っているテナントBで、テナントBのAzureリソース

    にアクセスできるサービスプリンシパルを作成  テナントAでホストされているAzure DevOpsで、テナントBのサービスプリンシパル へのサービスコネクションを作成して、それを経由してテナントを跨いでAzureリ ソースにアクセス
  6. アーキテクチャ構成イメージ テナントA Azure DevOps テナントB Repos ソース管理 Pieplines CD pipeline

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

    サービスプリンシパル App Service Repos Src 開発端末 Verify 権限設定 CI/CD Pullリクエストトリガー Src プッシュ mainブランチへのmergeをトリ ガーとして、テナントBにあるApp Serviceにデプロイする
  8. 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サイトが表示されることを 確認する
  9. 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サイ トが表示されることを確 認する
  10. まとめ  Azure DevOpsからテナントを跨いでAzureリソースにアクセスしたい場合は、 ターゲットのテナントにサービスプリンシパルを作成する  Azure DevOpsからサービスコネクションを作成することによって、ターゲッ トのテナントに作成したサービスプリンシパルへの接続が可能になる 

    DevOpsのプロセス(Plan-build-release-maintenance)の中では、Azure DevOpsだけでなくAzureとのコラボレーションが想定されるので、それを前提 としたテナント構成を考えることが大事  環境構築(IaCによるApp Service等のAzureリソースの作成)  release以降のプロセス(今回のようなCD pipelineによる自動デプロイ、 Application Insightの結果をダッシュボードに表示する等)
  11. 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となることを確 認する
  12. 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' ```