自動化應用部署 - AWS Panorama

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

自動化應用部署

若要部署應用程式,您可以同時使用 AWS 全景應用程式 CLI 和AWS Command Line Interface。建立應用程式容器之後,您可以將它和其他資產上傳到 Amazon S3 存取點。然後,您可以使用CreateApplicationInstanceAPI。

如需使用所示指令碼的詳細內容和指示,請遵循應用程式讀我檔

建置容器

若要建置應用程式容器,請使用build-container指令。此命令會建置 Docker 容器,並將其儲存為壓縮檔案系統assets資料夾。

範例 3-build-container.sh
CODE_PACKAGE=SAMPLE_CODE ACCOUNT_ID=$(aws sts get-caller-identity --output text --query 'Account') panorama-cli build-container --container-asset-name code_asset --package-path packages/${ACCOUNT_ID}-${CODE_PACKAGE}-1.0

您也可以使用命令列完成來填入 path 引數,方法是輸入部分路徑,然後按TAB

$ panorama-cli build-container --package-path packages/TAB

上傳容器並註冊節點

若要上傳應用程式,請使用package-application指令。此指令會從assets資料夾至 AWS 全景管理的亞馬遜 S3 存取點。

範例 4-package-app.sh
panorama-cli package-application

AWS 全景應用程式 CLI 會上傳套件組態所參照的容器和描述元資產 (package.json) 在每個套件中,並將套件註冊為 AWS 全景中的節點。然後,您在應用程序清單中引用這些節點(graph.json) 以部署應用程式。

部署應用程式

若要部署應用程式,請使用CreateApplicationInstanceAPI。此操作採用以下參數,其中包括。

  • ManifestPayload-應用程序清單(graph.json),定義應用程式的節點、套件、邊緣和參數。

  • ManifestOverridesPayload-覆蓋第一個參數的第二個清單。應用程式資訊清單可視為應用程式來源中的靜態資源,覆寫資訊清單會提供自訂部署的部署時間設定。

  • DefaultRuntimeContextDevice— 目標設備。

  • RuntimeRoleArn— 應用程式用來存取 AWS 服務和資源的 IAM 角色的 ARN。

  • ApplicationInstanceIdToReplace— 要從裝置移除的現有應用程式執行個體 ID。

清單和覆寫有效載荷是 JSON 文件,必須以嵌套在另一個文件內的字串值形式提供。若要這麼做,指令碼會將檔案中的資訊清單載入為字串,並使用jq 工具以建構巢狀文件。

範例 5-deploy.sh— 撰寫清單
GRAPH_PATH="graphs/my-app/graph.json" OVERRIDE_PATH="graphs/my-app/override.json" # application manifest GRAPH=$(cat ${GRAPH_PATH} | tr -d '\n' | tr -d '[:blank:]') MANIFEST="$(jq --arg value "${GRAPH}" '.PayloadData="\($value)"' <<< {})" # manifest override OVERRIDE=$(cat ${OVERRIDE_PATH} | tr -d '\n' | tr -d '[:blank:]') MANIFEST_OVERRIDE="$(jq --arg value "${OVERRIDE}" '.PayloadData="\($value)"' <<< {})"

部署指令碼使用ListDevicesAPI 可取得目前區域中已註冊裝置的清單,並將使用者選擇儲存至本機檔案,以供後續部署使用。

範例 5-deploy.sh— 查找設備
echo "Getting devices..." DEVICES=$(aws panorama list-devices) DEVICE_NAMES=($((echo ${DEVICES} | jq -r '.Devices |=sort_by(.LastUpdatedTime) | [.Devices[].Name] | @sh') | tr -d \'\")) DEVICE_IDS=($((echo ${DEVICES} | jq -r '.Devices |=sort_by(.LastUpdatedTime) | [.Devices[].DeviceId] | @sh') | tr -d \'\")) for (( c=0; c<${#DEVICE_NAMES[@]}; c++ )) do echo "${c}: ${DEVICE_IDS[${c}]} ${DEVICE_NAMES[${c}]}" done echo "Choose a device" read D_INDEX echo "Deploying to device ${DEVICE_IDS[${D_INDEX}]}" echo -n ${DEVICE_IDS[${D_INDEX}]} > device-id.txt DEVICE_ID=$(cat device-id.txt)

應用程式角色是由另一個指令碼建立 (1-create-role.sh). 部署指令碼會從中取得此角色的 ARNAWS CloudFormation。如果應用程式已部署至裝置,則指令碼會從本機檔案取得該應用程式執行個體的 ID。

範例 5-deploy.sh-角色 ARN 和替換參數
# application role STACK_NAME=panorama-${NAME} ROLE_ARN=$(aws cloudformation describe-stacks --stack-name panorama-${PWD##*/} --query 'Stacks[0].Outputs[?OutputKey==`roleArn`].OutputValue' --output text) ROLE_ARG="--runtime-role-arn=${ROLE_ARN}" # existing application instance id if [ -f "application-id.txt" ]; then EXISTING_APPLICATION=$(cat application-id.txt) REPLACE_ARG="--application-instance-id-to-replace=${EXISTING_APPLICATION}" echo "Replacing application instance ${EXISTING_APPLICATION}" fi

最後,該腳本將所有部分放在一起以創建應用程序實例並將應用程序部署到設備。服務會以指令碼儲存的執行個體 ID 來回應,以供日後使用。

範例 5-deploy.sh— 部署應用程式
APPLICATION_ID=$(aws panorama create-application-instance ${REPLACE_ARG} --manifest-payload="${MANIFEST}" --default-runtime-context-device=${DEVICE_ID} --name=${NAME} --description="command-line deploy" --tags client=sample --manifest-overrides-payload="${MANIFEST_OVERRIDE}" ${ROLE_ARG} --output text) echo "New application instance ${APPLICATION_ID}" echo -n $APPLICATION_ID > application-id.txt

監控部署

若要監視部署,請使用ListApplicationInstancesAPI。監視器指令碼會從應用程式目錄中的檔案取得裝置 ID 和應用程式執行個體 ID,並使用它們建構 CLI 命令。然後它在一個循環中調用。

範例 6-monitor-deployment.sh
APPLICATION_ID=$(cat application-id.txt) DEVICE_ID=$(cat device-id.txt) QUERY="ApplicationInstances[?ApplicationInstanceId==\`APPLICATION_ID\`]" QUERY=${QUERY/APPLICATION_ID/$APPLICATION_ID} MONITOR_CMD="aws panorama list-application-instances --device-id ${DEVICE_ID} --query ${QUERY}" MONITOR_CMD=${MONITOR_CMD/QUERY/$QUERY} while true; do $MONITOR_CMD sleep 60 done

部署完成後,您可以通過調用亞馬遜查看日誌CloudWatch記錄檔 API。檢視記錄指令碼使用CloudWatch日誌GetLogEventsAPI。

範例 view-logs.sh
GROUP="/aws/panorama/devices/MY_DEVICE_ID/applications/MY_APPLICATION_ID" GROUP=${GROUP/MY_DEVICE_ID/$DEVICE_ID} GROUP=${GROUP/MY_APPLICATION_ID/$APPLICATION_ID} echo "Getting logs for group ${GROUP}." #set -x while true do LOGS=$(aws logs get-log-events --log-group-name ${GROUP} --log-stream-name code_node --limit 150) readarray -t ENTRIES < <(echo $LOGS | jq -c '.events[].message') for ENTRY in "${ENTRIES[@]}"; do echo "$ENTRY" | tr -d \" done sleep 20 done