Bagikan melalui


Menyebarkan Orleans ke Azure Container Apps

Dalam tutorial ini, Anda akan mempelajari cara menyebarkan contoh Orleans aplikasi keranjang belanja ke Azure Container Apps. Tutorial ini memperluas fungsionalitas aplikasi ke cart belanja sampelOrleans, yang diperkenalkan di Sebarkan Orleans ke Azure App Service. Aplikasi sampel menambahkan autentikasi business-to-consumer (B2C) Azure Active Directory (AAD) dan menyebarkan ke Azure Container Apps.

Anda akan mempelajari cara menyebarkan menggunakan GitHub Actions, .NET dan Azure CLIs, dan Azure Bicep. Selain itu, Anda akan mempelajari cara mengonfigurasi ingress HTTP Container App.

Dalam tutorial ini, Anda akan mempelajari cara:

  • Menyebarkan aplikasi Orleans ke Azure Container Apps
  • Mengotomatiskan penyebaran menggunakan GitHub Actions dan Azure Bicep
  • Mengonfigurasi ingress HTTP

Prasyarat

Menjalankan aplikasi secara lokal

Untuk menjalankan aplikasi secara lokal, fork Sampel Azure: Orleans keranjang belanja di repositori Azure Container Apps dan kloning ke komputer lokal Anda. Setelah dikloning, buka solusi dalam IDE pilihan Anda. Jika Anda menggunakan Visual Studio, klik Orleanskanan . ShoppingCart.Silo project dan pilih Set As Startup Project, lalu jalankan aplikasi. Jika tidak, Anda dapat menjalankan aplikasi menggunakan perintah .NET CLI berikut:

dotnet run --project Silo\Orleans.ShoppingCart.Silo.csproj

Untuk informasi selengkapnya, lihat eksekusi dotnet. Dengan aplikasi berjalan, Anda disajikan dengan halaman arahan yang membahas fungsionalitas aplikasi. Di sudut kanan atas, Anda akan melihat tombol masuk. Anda dapat mendaftar untuk akun, atau masuk jika Anda sudah memiliki akun. Setelah masuk, Anda dapat menavigasi sekitar dan Anda bebas untuk menguji kemampuannya. Semua fungsionalitas aplikasi saat berjalan secara lokal bergantung pada persistensi dalam memori, pengklusteran lokal, dan menggunakan paket Bogus NuGet untuk menghasilkan produk palsu. Hentikan aplikasi dengan memilih opsi Hentikan Penelusuran Kesalahan di Visual Studio atau dengan menekan Ctrl+C di .NET CLI.

AAD B2C

Saat mengajarkan konsep autentikasi berada di luar cakupan tutorial ini, Anda dapat mempelajari cara Membuat penyewa Azure Active Directory B2C, lalu Anda dapat Mendaftarkan aplikasi web untuk menggunakannya. Dalam kasus aplikasi contoh ke cart belanja ini, URL Container Apps yang dihasilkan harus didaftarkan di penyewa B2C. Untuk informasi selengkapnya, lihat ASP.NET autentikasi dan otorisasi Core Blazor.

Penting

Setelah Aplikasi Kontainer disebarkan, Anda harus mendaftarkan URL aplikasi di penyewa B2C. Dalam sebagian besar skenario produksi, Anda hanya perlu mendaftarkan URL aplikasi sekali karena seharusnya tidak berubah.

Untuk membantu memvisualisasikan bagaimana aplikasi diisolasi dalam lingkungan Azure Container Apps, lihat diagram berikut:

Ingress HTTP Azure Container Apps.

Dalam diagram sebelumnya, semua lalu lintas masuk ke aplikasi disalurkan melalui ingress HTTP yang aman. Lingkungan Azure Container Apps berisi instans aplikasi, dan instans aplikasi berisi host ASP.NET Core, yang mengekspos fungsionalitas Blazor Server dan Orleans aplikasi.

Menyebarkan ke Azure Container Apps

Untuk menyebarkan aplikasi ke Azure Container Apps, repositori menggunakan GitHub Actions. Sebelum penyebaran ini dapat berlangsung, Anda memerlukan beberapa sumber daya Azure dan Anda harus mengonfigurasi repositori GitHub dengan benar.

