Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Execute Azure deployments using azd, Terraform, or Bicep with built-in error recovery.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/recipes/azd/scripts/grant-and-migrate.sh
1#!/bin/bash2# Grant Azure SQL data-plane access to the managed identity AND apply EF Core migrations.3#4# USAGE: Copy this file to scripts/grant-and-migrate.sh in your project root and add5# a postprovision hook in azure.yaml:6#7# hooks:8# postprovision:9# posix:10# shell: sh11# run: ./scripts/grant-and-migrate.sh12# windows:13# shell: pwsh14# run: ./scripts/grant-and-migrate.ps115#16# ENVIRONMENT VARIABLES (sourced from azd env):17# SQL_SERVER - SQL server name (without .database.windows.net)18# SQL_DATABASE - Database name19# AZURE_RESOURCE_GROUP - Resource group name20# SERVICE_WEB_NAME - App Service name (used when set, takes priority)21# SERVICE_API_NAME - API service name (fallback when SERVICE_WEB_NAME is not set)22#23# CONFIGURATION:24# Set APP_PROJECT_PATH below to the path of your application project (.csproj directory)2526set -e2728APP_PROJECT_PATH="src/api" # Adjust to your project directory2930# Safely load azd environment variables without eval31while IFS= read -r line; do32[ -n "$line" ] || continue33key=${line%%=*}34value=${line#*=}35case "$value" in36\"*\") value=${value#\"}; value=${value%\"} ;;37\'*\') value=${value#\'}; value=${value%\'} ;;38esac39export "$key=$value"40done < <(azd env get-values)4142# Determine app identity name (App Service uses SERVICE_WEB_NAME, APIs use SERVICE_API_NAME)43APP_NAME=${SERVICE_WEB_NAME:-$SERVICE_API_NAME}4445if [ -z "$APP_NAME" ]; then46echo "ERROR: Neither SERVICE_WEB_NAME nor SERVICE_API_NAME is set in azd environment." >&247exit 148fi4950# ─── Step 1: Grant SQL data-plane access ────────────────────────────────────51echo "Granting SQL data-plane access to managed identity: $APP_NAME"5253# Ensure the rdbms-connect extension is installed (provides 'az sql db query')54if ! az extension show --name rdbms-connect >/dev/null 2>&1; then55echo "Installing Azure CLI extension: rdbms-connect"56if ! az extension add --name rdbms-connect --yes; then57echo "ERROR: Failed to install required Azure CLI extension 'rdbms-connect'. Cannot continue with 'az sql db query'." >&258exit 159fi60fi6162az sql db query \63--server "$SQL_SERVER" \64--database "$SQL_DATABASE" \65--resource-group "$AZURE_RESOURCE_GROUP" \66--auth-mode ActiveDirectoryDefault \67--queries "68IF NOT EXISTS (SELECT * FROM sys.database_principals WHERE name = '$APP_NAME')69CREATE USER [$APP_NAME] FROM EXTERNAL PROVIDER;7071IF NOT EXISTS (72SELECT 1 FROM sys.database_role_members drm73JOIN sys.database_principals r ON drm.role_principal_id = r.principal_id74JOIN sys.database_principals m ON drm.member_principal_id = m.principal_id75WHERE r.name = 'db_datareader' AND m.name = '$APP_NAME'76)77ALTER ROLE db_datareader ADD MEMBER [$APP_NAME];7879IF NOT EXISTS (80SELECT 1 FROM sys.database_role_members drm81JOIN sys.database_principals r ON drm.role_principal_id = r.principal_id82JOIN sys.database_principals m ON drm.member_principal_id = m.principal_id83WHERE r.name = 'db_datawriter' AND m.name = '$APP_NAME'84)85ALTER ROLE db_datawriter ADD MEMBER [$APP_NAME];8687IF NOT EXISTS (88SELECT 1 FROM sys.database_role_members drm89JOIN sys.database_principals r ON drm.role_principal_id = r.principal_id90JOIN sys.database_principals m ON drm.member_principal_id = m.principal_id91WHERE r.name = 'db_ddladmin' AND m.name = '$APP_NAME'92)93ALTER ROLE db_ddladmin ADD MEMBER [$APP_NAME];94"9596echo "SQL access granted successfully."9798# ─── Step 2: Apply EF Core migrations ───────────────────────────────────────99# Install dotnet-ef only when it is not already installed (no-op when already present)100if ! dotnet tool list --global 2>/dev/null | grep -q '^\s*dotnet-ef\s'; then101dotnet tool install --global dotnet-ef102fi103export PATH="$PATH:$HOME/.dotnet/tools"104105CONNECTION_STRING="Server=tcp:${SQL_SERVER}.database.windows.net,1433;Database=${SQL_DATABASE};Authentication=Active Directory Default;Encrypt=True;"106107echo "Applying EF Core migrations..."108cd "$APP_PROJECT_PATH"109dotnet ef database update --connection "$CONNECTION_STRING"110echo "Migrations applied successfully."111