Slide 1

Slide 1 text

Azure PipelinesによるCI/CDと データベースデプロイの実践 2024/12/14 yuriemori, yutakaosada

Slide 2

Slide 2 text

Agenda  Introduction  自己紹介  Azure DevOpsでのデータスキーマのCI/CD設計  データスキーマのコード化  daqpacファイルをパイプラインで使う  パイプライン変数とシークレットの管理  Azure上のDocker Registryへのサービスコネクションの作成(テナントが同 じ場合)  Azure上のDocker Registryへのサービスコネクションの作成(クロステナン トの場合)  Demo(設定を見てみる)  dacpacを利用したデータベースデプロイの自動化  Demo(CI/CDをうごかす)  まとめ

Slide 3

Slide 3 text

Introduction

Slide 4

Slide 4 text

今日話すこと  データスキーマに変更がある場合のCI/CDはどうすればいいのか  アプリのソースコードだけじゃなくてデータスキーマもコード化して Reposでバージョン管理したほうがいいよね

Slide 5

Slide 5 text

Yurie Mori(森 友梨映)  DevOps Engineer @Avanade Japan  Microsoft MVP for Developer Technologies(DevOps) 2024~  お仕事  AgileとDevOpsの実践の支援  エンタープライズでのDevOpsソリューション( Azure DevOps/GitHub )の導入・ 構築  技術スタック  Azure DevOps, GitHub, Azure, .NET, C#  Please follow me

Slide 6

Slide 6 text

Yutaka Osada(長田 豊)  DevOps Engineer @Avanade Japan  お仕事  Azure PaaSによるソリューション構築  エンタープライズでのDevOpsソリューション( Azure DevOps/GitHub )の導入・ 構築  技術スタック  Azure DevOps, GitHub, Azure(PaaS), .NET, C#  Please follow me

Slide 7

Slide 7 text

Azure DevOpsでのデータスキーマの CI/CD設計

Slide 8

Slide 8 text

Azure DevOps データスキーマに変更がある場合もCI/CDしたい  データスキーマに変更がある場合(カラム構成が変わるなど)にそれらの変更も 含めてCI/CDしたい  データスキーマの変更はどうやってCI/CDすればいい?  データスキーマをAzure PipelinesでCI/CDする場合、Reposにその情報を持つ必要 があるけど、どうやって管理すればいい? Azure App Service Azure SQL Database Repos ソース管理 Pieplines CD pipeline Boards プロジェクト管理 どうやってAzure上のDBに データスキーマの定義を反 映する?

Slide 9

Slide 9 text

データスキーマのコード化  デースキーマをソースコードでバージョン管理する場合は、データベースのプロ ジェクトを作成します。  そのデータベースプロジェクトの中で.sqlファイルを作成し、データスキーマを定義 します。  このように、データスキーマをコード化してReposでバージョン管理することにより、 アプリケーションのソースと同様にコードレビューやPipelinesによるCI/CDが可能に なります。 Azure DevOps Repos Pipelines Azure SQL Database App Service PR Pipeline CI/CD Pipeline DDL文としてバージョン 管理を行う

Slide 10

Slide 10 text

daqpacファイルをパイプラインで使う ①データベースプロジェクトのソリューションの パスを指定してビルド ②データベースのソリューションをビルドするこ とでdaqpacファイルができるので、できた daqpacファイルをパイプラインの成果物にコピー  Pipelineの中でデータベースプロジェクトをビルドすることで、Dacpacが生成され、 それを基にデータベースへデプロイする Azure Managed DevOps Poolsを利用してMS Hosted用の windows-2022イメージを指定 ※後続のSqlAzureDacpacDeploymentタスクが Windows環境のみサポートしているため

Slide 11

Slide 11 text

daqpacファイルをパイプラインで使う ③daqpacファイルをパイプラインの成果物として 公開 ④デプロイ先のAzure上のAzure SQL DBへの接続 情報をセットしてパイプライン成果物に格納され たdqppacファイルをデプロイ  Pipelineの中でデータベースプロジェクトをビルドすることで、Dacpacが生成され、 それを基にデータベースへデプロイする

Slide 12

Slide 12 text

パイプライン変数とシークレットの管理 Azure DevOps Pipelines Service connection Library Docker Registry パイプライン変数 CD Pipeline Azure Azure Key Vault EventAtendeesApp--DatabaseName EventAtendeesApp-- SqlDbConnection EventAtendeesApp-- SqlPassword EventAtendeesApp-- SqlServerName EventAtendeesApp-- SqlUserName ‣パイプライン変数として可変項目を定義する ‣データベース接続文字列へパスワードを含む資格情報はPipelinesのLibraryとして定義し Key Vaultとリンクする Key Vaultに格納したsecret をLibraryからシークレットの名 称を指定して参照する