Sebelum menyebarkan aplikasi, Anda perlu membuat Grup Sumber Daya Azure (atau Anda dapat memilih untuk menggunakan yang sudah ada). Untuk membuat Grup Sumber Daya Azure baru, gunakan salah satu artikel berikut ini:

Catat nama grup sumber daya yang Anda pilih, Anda akan membutuhkannya nanti untuk menyebarkan aplikasi.

Membuat perwakilan layanan

Untuk mengotomatiskan penyebaran aplikasi, Anda harus membuat perwakilan layanan. Ini adalah akun Microsoft yang memiliki izin untuk mengelola sumber daya Azure atas nama Anda.

az ad sp create-for-rbac --sdk-auth --role Contributor \
  --name "<display-name>"  --scopes /subscriptions/<your-subscription-id>

Info masuk JSON yang dibuat akan terlihat mirip dengan yang berikut ini, tetapi dengan nilai aktual untuk klien, langganan, dan penyewa Anda:

{
  "clientId": "<your client id>",
  "clientSecret": "<your client secret>",
  "subscriptionId": "<your subscription id>",
  "tenantId": "<your tenant id>",
  "activeDirectoryEndpointUrl": "https://login.microsoftonline.com/",
  "resourceManagerEndpointUrl": "https://brazilus.management.azure.com",
  "activeDirectoryGraphResourceId": "https://graph.windows.net/",
  "sqlManagementEndpointUrl": "https://management.core.windows.net:8443/",
  "galleryEndpointUrl": "https://gallery.azure.com",
  "managementEndpointUrl": "https://management.core.windows.net"
}

Salin output perintah ke clipboard Anda, dan lanjutkan ke langkah berikutnya.

Membuat rahasia GitHub

GitHub menyediakan mekanisme untuk membuat rahasia terenkripsi. Rahasia yang Anda buat tersedia untuk digunakan dalam alur kerja GitHub Actions. Anda akan melihat bagaimana GitHub Actions dapat digunakan untuk mengotomatiskan penyebaran aplikasi, bersama dengan Azure Bicep. Bicep adalah bahasa khusus domain (DSL) yang menggunakan sintaksis deklaratif untuk menyebarkan sumber daya Azure. Untuk informasi selengkapnya, lihat Apa itu Bicep. Dengan menggunakan output dari langkah Buat perwakilan layanan, Anda harus membuat rahasia GitHub bernama AZURE_CREDENTIALS dengan kredensial berformat JSON.

Dalam repositori GitHub, pilih Pengaturan>Rahasia>Buat rahasia baru. Masukkan nama AZURE_CREDENTIALS dan tempel mandat JSON dari langkah sebelumnya ke dalam bidang Nilai.

Repositori GitHub: Pengaturan > Rahasia

Untuk informasi selengkapnya, lihat GitHub: Rahasia Terenkripsi.

Menyiapkan untuk penyebaran Azure

Aplikasi harus dipaketkan untuk penyebaran. Dalam proyek, Orleans.ShoppingCart.Silos kami menentukan Target elemen yang berjalan setelah Publish langkah. Ini akan membuat zip direktori penerbitan ke dalam file silo.zip :

<Target Name="ZipPublishOutput" AfterTargets="Publish">
    <Delete Files="$(ProjectDir)\..\silo.zip" />
    <ZipDirectory SourceDirectory="$(PublishDir)" DestinationFile="$(ProjectDir)\..\silo.zip" />
</Target>

Ada banyak cara untuk menyebarkan aplikasi .NET ke Azure Container Apps. Dalam tutorial ini, Anda menggunakan GitHub Actions, Azure Bicep, dan .NET dan Azure CLIs. Pertimbangkan file ./github/workflows/deploy.yml di akar repositori GitHub:

name: Deploy to Azure Container Apps

on:
  push:
    branches:
    - main

