About This Page
This page is part of the Azure documentation. It contains code examples and configuration instructions for working with Azure services.
Bias Analysis
Bias Types:
⚠️
powershell_heavy
⚠️
windows_first
⚠️
missing_linux_example
Summary:
The documentation provides only a PowerShell script for deploying Arc-enabled ContainerApps, with no equivalent Bash or Linux shell example. All scripting and automation guidance is Windows-centric, assuming the user is running PowerShell. There is no mention of how to perform these steps on Linux or macOS, nor are cross-platform scripting patterns (such as Bash) provided.
Recommendations:
- Provide a Bash (Linux/macOS) equivalent script for all PowerShell examples, ensuring parity in automation guidance.
- Explicitly mention that the Azure CLI commands work cross-platform, and show how to run them in Bash or sh environments.
- Where possible, use cross-platform scripting patterns (e.g., Bash, Python, or plain Azure CLI commands) in examples, or provide both PowerShell and Bash versions side-by-side.
- Add notes or callouts clarifying any OS-specific requirements or differences.
- Ensure that clean-up and resource management examples are shown in both PowerShell and Bash formats.
Create pull request
Flagged Code Snippets
# . "./CreateArcEnabledAksOnEZ.ps1"
# Create a container app on an AKS cluster in an edge zone and connect it to Azure Arc-enabled Kubernetes
function CreateContainerAppOnArcEnabledAksEz {
param(
[string] $AKSClusterResourceGroupName,
[string] $location = "westus",
[string] $AKSName,
[string] $edgeZone,
[int] $nodeCount = 2,
[string] $vmSize = "standard_nv12ads_a10_v5",
[string] $ArcResourceGroupName,
[string] $CONNECTED_ENVIRONMENT_NAME,
[string] $CUSTOM_LOCATION_NAME,
[string] $SubscriptionId,
[string] $ACRName,
[string] $imageName,
[switch] $Debug
)
try {
# Set the subscription
az account set --subscription $SubscriptionId
# Create the Arc-enabled EZ AKS cluster
createArcEnabledAksOnEz -SubscriptionId $SubscriptionId -AKSClusterResourceGroupName $AKSClusterResourceGroupName -location $location -AKSName $AKSName -edgeZone $edgeZone -nodeCount $nodeCount -vmSize $vmSize -ArcResourceGroupName $ArcResourceGroupName -Debug:$Debug
# Install container apps extension
$CLUSTER_NAME = "$ArcResourceGroupName-cluster" # Name of the connected cluster resource
$EXTENSION_NAME="appenv-ext"
$NAMESPACE="app-ns"
az k8s-extension create `
--resource-group $ArcResourceGroupName `
--name $EXTENSION_NAME `
--cluster-type connectedClusters `
--cluster-name $CLUSTER_NAME `
--extension-type 'Microsoft.App.Environment' `
--release-train stable `
--auto-upgrade-minor-version true `
--scope cluster `
--release-namespace $NAMESPACE `
--configuration-settings "Microsoft.CustomLocation.ServiceAccount=default" `
--configuration-settings "appsNamespace=${NAMESPACE}" `
--configuration-settings "clusterName=${CONNECTED_ENVIRONMENT_NAME}" `
--configuration-settings "envoy.annotations.service.beta.kubernetes.io/azure-load-balancer-resource-group=${AKSClusterResourceGroupName}"
# Save id property of the Container Apps extension for later
$EXTENSION_ID=$(az k8s-extension show `
--cluster-type connectedClusters `
--cluster-name $CLUSTER_NAME `
--resource-group $ArcResourceGroupName `
--name $EXTENSION_NAME `
--query id `
--output tsv)
# Wait for extension to fully install before proceeding
az resource wait --ids $EXTENSION_ID --custom "properties.provisioningState!='Pending'" --api-version "2020-07-01-preview"
$CONNECTED_CLUSTER_ID=$(az connectedk8s show --resource-group $ArcResourceGroupName --name $CLUSTER_NAME --query id --output tsv)
az customlocation create `
--resource-group $ArcResourceGroupName `
--name $CUSTOM_LOCATION_NAME `
--host-resource-id $CONNECTED_CLUSTER_ID `
--namespace $NAMESPACE `
--cluster-extension-ids $EXTENSION_ID
# DEBUG: Test custom location creation
if ($Debug) {
Write-Debug az customlocation show --resource-group $ArcResourceGroupName --name $CUSTOM_LOCATION_NAME
}
# Save id property of the custom location for later
$CUSTOM_LOCATION_ID=$(az customlocation show `
--resource-group $ArcResourceGroupName `
--name $CUSTOM_LOCATION_NAME `
--query id `
--output tsv)
# Create container Apps connected environment
az containerapp connected-env create `
--resource-group $ArcResourceGroupName `
--name $CONNECTED_ENVIRONMENT_NAME `
--custom-location $CUSTOM_LOCATION_ID `
--location eastus
# DEBUG: validate that the connected environment is successfully created
if ($Debug) {
Write-Debug az containerapp connected-env show --resource-group $ArcResourceGroupName --name $CONNECTED_ENVIRONMENT_NAME
}
# Create a new resource group for the container app
$myResourceGroup="${imageName}-resource-group"
az group create --name $myResourceGroup --location eastus
# Get the custom location id
$customLocationId=$(az customlocation show --resource-group $ArcResourceGroupName --name $CUSTOM_LOCATION_NAME --query id --output tsv)
# Get info about the connected environment
$myContainerApp="${imageName}-container-app"
$myConnectedEnvironment=$(az containerapp connected-env list --custom-location $customLocationId -o tsv --query '[].id')
# create acr and group
az group create --name $ArcResourceGroupName --location eastus
az acr create --resource-group $ArcResourceGroupName --name $ACRName --sku Basic
# Wait for the ACR to be created
Start-Sleep -Seconds 10
# login to acr and get login server
az acr login --name $ACRName
$ACRLoginServer = $(az acr show --name $ACRName --query loginServer --output tsv)
# DEBUG: Test ACR login
if ($Debug) {
Write-Debug az acr show --name $ACRName
Write-Debug az acr repository list --name $ACRName --output table
}
# Build and push docker image
cd .\DemoApp
docker build -t ${imageName} .
docker tag ${imageName} ${ACRLoginServer}/${imageName}:latest
docker push ${ACRLoginServer}/${imageName}:latest
cd ..
# Enable admin user in ACR and get password
az acr update -n $ACRName --admin-enabled true
$password = $(az acr credential show --name ${ACRName} --query passwords[0].value --output tsv)
# Create container app
az containerapp create `
--resource-group $myResourceGroup `
--name $myContainerApp `
--environment $myConnectedEnvironment `
--environment-type connected `
--registry-server ${ACRLoginServer} `
--registry-username ${ACRName} `
--registry-password $password `
--image "${ACRLoginServer}/${imageName}:latest" `
--target-port 80 `
--ingress 'external' `
# Open the container app in a browser
az containerapp browse --resource-group $myResourceGroup --name $myContainerApp
}
catch {
# Catch any error
Write-Error "An error occurred"
Write-Error $Error[0]
}
}
CreateContainerAppOnArcEnabledAksEz -AKSClusterResourceGroupName "my-aks-cluster-group" `
-location "westus" `
-AKSName "my-aks-cluster"`
-edgeZone "losangeles" `
-nodeCount 2 `
-vmSize "standard_nv12ads_a10_v5" `
-ArcResourceGroupName "myArcResourceGroup" `
-CONNECTED_ENVIRONMENT_NAME "myConnectedEnvironment" `
-CUSTOM_LOCATION_NAME "myCustomLocation" `
-SubscriptionId "<your subscription>"`
-ACRName "containerappezacr" `
-imageName "myimage"