Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Azure Developer CLI (azd) har utökats för att stödja driftsättningen av projekt Aspire. Använd den här guiden för att gå igenom processen med att skapa och distribuera ett Aspire-projekt till Azure Container Apps med hjälp av Azure Developer CLI. I den här självstudien får du lära dig följande begrepp:
- Utforska hur
azdintegrering fungerar med Aspire projekt - Etablera och distribuera resurser för Azure ett Aspire projekt med hjälp av
azd - Generera Bicep-infrastruktur och andra mallfiler med hjälp av
azd
Förutsättningar
För att arbeta med Aspirebehöver du följande installerat lokalt:
-
.NET 8.0 eller .NET 9.0.
- Från och med Aspire 9.4 .NET stöds 10 Förhandsversion 5 eller senare .
- En OCI-kompatibel containerkörmiljö, till exempel:
- Docker Desktop eller Podman. Mer information finns i Container Runtime.
- En IDE (Integrated Developer Environment) eller kodredigerare, till exempel:
- Visual Studio 2022 version 17.9 eller senare (valfritt)
-
Visual Studio Code (valfritt)
- C# Dev Kit: Tillägg (valfritt)
- JetBrains Rider med Aspire plugin (valfritt)
Mer information finns iAspire konfiguration och verktyg och Aspire SDK.
Du måste också ha Azure Developer CLI. Vanliga installationsalternativ är följande:
Så Azure Developer CLI här fungerar integrering
Arbetsflödet azd init ger anpassat stöd för Aspire projekt. Följande diagram visar hur det här flödet fungerar konceptuellt och hur azd och Aspire är integrerat:
- När
azdriktar sig mot ett Aspire projekt startar det AppHost med ett särskilt kommando (dotnet run --project AppHost.csproj --output-path manifest.json --publisher manifest), vilket genererar Aspiremanifestfilen. - Manifestfilen granskas av
azd provisionsubkommando-logik för att generera endast Bicep-filer i minnet (som standard). - När du har genererat Bicep-filerna utlöses en distribution med ARM-API:er Azure för prenumerationen och resursgruppen som tidigare angavs.
- När de underliggande Azure resurserna har konfigurerats, körs då
azd deployunderkommandologiken som använder samma Aspire manifestfil. - Som en del av distributionen gör
azdett anrop tilldotnet publishför att använda .NETs inbyggda stöd för containerpublicering för att generera containeravbildningar. - När
azdhar byggt containeravbildningarna skickas de till ACR-registret som skapades under etableringsfasen. - Slutligen, när containeravbildningen är i ACR, uppdaterar
azdresursen med ARM för att börja använda den nya versionen av containeravbildningen.
Anmärkning
azd möjliggör även att du kan mata ut den genererade Bicep-filen till en infra mapp i ditt projekt, vilket du kan läsa mer om i avsnittet Generera Bicep från Aspire appmodell.
Etablera och distribuera en Aspire startapp
Stegen i det här avsnittet visar hur du skapar en Aspire startapp och hanterar etablering och distribution av appresurser till Azure med hjälp av azd.
Skapa startappen Aspire
Skapa ett nytt Aspire projekt med kommandot dotnet new . Du kan också skapa projektet med hjälp av Visual Studio.
dotnet new aspire-starter --use-redis-cache -o AspireSample
cd AspireSample
dotnet run --project AspireSample.AppHost\AspireSample.AppHost.csproj
Föregående kommandon skapar ett nytt Aspire projekt baserat på mallen aspire-starter som innehåller ett beroende av Redis cacheminnet. Det kör Aspire projektet som verifierar att allt fungerar korrekt.
Initiera mallen
Öppna ett nytt terminalfönster och
cdi katalogen för din Aspire lösning.Kör kommandot
azd initför att initiera projektet medazd, som kommer att granska den lokala katalogstrukturen och fastställa typen av app.azd initMer information om kommandot
azd initfinns i azd init.Välj Använd kod i den aktuella katalogen när
azddu uppmanas att använda tre alternativ för appinitiering.? How do you want to initialize your app? [Use arrows to move, type to filter] > Use code in the current directory Select a template Create a minimal projectNär du har genomsökt katalogen
azduppmanas du att bekräfta att den hittade rätt AspireAppHost-projekt . Välj alternativet Bekräfta och fortsätt initiera min app.Detected services: .NET (Aspire) Detected in: D:\source\repos\AspireSample\AspireSample.AppHost\AspireSample.AppHost.csproj azd will generate the files necessary to host your app on Azure using Azure Container Apps. ? Select an option [Use arrows to move, type to filter] > Confirm and continue initializing my app Cancel and exitAnge ett miljönamn som används för att namnge etablerade resurser i Azure och hantera olika miljöer, till exempel
devochprod.Generating files to run your app on Azure: (✓) Done: Generating ./azure.yaml (✓) Done: Generating ./next-steps.md SUCCESS: Your app is ready for the cloud! You can provision and deploy your app to Azure by running the azd up command in this directory. For more information on configuring your app, see ./next-steps.md
azd genererar ett antal filer och placerar dem i arbetskatalogen. Dessa filer är:
- azure.yaml: Beskriver tjänsterna i appen, till exempel Aspire AppHost-projekt, och mappar dem till Azure resurser.
-
.azure/config.json: Konfigurationsfil som informerar
azdvad den aktuella aktiva miljön är. - .azure/aspireazddev/.env: Innehåller miljöspecifika åsidosättningar.
Filen azure.yaml har följande innehåll:
# yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json
name: AspireSample
services:
app:
language: dotnet
project: .\AspireSample.AppHost\AspireSample.AppHost.csproj
host: containerapp
Resursnamngivning
När du skapar nya Azure resurser är det viktigt att följa namngivningskraven. För Azure Container Appsmåste namnet vara 2–32 tecken långt och bestå av gemener, siffror och bindestreck. Namnet måste börja med en bokstav och sluta med ett alfanumeriskt tecken.
Mer information finns i Namngivningsregler och begränsningar för Azure resurser.
Inledande distribution
För att implementera Aspire-projektet autentiserar du mot Azure AD för att anropa Azure API:er för resurshantering.
azd auth loginFöregående kommando startar en webbläsare för att autentisera kommandoradssessionen.
När du har autentiserats kör du följande kommando från AppHost-projektkatalogen för att etablera och distribuera programmet.
azd upViktigt!
Om du vill skicka containeravbildningar Azure till Container Registry (ACR) måste du ha
Microsoft.Authorization/roleAssignments/writeåtkomst. Detta kan uppnås genom att aktivera en administratörsanvändare i registret. Öppna portalen Azure , gå till ACR-resursen/Inställningar/Åtkomstnycklar och markera sedan kryssrutan Administratörsanvändare . Mer information finns i Aktivera administratörsanvändare.När du uppmanas till det väljer du den prenumeration och plats som resurserna ska distribueras till. När de här alternativen har valts Aspire implementeras projektet.
By default, a service can only be reached from inside the Azure Container Apps environment it is running in. Selecting a service here will also allow it to be reached from the Internet. ? Select which services to expose to the Internet webfrontend ? Select an Azure Subscription to use: 1. <YOUR SUBSCRIPTION> ? Select an Azure location to use: 1. <YOUR LOCATION> Packaging services (azd package) Provisioning Azure resources (azd provision) Provisioning Azure resources can take some time. Subscription: <YOUR SUBSCRIPTION> Location: <YOUR LOCATION> You can view detailed progress in the Azure Portal: <LINK TO DEPLOYMENT> (✓) Done: Resource group: <YOUR RESOURCE GROUP> (✓) Done: Container Registry: <ID> (✓) Done: Log Analytics workspace: <ID> (✓) Done: Container Apps Environment: <ID> SUCCESS: Your application was provisioned in Azure in 1 minute 13 seconds. You can view the resources created under the resource group <YOUR RESOURCE GROUP> in Azure Portal: <LINK TO RESOURCE GROUP OVERVIEW> Deploying services (azd deploy) (✓) Done: Deploying service apiservice - Endpoint: <YOUR UNIQUE apiservice APP>.azurecontainerapps.io/ (✓) Done: Deploying service webfrontend - Endpoint: <YOUR UNIQUE webfrontend APP>.azurecontainerapps.io/ Aspire Dashboard: <LINK TO DEPLOYED Aspire DASHBOARD> SUCCESS: Your up workflow to provision and deploy to Azure completed in 3 minutes 50 seconds.Den sista raden med utdata från
azdkommandot är en länk till portalen Azure som visar alla Azure resurser som har distribuerats:
Tre containrar distribueras i det här programmet:
-
webfrontend: Innehåller kod från webbprojektet i startmallen. -
apiservice: Innehåller kod från API-tjänstprojektet i startmallen. -
cache: En Redis containeravbildning för att tillhandahålla en cache till klientdelen.
Precis som i lokal utveckling har konfigurationen av anslutningssträngar hanterats automatiskt. I det här fallet azd var det ansvarigt för att tolka programmodellen och översätta den till lämpliga distributionssteg. Tänk till exempel på de anslutningssträngs- och tjänstidentifieringsvariabler som matas in i containern så att den webfrontend vet hur man ansluter till cachen Redis och apiservice.
Mer information om hur Aspire projektet hanterar anslutningssträngar och tjänstupptäckt, finns i orkestreringsöversikten Aspire.
Distribuera programuppdateringar
azd up När kommandot körs Azure de underliggande resurserna och en containeravbildning skapas och distribueras till de containerappar som är värdar för Aspire projektet. När utvecklingen är igång och Azure resurserna har distribuerats är det vanligtvis inte nödvändigt att etablera Azure resurser varje gång koden uppdateras. Detta gäller särskilt för utvecklarens inre loop.
För att påskynda distributionen av kodändringar stöder azd att implementera koduppdateringar i containerbilder. Detta görs med kommandot azd deploy :
azd deploy
Deploying services (azd deploy)
(✓) Done: Deploying service apiservice
- Endpoint: <YOUR UNIQUE apiservice APP>.azurecontainerapps.io/
(✓) Done: Deploying service webfrontend
- Endpoint: <YOUR UNIQUE webfrontend APP>.azurecontainerapps.io/
Aspire Dashboard: <LINK TO DEPLOYED Aspire DASHBOARD>
Det är inte nödvändigt att distribuera alla tjänster varje gång.
azd
Aspire förstår projektmodellen, är det möjligt att distribuera endast en av de tjänster som anges med hjälp av följande kommando:
azd deploy webfrontend
Mer information finns i Azure Developer CLI referens: azd deploy.
Distribuera infrastrukturuppdateringar
När beroendestrukturen i ett Aspire-projekt ändras, måste azd återställa de underliggande Azure-resurserna. Kommandot azd provision används för att tillämpa dessa ändringar på infrastrukturen.
Om du vill se detta i praktiken uppdaterar AppHost.cs du filen i AppHost-projektet till följande:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache");
// Add the locations database.
var locationsdb = builder.AddPostgres("db").AddDatabase("locations");
// Add the locations database reference to the API service.
var apiservice = builder.AddProject<Projects.AspireSample_ApiService>("apiservice")
.WithReference(locationsdb);
builder.AddProject<Projects.AspireSample_Web>("webfrontend")
.WithReference(cache)
.WithReference(apiservice);
builder.Build().Run();
Spara filen och utfärda följande kommando:
azd provision
Kommandot azd provision uppdaterar infrastrukturen genom att skapa en containerapp som är värd Postgres för databasen. Kommandot azd provision uppdaterade inte anslutningssträngarna för containern apiservice . För att anslutningssträngarna ska kunna uppdateras så att de pekar på den nyligen etablerade Postgres databasen azd deploy måste kommandot anropas igen. När du är osäker kan du använda azd up för att både etablera och distribuera.
Rensa resurser
Kom ihåg att rensa de Azure resurser som du har skapat under den här genomgången. Eftersom azd känner till resursgruppen där den skapade resurserna kan den användas för att stänga av miljön med följande kommando:
azd down
Det tidigare kommandot kan ta lite tid att köra, men när resursgruppen och alla dess resurser har slutförts bör de tas bort.
Deleting all resources and deployed code on Azure (azd down)
Local application code is not deleted when running 'azd down'.
Resource group(s) to be deleted:
• <YOUR RESOURCE GROUP>: <LINK TO RESOURCE GROUP OVERVIEW>
? Total resources to delete: 7, are you sure you want to continue? Yes
Deleting your resources can take some time.
(✓) Done: Deleting resource group: <YOUR RESOURCE GROUP>
SUCCESS: Your application was removed from Azure in 9 minutes 59 seconds.
Generera Bicep från Aspire projektmodellen
Även om utvecklingsteamen kan använda azd up (eller azd provision och azd deploy) kommandon för sina distributioner både i utvecklings- och produktionssyfte, kan vissa team välja att generera Bicep-filer som de kan granska och hantera som en del av versionskontroll (detta gör också att dessa Bicep-filer kan refereras som en del av en större mer komplex Azure distribution).
Omfattande vägledning om hur du anpassar genererad infrastruktur för produktionsscenarier finns i Anpassa AspireAzure distributioner.
azd inkluderar möjligheten att generera den Bicep som används vid tillhandahållande via följande kommando:
azd config set alpha.infraSynth on
azd infra gen
När det här kommandot har körts i exemplet med startmallen som används i den här guiden skapas följande filer i AppHost-projektkatalogen :
- infra/main.bicep: Representerar huvudingångspunkten för utplaceringen.
- infra/main.parameters.json: Används som parametrar för Bicep-huvuddelen – detta mappar till miljövariabler som definierats i .azure-mappen.
- infra/resources.bicep: Definierar de Azure resurser som krävs för att stödja Aspire projektmodellen.
-
AspireSample.Web/manifests/containerApp.tmpl.yaml: Containerappdefinitionen för
webfrontend. -
AspireSample.ApiService/manifests/containerApp.tmpl.yaml: Containerappdefinitionen för
apiservice.
Filen infra\resources.bicep innehåller ingen definition av själva containerapparna (med undantag för containerappar som är beroenden som Redis och Postgres):
@description('The location used for all deployed resources')
param location string = resourceGroup().location
@description('Tags that will be applied to all resources')
param tags object = {}
var resourceToken = uniqueString(resourceGroup().id)
resource managedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
name: 'mi-${resourceToken}'
location: location
tags: tags
}
resource containerRegistry 'Microsoft.ContainerRegistry/registries@2023-07-01' = {
name: replace('acr-${resourceToken}', '-', '')
location: location
sku: {
name: 'Basic'
}
tags: tags
}
resource caeMiRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(containerRegistry.id, managedIdentity.id, subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '7f951dda-4ed3-4680-a7ca-43fe172d538d'))
scope: containerRegistry
properties: {
principalId: managedIdentity.properties.principalId
principalType: 'ServicePrincipal'
roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '7f951dda-4ed3-4680-a7ca-43fe172d538d')
}
}
resource logAnalyticsWorkspace 'Microsoft.OperationalInsights/workspaces@2022-10-01' = {
name: 'law-${resourceToken}'
location: location
properties: {
sku: {
name: 'PerGB2018'
}
}
tags: tags
}
resource containerAppEnvironment 'Microsoft.App/managedEnvironments@2023-05-01' = {
name: 'cae-${resourceToken}'
location: location
properties: {
appLogsConfiguration: {
destination: 'log-analytics'
logAnalyticsConfiguration: {
customerId: logAnalyticsWorkspace.properties.customerId
sharedKey: logAnalyticsWorkspace.listKeys().primarySharedKey
}
}
}
tags: tags
}
resource cache 'Microsoft.App/containerApps@2023-05-02-preview' = {
name: 'cache'
location: location
properties: {
environmentId: containerAppEnvironment.id
configuration: {
service: {
type: 'redis'
}
}
template: {
containers: [
{
image: 'redis'
name: 'redis'
}
]
}
}
tags: union(tags, {'aspire-resource-name': 'cache'})
}
resource locations 'Microsoft.App/containerApps@2023-05-02-preview' = {
name: 'locations'
location: location
properties: {
environmentId: containerAppEnvironment.id
configuration: {
service: {
type: 'postgres'
}
}
template: {
containers: [
{
image: 'postgres'
name: 'postgres'
}
]
}
}
tags: union(tags, {'aspire-resource-name': 'locations'})
}
output MANAGED_IDENTITY_CLIENT_ID string = managedIdentity.properties.clientId
output AZURE_CONTAINER_REGISTRY_ENDPOINT string = containerRegistry.properties.loginServer
output AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID string = managedIdentity.id
output AZURE_CONTAINER_APPS_ENVIRONMENT_ID string = containerAppEnvironment.id
output AZURE_CONTAINER_APPS_ENVIRONMENT_DEFAULT_DOMAIN string = containerAppEnvironment.properties.defaultDomain
Mer information om hur du använder Bicep för att automatisera distributioner finns Azure i Vad är Bicep?
Definitionen av containerapparna från tjänstprojekten .NET finns i containerApp/tmpl.yaml-filerna i manifests katalogen i respektive projekt. Här är ett exempel från webfrontend projektet:
location: {{ .Env.AZURE_LOCATION }}
identity:
type: UserAssigned
userAssignedIdentities:
? "{{ .Env.AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID }}"
: {}
properties:
environmentId: {{ .Env.AZURE_CONTAINER_APPS_ENVIRONMENT_ID }}
configuration:
activeRevisionsMode: single
ingress:
external: true
targetPort: 8080
transport: http
allowInsecure: false
registries:
- server: {{ .Env.AZURE_CONTAINER_REGISTRY_ENDPOINT }}
identity: {{ .Env.AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID }}
template:
containers:
- image: {{ .Env.SERVICE_WEBFRONTEND_IMAGE_NAME }}
name: webfrontend
env:
- name: AZURE_CLIENT_ID
value: {{ .Env.MANAGED_IDENTITY_CLIENT_ID }}
- name: ConnectionStrings__cache
value: {{ connectionString "cache" }}
- name: OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES
value: "true"
- name: OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES
value: "true"
- name: services__apiservice__0
value: http://apiservice.internal.{{ .Env.AZURE_CONTAINER_APPS_ENVIRONMENT_DEFAULT_DOMAIN }}
- name: services__apiservice__1
value: https://apiservice.internal.{{ .Env.AZURE_CONTAINER_APPS_ENVIRONMENT_DEFAULT_DOMAIN }}
tags:
azd-service-name: webfrontend
aspire-resource-name: webfrontend
När azd infra gen-kommandot har körts, använder azd provision och azd deploy Bicep och de stödjande genererade filerna när de anropas.
Viktigt!
Om azd infra gen anropas igen ersätter den alla ändrade filer med nyligen genererade filer och ber dig om bekräftelse innan du gör det.
Isolerade miljöer för felsökning
Eftersom azd gör det enkelt att etablera nya miljöer är det möjligt för varje teammedlem att ha en isolerad molnbaserad miljö för felsökning av kod i en inställning som nära matchar produktionen. När du gör detta bör varje gruppmedlem skapa en egen miljö med hjälp av följande kommando:
azd env new
Detta uppmanar användaren att ange prenumerations- och resursgruppsinformation igen och efterföljande azd up, azd provisionoch azd deploy anrop använder den här nya miljön som standard. Växeln --environment kan tillämpas på dessa kommandon för att växla mellan miljöer.
Rensa resurser
Kör följande Azure CLI-kommando för att ta bort resursgruppen när du inte längre behöver de Azure resurser som du skapade. Om du tar bort resursgruppen tas även de resurser som ingår i den bort.
az group delete --name <your-resource-group-name>
Mer information finns i Rensa resurser i Azure.