次の方法で共有


チュートリアル: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] を選択します

Create コンテナー アプリ

まず、システム割り当てマネージド ID を使用して Azure Container Apps インスタンスを作成します。 この ID には、最終的に、Azure SQLおよびAzure Container Registryにアクセスするためのロールベースのアクセス制御アクセス許可が付与されます。

  1. このチュートリアルの後半で、複数のリソース名に使用する汎用SUFFIX変数をCreateします。

    let SUFFIX=$RANDOM*$RANDOM
    
  2. このチュートリアルでLOCATION使用するように選択した Azure リージョンを含む変数をCreateします。

    LOCATION="<azure-region>"
    

    注意

    たとえば、 米国西部 リージョンにデプロイする場合は、このスクリプトを使用します。

    LOCATION="westus"
    

    現在のサブスクリプションでサポートされているリージョンの一覧については、 az account list-locations

    az account list-locations --query "[].{Name:displayName,Slug:name}" --output table
    

    詳細については、「Azure のリージョン」をご覧ください。

  3. という名前RESOURCE_GROUP_NAMEの変数をリソース グループ名でCreateします。 このチュートリアルでは、 をお勧めします msdocs-dab-*。 この値は、このチュートリアルで複数回使用します。

    RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"    
    
  4. を使用して新しいリソース グループをaz group createCreateします。

    az group create \
      --name $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --tag "source=msdocs-dab-tutorial"
    
  5. azure Container Apps インスタンスに対して、 と という名前API_CONTAINER_NAMECONTAINER_ENV_NAME一意に生成された名前を持つ変数をCreateします。 これらの変数は、チュートリアル全体で使用します。

    API_CONTAINER_NAME="api$SUFFIX"
    CONTAINER_ENV_NAME="env$SUFFIX"
    
  6. を使用して 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
    
  7. を使用して新しいコンテナー アプリをCreateするmcr.microsoft.com/azure-databases/data-api-builderDAB コンテナー イメージと 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
    
  8. を使用して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 アクセス許可を割り当てます。

  1. という名前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
    
  2. を使用して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
    
  3. もう一度 を使用して、マネージド 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 サンプル データセットを使用します。

  1. Azure SQL サーバー インスタンスの一意に生成された名前を持つ という名前SQL_SERVER_NAMEの変数をCreateします。 この変数は、このセクションの後半で使用します。

    SQL_SERVER_NAME="srvr$SUFFIX"
    
  2. を使用して新しいAzure SQL サーバー リソースをaz sql server createCreateします。 このサーバーの管理者としてマネージド 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
    
  3. を使用して 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"
    
  4. を使用して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"
    
  5. 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 インスタンスにデプロイします。

  1. Azure Container Registry インスタンスの一意に生成された名前を持つ という名前CONTAINER_REGISTRY_NAMEの変数をCreateします。 この変数は、このセクションの後半で使用します。

    CONTAINER_REGISTRY_NAME="reg$SUFFIX"
    
  2. を使用して新しいAzure Container Registry インスタンスをaz acr createCreateします。

    az acr create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_REGISTRY_NAME \
      --sku "Standard" \
      --location $LOCATION \
      --admin-enabled false
    
  3. という名前Dockerfileのマルチステージ Dockerfile をCreateします。 ファイルで、次の手順を実装します。

    • ビルド ステージの mcr.microsoft.com/dotnet/sdk ベースとしてコンテナー イメージを使用する

    • DAB CLI をインストールします。

    • 環境変数を接続文字列として使用して、SQL データベース接続 (mssql) のDATABASE_CONNECTION_STRING構成ファイルをCreateします。

    • テーブルにマップされた という名前ProductのエンティティをSalesLT.ProductCreateします。

    • 構成ファイルを最終的 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
    
  4. を使用して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 \
      .
    
  5. を使用して 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 を更新します。 実行中のアプリケーションをテストして、データベースへの接続を検証します。

  1. を使用してコンテナー レジストリを使用するようにコンテナー アプリを az containerapp registry set構成します。

    az containerapp registry set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $API_CONTAINER_NAME \
      --server $CONTAINER_REGISTRY_LOGIN_SERVER \
      --identity "system"
    
  2. を使用して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 データベースにアクセスします。 これにより、接続文字列をホスト内のシークレットとして安全に使用できます。

  3. を使用して、新しいカスタム コンテナー イメージでコンテナー アプリを 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
    
  4. を使用して、実行中のコンテナー アプリの最新のリビジョンの完全修飾ドメイン名を 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
    
  5. URL に移動し、REST API をテストします Product

    echo "https://$APPLICATION_URL/api/Product"
    

    警告

    デプロイには最大で 1 分かかる場合があります。 正常な応答が表示されない場合は、ブラウザーを待機して更新します。

リソースをクリーンアップする

サンプル アプリケーションまたはリソースが不要になったら、対応するデプロイとすべてのリソースを削除します。

az group delete \
  --name $RESOURCE_GROUP_NAME

次のステップ