Slide 13

Slide 13 text

Azure上のDocker Registryへのサービスコネクション の作成(テナントが同じ場合) テナントA Azure DevOps サービスコネクション テナントA Entra ID リソースグループ サービスプリンシパル App Service Verify 権限設定 CI/CD Container Registry  Azure DevOpsとAzureを繋ぐサービスコネクションをWorkload Identity Federation で作成する場合、クライアントシークレットの運用管理が不要  テナントがAzure DevOps = Azureの場合は、Docker Registryとしてサービスコネク ションを作成することで、Pipelineの中で Docker@2 タスクを利用できる Docker@2 タスクを利用してAzure Container Registryへプッシュする

Slide 14

Slide 14 text

Azure上のDocker Registryへのサービスコネクション の作成(テナントが同じ場合) 下記が選択可能で、いずれも同じテナント (Azure DevOpsと紐づいているAzureテナン ト)のみコネクションを確立 • Workload Identity federation • Service Principal • Managed Identity

Slide 15

Slide 15 text

Azure上のDocker Registryへのサービスコネクション の作成(クロステナントの場合)  CI/CDパイプラインがいるAzure DevOpsをホストしているAzureテナントと、デプロイ先 のAzureテナントが違う場合はDocker Registryへのサービスコネクションが作成できない ため(2412時点Azure Resource Managerと異なりmanualを指定できない。)  そのため、クロステナントの場合はAzure Resource Managerのサービスコネクションを 作成して、パイプラインの中でAzure CLI経由でContainer Registryにpushする テナントA Azure DevOps サービスコネクション テナントB Entra ID リソースグループ サービスプリンシパル App Service Verify 権限設定 CI/CD Container Registry Azure Resource Manager Azure Resource Managerで確立した資格情報を用 いて、Azure CLI経由でContainer Registryへプッ シュする

Slide 16

Slide 16 text

Azure上のDocker Registryへのサービスコネクション の作成(クロステナントの場合) 下記が選択可能 • App registration (automatic) • App registration or managed identity (manual) • Managed Identity • Managed identity (agent-assigned) • Publish profile 下記が選択可能で、いずれも同じテナント (Azure DevOpsと紐づいているAzureテナント) のみコネクションを確立 • Workload Identity federation • Secret

Slide 17

Slide 17 text

ポイント  データスキーマの変更もCI/CDしたい場合は、データベースプロジェクトを作 成して.sqlファイルでデータスキーマをコード化してReposでバージョン管理す る  データベースプロジェクトをAzure Pipelinesでビルドするとデータスキーマの 定義を含むdaqpacファイルが生成されるので、そのdacpacファイルをデプロ イすることによりデータスキーマの変更をCI/CDできる

Slide 18

Slide 18 text

demo 実際にソース管理と設定を見てみる

Slide 19

Slide 19 text

demo architecture Azure Azure DevOps Service Principal SQL Database Dev/Stg Env Container Registry Azure Repos Azure Pipelines Environments Library Pipelines PR Pipeline CI/CD Pipeline Completed 1 2 5 4 Defender for Cloud DevOps Pull request Approved 3 Developer Reviewer Service connection 6 7 Pull Request作成時にPR Pipelineを起動 Key Vaultよりシークレット情報 を取得 Analize stageによる セキュリティチェック Azure DevOps for Workload identity DacpacによるDCL&DMLを実行 • Dev用のデータベース • Stg用のデータベース ※インスタンスは1つでDBを 環境単位で切り分け Key Vault Secret App Service Dev Env App Service Stg Env 承認プロセスが構成された環境へのRegistry Pushは、 承認者からの承認されるまで実行されない

Slide 20

Slide 20 text

demo Azure PipelinesでデータベースがCI/CDされるのを見てみる

Slide 21

Slide 21 text

まとめ

Slide 22

Slide 22 text

まとめ  データスキーマもコード化してバージョン管理しよう  データベースプロジェクトの作成  .sqlファイルでソースコードとして管理  データスキーマをCI/CDする場合は、daqpacファイルを使う  パイプラインの中でデータベースプロジェクトをビルドしてdaqpacファイルを生成  dacpacをデプロイすることによりデータスキーマの変更分をCI/CDできる  パイプラインの中でデータベースへのアクセスに必要なシークレットはAzure Key Vaultで安全に管理する  Azure Pipelines>LibraryからKey Vaultのシークレットを参照

Slide 23

Slide 23 text

 今回の内容(SQL DatabaseのデプロイメントをCI/CDで自動化する方法)はこ ちらのzennの記事を基にして拡張したものとなります  関連の公式docs等が知りたい方はアクセスしてみてください References zenn Demo ソースコード