env:
  UNIQUE_APP_NAME: orleanscart
  SILO_IMAGE_NAME: orleanscart-silo
  AZURE_RESOURCE_GROUP_NAME: orleans-resourcegroup
  AZURE_RESOURCE_GROUP_LOCATION: eastus

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3

    - name: Setup .NET 6.0
      uses: actions/setup-dotnet@v3
      with:
        dotnet-version: 6.0.x

    - name: .NET publish shopping cart app
      run: dotnet publish ./Silo/Orleans.ShoppingCart.Silo.csproj --configuration Release

    - name: Login to Azure
      uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}

    - name: Flex ACR Bicep
      run: |
        az deployment group create \
          --resource-group ${{ env.AZURE_RESOURCE_GROUP_NAME }} \
          --template-file '.github/workflows/flex/acr.bicep' \
          --parameters location=${{ env.AZURE_RESOURCE_GROUP_LOCATION }}

    - name: Get ACR Login Server
      run: |
        ACR_NAME=$(az deployment group show -g ${{ env.AZURE_RESOURCE_GROUP_NAME }} -n acr \
        --query properties.outputs.acrName.value | tr -d '"')
        echo "ACR_NAME=$ACR_NAME" >> $GITHUB_ENV
        ACR_LOGIN_SERVER=$(az deployment group show -g ${{ env.AZURE_RESOURCE_GROUP_NAME }} -n acr \
        --query properties.outputs.acrLoginServer.value | tr -d '"')
        echo "ACR_LOGIN_SERVER=$ACR_LOGIN_SERVER" >> $GITHUB_ENV

    - name: Prepare Docker buildx
      uses: docker/setup-buildx-action@v1

    - name: Login to ACR
      run: |
        access_token=$(az account get-access-token --query accessToken -o tsv)
        refresh_token=$(curl https://${{ env.ACR_LOGIN_SERVER }}/oauth2/exchange -v \
        -d "grant_type=access_token&service=${{ env.ACR_LOGIN_SERVER }}&access_token=$access_token" | jq -r .refresh_token)
        # The null GUID 0000... tells the container registry that this is an ACR refresh token during the login flow
        docker login -u 00000000-0000-0000-0000-000000000000 \
        --password-stdin ${{ env.ACR_LOGIN_SERVER }} <<< "$refresh_token"

    - name: Build and push Silo image to registry
      uses: docker/build-push-action@v2
      with:
        push: true
        tags: ${{ env.ACR_LOGIN_SERVER }}/${{ env.SILO_IMAGE_NAME }}:${{ github.sha }}
        file: Silo/Dockerfile

    - name: Flex ACA Bicep
      run: |
        az deployment group create \
          --resource-group ${{ env.AZURE_RESOURCE_GROUP_NAME }} \
          --template-file '.github/workflows/flex/main.bicep' \
          --parameters location=${{ env.AZURE_RESOURCE_GROUP_LOCATION }} \
            appName=${{ env.UNIQUE_APP_NAME }} \
            acrName=${{ env.ACR_NAME }} \
            repositoryImage=${{ env.ACR_LOGIN_SERVER }}/${{ env.SILO_IMAGE_NAME }}:${{ github.sha }} \
          --debug

    - name: Get Container App URL
      run: |
        ACA_URL=$(az deployment group show -g ${{ env.AZURE_RESOURCE_GROUP_NAME }} \
        -n main --query properties.outputs.acaUrl.value | tr -d '"')
        echo $ACA_URL

    - name: Logout of Azure
      run: az logout

Alur kerja GitHub sebelumnya akan:

  • Terbitkan aplikasi keranjang belanja sebagai file zip, menggunakan perintah terbitkan dotnet.
  • Masuk ke Azure menggunakan kredensial dari langkah Buat perwakilan layanan.
  • Evaluasi file acr.bicep dan mulai grup penyebaran menggunakan buat grup penyebaran az.
  • Dapatkan server masuk Azure Container Registry (ACR) dari grup penyebaran.
  • Masuk ke ACR menggunakan rahasia repositori AZURE_CREDENTIALS .
  • Bangun dan terbitkan gambar silo ke ACR.
  • Evaluasi file main.bicep dan mulai grup penyebaran menggunakan az deployment group create.
  • Menyebarkan silo
  • Keluar dari Azure.

Alur kerja dipicu oleh pendorongan ke cabang utama. Untuk informasi selengkapnya, lihat GitHub Actions dan .NET.

Tip

Jika Anda mengalami masalah saat menjalankan alur kerja, Anda mungkin perlu memverifikasi bahwa perwakilan layanan memiliki semua namespace penyedia yang diperlukan yang terdaftar. Namespace layanan penyedia berikut diperlukan:

  • Microsoft.App
  • Microsoft.ContainerRegistry
  • Microsoft.Insights
  • Microsoft.OperationalInsights
  • Microsoft.Storage

Untuk informasi selengkapnya, lihat Memperbaiki kesalahan untuk pendaftaran penyedia sumber.

