Share via


教學課程:使用 Azure CLI 將 Dapr 應用程式部署至 Azure 容器應用程式

Dapr (分散式應用程式執行階段) 可協助開發人員組建易復原且可靠的微服務。 在本教學課程中,範例 Dapr 應用程式會部署至 Azure 容器應用程式。

您將學習如何:

  • 為您的容器應用程式建立容器應用程式環境
  • 為容器應用程式建立 Azure Blob 儲存體狀態存放區
  • 部署兩個應用程式來產生和取用訊息,並將其保存在狀態存放區中
  • 確認兩個微服務之間的互動。

使用 Azure 容器應用程式,您可以在組建微服務時取得完全受控的 Dapr API 版本。 當您在 Azure 容器應用程式中使用 Dapr 時,您可以讓側車 (Sidecar) 在微服務旁邊執行,以提供一組豐富的功能。 可用的 Dapr API 包括服務對服務呼叫Pub/Sub事件繫結狀態存放區和動作項目

在本教學課程中,您會從 Dapr Hello World 快速入門部署相同的應用程式。

此應用程式包含:

  • 用戶端 (Python) 容器應用程式,以產生訊息。
  • 服務 (節點) 容器應用程式,以取用和保存狀態存放區中的這些訊息

下列架構圖說明構成本教學課程的元件:

Azure Container Apps 上 Dapr Hello World 微服務的架構圖表

設定

若要從 CLI 登入 Azure,請執行下列命令,並遵循提示來完成驗證程序。

az login

若要確保您執行最新版的 CLI,請執行升級命令。

az upgrade

接下來,安裝或更新 CLI 的 Azure Container Apps 擴充功能。

az extension add --name containerapp --upgrade

現在已安裝目前的擴充功能或模組,請註冊 Microsoft.AppMicrosoft.OperationalInsights 命名空間。

注意

Azure 容器應用程式資源已從 Microsoft.Web 命名空間移轉至 Microsoft.App 命名空間。 如需詳細資訊,請參閱 2022 年 3 月將命名空間從 Microsoft.Web 移轉至 Microsoft.App

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

設定環境變數

設定下列環境變數。 以您的值取代 <PLACEHOLDERS> :

RESOURCE_GROUP="<RESOURCE_GROUP>"
LOCATION="<LOCATION>"
CONTAINERAPPS_ENVIRONMENT="<CONTAINERAPPS_ENVIRONMENT>"

建立 Azure 資源群組

建立資源群組來組織與容器應用程式部署相關的服務。

az group create \
  --name $RESOURCE_GROUP \
  --location "$LOCATION"

建立環境

Azure 容器應用程式中的環境會在容器應用程式群組周圍建立安全界限。 部署至相同環境的容器應用程式會部署在相同的虛擬網路中,並將記錄寫入相同的 Log Analytics 工作區。

若要建立環境,請執行下列命令:

az containerapp env create \
  --name $CONTAINERAPPS_ENVIRONMENT \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION"

設定狀態存放區

建立 Azure Blob 儲存體帳戶

部署環境之後,下一步是要部署微服務用來儲存資料的 Azure Blob 儲存體帳戶。 部署服務之前,您必須選擇儲存體帳戶的名稱。 儲存體帳戶名稱必須是 Azure 中唯一的,長度為 3 到 24 個字元,且必須僅包含數字和小寫字母。

STORAGE_ACCOUNT_NAME="<storage account name>"

使用下列命令來建立 Azure 儲存體帳戶。

az storage account create \
  --name $STORAGE_ACCOUNT_NAME \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION" \
  --sku Standard_RAGRS \
  --kind StorageV2

為節點應用程式設定使用者指派的身分識別

雖然容器應用程式同時支援使用者指派和系統指派的受控識別,但使用者指派的身分識別會為已啟用 Dapr 的節點應用程式提供存取 Blob 儲存體帳戶的權限。

  1. 建立使用者指派的身分識別。
az identity create --resource-group $RESOURCE_GROUP --name "nodeAppIdentity" --output json

擷取 principalIdid 屬性,並儲存在變數中。

PRINCIPAL_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query principalId | tr -d \")
IDENTITY_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query id | tr -d \")
CLIENT_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query clientId | tr -d \")
  1. Storage Blob Data Contributor 角色指派給使用者指派的身分識別

擷取您目前訂用帳戶的訂用帳戶識別碼。

SUBSCRIPTION_ID=$(az account show --query id --output tsv)
az role assignment create --assignee $PRINCIPAL_ID  \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"

設定狀態存放區元件

有多種方式可以透過 Dapr 向外部資源進行驗證。 此範例不會在執行階段使用 Dapr 祕密 API,而是使用以 Azure 為基礎的狀態存放區。 因此,您可以放棄建立祕密存放區元件,並改為使用受控識別從節點應用程式直接存取 Blob 存放區。 如果您想要在執行階段使用非 Azure 狀態存放區或 Dapr 祕密 API,請建立祕密存放區元件。 此元件會載入執行階段祕密,以便在執行階段加以參考。

開啟文字編輯器並使用您從先前步驟取得的屬性,建立名為 statestore.yaml 的組態檔。 此檔案可協助您的 Dapr 應用程式存取您的狀態存放區。 下列範例顯示您的 statestore.yaml 檔案在為 Azure Blob 儲存體帳戶設定時外觀應該會是如何:

