チュートリアル:Azure CLI を使用してデータ API ビルダーを Azure Container Apps にデプロイする
データ API ビルダーは、アプリケーション スタックの一部として Azure Container Apps などの Azure サービスにすばやくデプロイできます。 このチュートリアルでは、Azure CLI を使用して、データ API ビルダーを Azure にデプロイするときの一般的なタスクを自動化します。 まず、Data API ビルダーを使用してコンテナー イメージをビルドし、Azure Container Registryに格納します。 次に、データベースのバッキングを使用して、コンテナー イメージAzure SQL Azure Container Apps にデプロイします。 チュートリアル全体で、マネージド ID を使用して各コンポーネントに対して認証を行います。
このチュートリアルでは、次のことを行いました。
- ロールベースのアクセス制御アクセス許可を持つマネージド ID をCreateする
- サンプルの AdventureWorksLT データセットを使用してAzure SQLをデプロイする
- Azure Container Registryでコンテナー イメージをステージングする
- Data API Builder コンテナー イメージを使用して Azure Container App をデプロイする
Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
前提条件
- Azure サブスクリプション
- Azure Cloud Shell
- Azure Cloud Shell は、ブラウザーを介して使用できる対話型シェル環境です。 このシェルとそのプレインストールされたコマンドを使用して、ローカル環境に何もインストールしなくても、この記事のコードを実行します。 Azure Cloud Shell を開始するには、以下のようにします。
- この記事内のコードまたはコマンド ブロックで [ 試してみる ] を選択します。 [試してみる] を選択しても、コードまたはコマンドがCloud Shellに自動的にコピーされることはありません。
- にhttps://shell.azure.com移動するか、[Cloud Shellの起動] を選択します。
- Azure portal (https://portal.azure.com) のメニュー バーで [Cloud Shell] を選択します
- Azure Cloud Shell は、ブラウザーを介して使用できる対話型シェル環境です。 このシェルとそのプレインストールされたコマンドを使用して、ローカル環境に何もインストールしなくても、この記事のコードを実行します。 Azure Cloud Shell を開始するには、以下のようにします。
Create コンテナー アプリ
まず、システム割り当てマネージド ID を使用して Azure Container Apps インスタンスを作成します。 この ID には、最終的に、Azure SQLおよびAzure Container Registryにアクセスするためのロールベースのアクセス制御アクセス許可が付与されます。
このチュートリアルの後半で、複数のリソース名に使用する汎用
SUFFIX
変数をCreateします。let SUFFIX=$RANDOM*$RANDOM
このチュートリアルで
LOCATION
使用するように選択した Azure リージョンを含む変数をCreateします。LOCATION="<azure-region>"
注意
たとえば、 米国西部 リージョンにデプロイする場合は、このスクリプトを使用します。
LOCATION="westus"
現在のサブスクリプションでサポートされているリージョンの一覧については、
az account list-locations
az account list-locations --query "[].{Name:displayName,Slug:name}" --output table
詳細については、「Azure のリージョン」をご覧ください。
という名前
RESOURCE_GROUP_NAME
の変数をリソース グループ名でCreateします。 このチュートリアルでは、 をお勧めしますmsdocs-dab-*
。 この値は、このチュートリアルで複数回使用します。RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"
を使用して新しいリソース グループを
az group create
Createします。az group create \ --name $RESOURCE_GROUP_NAME \ --location $LOCATION \ --tag "source=msdocs-dab-tutorial"
azure Container Apps インスタンスに対して、 と という名前
API_CONTAINER_NAME
のCONTAINER_ENV_NAME
一意に生成された名前を持つ変数をCreateします。 これらの変数は、チュートリアル全体で使用します。API_CONTAINER_NAME="api$SUFFIX" CONTAINER_ENV_NAME="env$SUFFIX"
を使用して
az containerapp env create
、新しい Azure Container Apps 環境を作成します。az containerapp env create \ --resource-group $RESOURCE_GROUP_NAME \ --name $CONTAINER_ENV_NAME \ --logs-destination none \ --location $LOCATION
を使用して新しいコンテナー アプリをCreateする
mcr.microsoft.com/azure-databases/data-api-builder
DAB コンテナー イメージとaz containerapp create
コマンド。 このコンテナー アプリは正常に実行されますが、どのデータベースにも接続されていません。az containerapp create \ --resource-group $RESOURCE_GROUP_NAME \ --environment $CONTAINER_ENV_NAME \ --name $API_CONTAINER_NAME \ --image "mcr.microsoft.com/azure-databases/data-api-builder" \ --ingress "external" \ --target-port "5000" \ --system-assigned
を使用して
az identity show
マネージド ID のプリンシパル識別子を取得し、 という名前MANAGED_IDENTITY_PRINCIPAL_ID
の変数に値を格納します。MANAGED_IDENTITY_PRINCIPAL_ID=$( \ az containerapp show \ --resource-group $RESOURCE_GROUP_NAME \ --name $API_CONTAINER_NAME \ --query "identity.principalId" \ --output "tsv" \ )
ヒント
このコマンドの出力はいつでもチェックできます。
echo $MANAGED_IDENTITY_PRINCIPAL_ID
アクセス許可の割り当て
次に、システム割り当てマネージド ID のアクセス許可を割り当てて、Azure SQLとAzure Container Registryからデータを読み取ります。 さらに、Azure Container Registryに書き込む ID アクセス許可を割り当てます。
という名前
RESOURCE_GROUP_ID
の変数をCreateして、リソース グループの識別子を格納します。 を使用して識別子をaz group show
取得します。 この変数は、このチュートリアルで複数回使用します。RESOURCE_GROUP_ID=$( \ az group show \ --name $RESOURCE_GROUP_NAME \ --query "id" \ --output "tsv" \ )
ヒント
このコマンドの出力はいつでもチェックできます。
echo $RESOURCE_GROUP_ID
を使用して
az role assignment create
アカウントに AcrPush ロールを割り当てて、コンテナーをAzure Container Registryにプッシュできるようにします。CURRENT_USER_PRINCIPAL_ID=$( \ az ad signed-in-user show \ --query "id" \ --output "tsv" \ ) # AcrPush az role assignment create \ --assignee $CURRENT_USER_PRINCIPAL_ID \ --role "8311e382-0749-4cb8-b61a-304f252e45ec" \ --scope $RESOURCE_GROUP_ID
もう一度 を使用して、マネージド ID に AcrPull ロールを
az role assignment create
割り当てます。 この割り当てにより、マネージド ID はAzure Container Registryからコンテナー イメージをプルできます。 マネージド ID は最終的に Azure Container Apps インスタンスに割り当てられます。# AcrPull az role assignment create \ --assignee $MANAGED_IDENTITY_PRINCIPAL_ID \ --role "7f951dda-4ed3-4680-a7ca-43fe172d538d" \ --scope $RESOURCE_GROUP_ID
データベースをデプロイする
次に、Azure SQL サービスに新しいサーバーとデータベースをデプロイします。 データベースは AdventureWorksLT サンプル データセットを使用します。
Azure SQL サーバー インスタンスの一意に生成された名前を持つ という名前
SQL_SERVER_NAME
の変数をCreateします。 この変数は、このセクションの後半で使用します。SQL_SERVER_NAME="srvr$SUFFIX"
を使用して新しいAzure SQL サーバー リソースを
az sql server create
Createします。 このサーバーの管理者としてマネージド ID を構成します。az sql server create \ --resource-group $RESOURCE_GROUP_NAME \ --name $SQL_SERVER_NAME \ --location $LOCATION \ --enable-ad-only-auth \ --external-admin-principal-type "User" \ --external-admin-name $API_CONTAINER_NAME \ --external-admin-sid $MANAGED_IDENTITY_PRINCIPAL_ID
を使用して
az sql server firewall-rule create
、Azure サービスからのアクセスを許可するファイアウォール規則を作成します。az sql server firewall-rule create \ --resource-group $RESOURCE_GROUP_NAME \ --server $SQL_SERVER_NAME \ --name "AllowAzure" \ --start-ip-address "0.0.0.0" \ --end-ip-address "0.0.0.0"
を使用して
az sql db create
、 という名前adventureworks
のAzure SQL サーバー内にデータベースを作成します。 サンプル データを使用するようにデータベースをAdventureWorksLT
構成します。az sql db create \ --resource-group $RESOURCE_GROUP_NAME \ --server $SQL_SERVER_NAME \ --name "adventureworks" \ --sample-name "AdventureWorksLT"
Azure SQL サーバー インスタンス内のデータベースの接続文字列で
adventureworks
という名前SQL_CONNECTION_STRING
の変数をCreateします。 を使用して、サーバーの完全修飾ドメイン名を使用して接続文字列をaz sql server show
構築します。 この変数は、このチュートリアルの後半で使用します。SQL_SERVER_ENDPOINT=$( \ az sql server show \ --resource-group $RESOURCE_GROUP_NAME \ --name $SQL_SERVER_NAME \ --query "fullyQualifiedDomainName" \ --output "tsv" \ ) SQL_CONNECTION_STRING="Server=$SQL_SERVER_ENDPOINT;Database=adventureworks;Encrypt=true;Authentication=Active Directory Default;"
ヒント
このコマンドの出力はいつでもチェックできます。
echo $SQL_CONNECTION_STRING
コンテナー イメージの構築
次に、Dockerfile を使用してコンテナー イメージをビルドします。 次に、そのコンテナー イメージを新しく作成された Azure Container Registry インスタンスにデプロイします。
Azure Container Registry インスタンスの一意に生成された名前を持つ という名前
CONTAINER_REGISTRY_NAME
の変数をCreateします。 この変数は、このセクションの後半で使用します。CONTAINER_REGISTRY_NAME="reg$SUFFIX"
を使用して新しいAzure Container Registry インスタンスを
az acr create
Createします。az acr create \ --resource-group $RESOURCE_GROUP_NAME \ --name $CONTAINER_REGISTRY_NAME \ --sku "Standard" \ --location $LOCATION \ --admin-enabled false
という名前
Dockerfile
のマルチステージ Dockerfile をCreateします。 ファイルで、次の手順を実装します。ビルド ステージの
mcr.microsoft.com/dotnet/sdk
ベースとしてコンテナー イメージを使用するDAB CLI をインストールします。
環境変数を接続文字列として使用して、SQL データベース接続 (
mssql
) のDATABASE_CONNECTION_STRING
構成ファイルをCreateします。テーブルにマップされた という名前
Product
のエンティティをSalesLT.Product
Createします。構成ファイルを最終的
mcr.microsoft.com/azure-databases/data-api-builder
なコンテナー イメージにコピーします。
FROM mcr.microsoft.com/dotnet/sdk:6.0-cbl-mariner2.0 AS build WORKDIR /config RUN dotnet new tool-manifest RUN dotnet tool install Microsoft.DataApiBuilder RUN dotnet tool run dab -- init --database-type "mssql" --connection-string "@env('DATABASE_CONNECTION_STRING')" RUN dotnet tool run dab -- add Product --source "SalesLT.Product" --permissions "anonymous:read" FROM mcr.microsoft.com/azure-databases/data-api-builder COPY --from=build /config /App
を使用して
az acr build
、Dockerfile をAzure Container Registry タスクとしてビルドします。az acr build \ --registry $CONTAINER_REGISTRY_NAME \ --image adventureworkslt-dab:latest \ --image adventureworkslt-dab:{{.Run.ID}} \ --file Dockerfile \ .
を使用して
az acr show
コンテナー レジストリのエンドポイントを取得し、 という名前CONTAINER_REGISTRY_LOGIN_SERVER
の変数に格納します。CONTAINER_REGISTRY_LOGIN_SERVER=$( \ az acr show \ --resource-group $RESOURCE_GROUP_NAME \ --name $CONTAINER_REGISTRY_NAME \ --query "loginServer" \ --output "tsv" \ )
ヒント
このコマンドの出力はいつでもチェックできます。
echo $CONTAINER_REGISTRY_LOGIN_SERVER
コンテナー イメージをデプロイする
最後に、新しいカスタム コンテナー イメージと資格情報を使用して Azure Container App を更新します。 実行中のアプリケーションをテストして、データベースへの接続を検証します。
を使用してコンテナー レジストリを使用するようにコンテナー アプリを
az containerapp registry set
構成します。az containerapp registry set \ --resource-group $RESOURCE_GROUP_NAME \ --name $API_CONTAINER_NAME \ --server $CONTAINER_REGISTRY_LOGIN_SERVER \ --identity "system"
を使用して
az containerapp secret set
、 Azure SQL 接続文字列で という名前conn-string
のシークレットを作成します。az containerapp secret set \ --resource-group $RESOURCE_GROUP_NAME \ --name $API_CONTAINER_NAME \ --secrets conn-string="$SQL_CONNECTION_STRING"
重要
この接続文字列には、ユーザー名やパスワードは含まれません。 接続文字列では、マネージド ID を使用してAzure SQL データベースにアクセスします。 これにより、接続文字列をホスト内のシークレットとして安全に使用できます。
を使用して、新しいカスタム コンテナー イメージでコンテナー アプリを
az containerapp update
更新します。 前に作成conn-string
したDATABASE_CONNECTION_STRING
シークレットから読み取る環境変数を設定します。az containerapp update \ --resource-group $RESOURCE_GROUP_NAME \ --name $API_CONTAINER_NAME \ --image "$CONTAINER_REGISTRY_LOGIN_SERVER/adventureworkslt-dab:latest" \ --set-env-vars DATABASE_CONNECTION_STRING=secretref:conn-string
を使用して、実行中のコンテナー アプリの最新のリビジョンの完全修飾ドメイン名を
az containerapp show
取得します。 その値を という名前APPLICATION_URL
の変数に格納します。APPLICATION_URL=$( \ az containerapp show \ --resource-group $RESOURCE_GROUP_NAME \ --name $API_CONTAINER_NAME \ --query "properties.latestRevisionFqdn" \ --output "tsv" \ )
ヒント
このコマンドの出力はいつでもチェックできます。
echo $APPLICATION_URL
URL に移動し、REST API をテストします
Product
。echo "https://$APPLICATION_URL/api/Product"
警告
デプロイには最大で 1 分かかる場合があります。 正常な応答が表示されない場合は、ブラウザーを待機して更新します。
リソースをクリーンアップする
サンプル アプリケーションまたはリソースが不要になったら、対応するデプロイとすべてのリソースを削除します。
az group delete \
--name $RESOURCE_GROUP_NAME