Azure memberlakukan pembatasan penamaan dan konvensi untuk sumber daya. Anda perlu memperbarui nilai file deploy.yml untuk hal berikut:

  • UNIQUE_APP_NAME
  • SILO_IMAGE_NAME
  • AZURE_RESOURCE_GROUP_NAME
  • AZURE_RESOURCE_GROUP_LOCATION

Atur nilai-nilai ini ke nama aplikasi unik Dan nama dan lokasi grup sumber daya Azure Anda.

Untuk informasi selengkapnya, lihat Aturan penamaan dan batasan untuk Azure Resource Manager.

Menjelajahi templat Bicep

az deployment group create Ketika perintah dijalankan, perintah akan mengevaluasi referensi file .bicep tertentu. File ini berisi informasi deklaratif yang merinci sumber daya Azure yang ingin Anda sebarkan. Salah satu cara untuk memikirkan langkah ini adalah menyediakan semua sumber daya untuk penyebaran.

Penting

Jika Anda menggunakan Visual Studio Code, pengalaman penulisan Bicep ditingkatkan saat menggunakan Ekstensi Bicep.

File Bicep pertama yang dievaluasi adalah file acr.bicep . File ini berisi detail sumber daya server masuk Azure Container Registry (ACR):

param location string = resourceGroup().location

resource acr 'Microsoft.ContainerRegistry/registries@2021-09-01' = {
  name: toLower('${uniqueString(resourceGroup().id)}acr')
  location: location
  sku: {
    name: 'Basic'
  }
  properties: {
    adminUserEnabled: true
  }
}

output acrLoginServer string = acr.properties.loginServer
output acrName string = acr.name

File bicep ini menghasilkan server login ACR dan nama yang sesuai. File Bicep berikutnya yang ditemui berisi lebih dari sekadar satu resource. Pertimbangkan file main.bicep yang terdiri terutama dari definisi pendelegasian module :

param appName string
param acrName string
param repositoryImage string
param location string = resourceGroup().location

resource acr 'Microsoft.ContainerRegistry/registries@2021-09-01' existing = {
  name: acrName
}

module env 'environment.bicep' = {
  name: 'containerAppEnvironment'
  params: {
    location: location
    operationalInsightsName: '${appName}-logs'
    appInsightsName: '${appName}-insights'
  }
}

var envVars = [
  {
    name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
    value: env.outputs.appInsightsInstrumentationKey
  }
  {
    name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
    value: env.outputs.appInsightsConnectionString
  }
  {
    name: 'ORLEANS_AZURE_STORAGE_CONNECTION_STRING'
    value: storageModule.outputs.connectionString
  }
  {
    name: 'ASPNETCORE_FORWARDEDHEADERS_ENABLED'
    value: 'true'
  }
]

module storageModule 'storage.bicep' = {
  name: 'orleansStorageModule'
  params: {
    name: '${appName}storage'
    location: location
  }
}

module siloModule 'container-app.bicep' = {
  name: 'orleansSiloModule'
  params: {
    appName: appName
    location: location
    containerAppEnvironmentId: env.outputs.id
    repositoryImage: repositoryImage
    registry: acr.properties.loginServer
    registryPassword: acr.listCredentials().passwords[0].value
    registryUsername: acr.listCredentials().username
    envVars: envVars
  }
}

output acaUrl string = siloModule.outputs.acaUrl

File Bicep sebelumnya:

  • Mereferensikan existing sumber daya ACR, untuk informasi selengkapnya, lihat Azure Bicep: Sumber daya yang sudah ada.
  • module env Menentukan yang mendelegasikan ke file definisi environment.bicep.
  • module storageModule Menentukan yang mendelegasikan ke file definisi storage.bicep.
  • Menyatakan beberapa berbagi envVars yang digunakan oleh modul silo.
  • module siloModule Menentukan yang mendelegasikan ke file definisi container-app.bicep.
  • Output URL ACA (ini berpotensi digunakan untuk memperbarui URI pengalihan pendaftaran aplikasi AAD B2C yang ada).

Main.bicep mendelegasikan ke beberapa file Bicep lainnya. Yang pertama adalah file environment.bicep :

param operationalInsightsName string
param appInsightsName string
param location string

resource appInsights 'Microsoft.Insights/components@2020-02-02' = {
  name: appInsightsName
  location: location
  kind: 'web'
  properties: {
    Application_Type: 'web'
    WorkspaceResourceId: logs.id
  }
}