# statestore.yaml for Azure Blob storage component
componentType: state.azure.blobstorage
version: v1
metadata:
  - name: accountName
    value: "<STORAGE_ACCOUNT_NAME>"
  - name: containerName
    value: mycontainer
  - name: azureClientId
    value: "<MANAGED_IDENTITY_CLIENT_ID>"
scopes:
  - nodeapp

若要使用此檔案,請更新預留位置:

  • <STORAGE_ACCOUNT_NAME> 取代為您定義的 STORAGE_ACCOUNT_NAME 變數值。 若要取得其值,請執行下列命令:
echo $STORAGE_ACCOUNT_NAME
  • <MANAGED_IDENTITY_CLIENT_ID> 取代為您定義的 CLIENT_ID 變數值。 若要取得其值,請執行下列命令:
echo $CLIENT_ID

瀏覽至您儲存元件 yaml 檔案的目錄,然後執行下列命令,在容器應用程式環境中設定 Dapr 元件。 如需設定 Dapr 元件的詳細資訊,請參閱設定 Dapr 元件

az containerapp env dapr-component set \
    --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP \
    --dapr-component-name statestore \
    --yaml statestore.yaml

部署服務應用程式 (HTTP Web 伺服器)

az containerapp create \
  --name nodeapp \
  --resource-group $RESOURCE_GROUP \
  --user-assigned $IDENTITY_ID \
  --environment $CONTAINERAPPS_ENVIRONMENT \
  --image dapriosamples/hello-k8s-node:latest \
  --min-replicas 1 \
  --max-replicas 1 \
  --enable-dapr \
  --dapr-app-id nodeapp \
  --dapr-app-port 3000 \
  --env-vars 'APP_PORT=3000'

根據預設,系統會從 Docker Hub 提取映像。

部署用戶端應用程式 (無周邊用戶端)

執行下列命令來部署用戶端容器應用程式。

az containerapp create \
  --name pythonapp \
  --resource-group $RESOURCE_GROUP \
  --environment $CONTAINERAPPS_ENVIRONMENT \
  --image dapriosamples/hello-k8s-python:latest \
  --min-replicas 1 \
  --max-replicas 1 \
  --enable-dapr \
  --dapr-app-id pythonapp

驗證結果

確認成功狀態持續性

您可藉由檢視 Azure 儲存體帳戶中的資料,確認服務運作正常。

  1. 在瀏覽器中開啟 Azure 入口網站,然後瀏覽至您的儲存體帳戶。

  2. 選取 [容器] 左側功能表。

  3. 選取 [mycontainer]

  4. 確認您可在容器中看到名為 order 的檔案。

  5. 選取 檔案。

  6. 選取 [編輯] 索引標籤。

  7. 選取 [重新整理] 按鈕,觀察資料自動更新的方式。

檢視記錄檔

容器應用程式裡的記錄會儲存在 Log Analytics 工作區的 ContainerAppConsoleLogs_CL 自訂資料表中。 您可以透過 Azure 入口網站或 CLI 來檢視記錄。 資料表一開始出現在工作區時可能會稍微延遲。

透過下列 CLI 命令來檢視使用命令列的記錄。

LOG_ANALYTICS_WORKSPACE_CLIENT_ID=`az containerapp env show --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.appLogsConfiguration.logAnalyticsConfiguration.customerId --out tsv`

az monitor log-analytics query \
  --workspace $LOG_ANALYTICS_WORKSPACE_CLIENT_ID \
  --analytics-query "ContainerAppConsoleLogs_CL | where ContainerAppName_s == 'nodeapp' and (Log_s contains 'persisted' or Log_s contains 'order') | project ContainerAppName_s, Log_s, TimeGenerated | sort by TimeGenerated | take 5" \
  --out table

下列輸出示範預計透過 CLI 命令的回應類型。

ContainerAppName_s    Log_s                            TableName      TimeGenerated
--------------------  -------------------------------  -------------  ------------------------
nodeapp               Got a new order! Order ID: 61    PrimaryResult  2021-10-22T21:31:46.184Z
nodeapp               Successfully persisted state.    PrimaryResult  2021-10-22T21:31:46.184Z
nodeapp               Got a new order! Order ID: 62    PrimaryResult  2021-10-22T22:01:57.174Z
nodeapp               Successfully persisted state.    PrimaryResult  2021-10-22T22:01:57.174Z
nodeapp               Got a new order! Order ID: 63    PrimaryResult  2021-10-22T22:45:44.618Z

清除資源

恭喜! 您已完成本教學課程。 如果您想要刪除在本逐步解說中建立的資源,請執行下列命令。

警告

此命令會刪除指定的資源群組和其中包含的所有資源。 如果本教學課程範圍以外的資源存在於指定的資源群組中,則也會一併刪除。

az group delete --resource-group $RESOURCE_GROUP

注意

由於 pythonapp 持續呼叫 nodeapp,其訊息會保存在您設定的狀態存放區中,因此務必完成這些清除步驟,以避免持續計費的作業。

提示

有問題嗎? 在 Azure 容器應用程式存放庫中提出問題,讓我們在 GitHub 上了解該問題。

下一步