resource logs 'Microsoft.OperationalInsights/workspaces@2021-06-01' = {
  name: operationalInsightsName
  location: location
  properties: {
    retentionInDays: 30
    features: {
      searchVersion: 1
    }
    sku: {
      name: 'PerGB2018'
    }
  }
}

resource env 'Microsoft.App/managedEnvironments@2022-03-01' = {
  name: '${resourceGroup().name}env'
  location: location
  properties: {
    appLogsConfiguration: {
      destination: 'log-analytics'
      logAnalyticsConfiguration: {
        customerId: logs.properties.customerId
        sharedKey: logs.listKeys().primarySharedKey
      }
    }
  }
}

output id string = env.id
output appInsightsInstrumentationKey string = appInsights.properties.InstrumentationKey
output appInsightsConnectionString string = appInsights.properties.ConnectionString

File bicep ini menentukan sumber daya Azure Log Analytics dan Application Insights. Sumber daya appInsights adalah jenis web, dan sumber daya logs adalah jenis PerGB2018. Sumber daya appInsights dan sumber daya logs diprovisikan di lokasi grup sumber daya. Sumber daya appInsights ditautkan ke sumber daya logs melalui properti WorkspaceResourceId. Ada tiga output yang ditentukan dalam bicep ini, yang digunakan nanti oleh Aplikasi moduleKontainer . Selanjutnya, mari kita lihat file storage.bicep :

param name string
param location string

resource storage 'Microsoft.Storage/storageAccounts@2021-08-01' = {
  name: name
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

var key = listKeys(storage.name, storage.apiVersion).keys[0].value
var protocol = 'DefaultEndpointsProtocol=https'
var accountBits = 'AccountName=${storage.name};AccountKey=${key}'
var endpointSuffix = 'EndpointSuffix=${environment().suffixes.storage}'

output connectionString string = '${protocol};${accountBits};${endpointSuffix}'

File Bicep sebelumnya mendefinisikan hal berikut:

  • Dua parameter untuk nama grup sumber daya dan nama aplikasi.
  • Definisi resource storage untuk akun penyimpanan.
  • Tunggal output yang membangun string koneksi untuk akun penyimpanan.

File Bicep terakhir adalah file container-app.bicep :

param appName string
param location string
param containerAppEnvironmentId string
param repositoryImage string = 'mcr.microsoft.com/azuredocs/containerapps-helloworld:latest'
param envVars array = []
param registry string
param registryUsername string
@secure()
param registryPassword string

resource containerApp 'Microsoft.App/containerApps@2022-03-01' = {
  name: appName
  location: location
  properties: {
    managedEnvironmentId: containerAppEnvironmentId
    configuration: {
      activeRevisionsMode: 'multiple'
      secrets: [
        {
          name: 'container-registry-password'
          value: registryPassword
        }
      ]
      registries: [
        {
          server: registry
          username: registryUsername
          passwordSecretRef: 'container-registry-password'
        }
      ]
      ingress: {
        external: true
        targetPort: 80
      }
    }
    template: {
      revisionSuffix: uniqueString(repositoryImage, appName)
      containers: [
        {
          image: repositoryImage
          name: appName
          env: envVars
        }
      ]
      scale: {
        minReplicas: 1
        maxReplicas: 1
      }
    }
  }
}

output acaUrl string = containerApp.properties.configuration.ingress.fqdn

Ekstensi Visual Studio Code yang disebutkan di atas untuk Bicep menyertakan visualizer. Semua file Bicep ini divisualisasikan sebagai berikut:

Orleans: Aplikasi sampel kelir belanja penyajian visualizer provisi Bicep.

Ringkasan

Saat Anda memperbarui kode sumber dan push berubah ke cabang main repositori, alur kerja deploy.yml akan berjalan. Ini menyediakan sumber daya Azure yang ditentukan dalam file Bicep dan menyebarkan aplikasi. Revisi secara otomatis terdaftar di Azure Container Registry Anda.

Selain visualizer dari ekstensi Bicep, halaman grup sumber daya portal Azure akan terlihat mirip dengan contoh berikut setelah menyediakan dan menyebarkan aplikasi:

Portal Microsoft Azure: Orleans sumber daya aplikasi sampel keranjang belanja untuk Azure Container Apps.

Lihat juga