

終止支援通知：2026 年 5 月 31 日， AWS 將終止對 的支援 AWS Panorama。2026 年 5 月 31 日之後，您將無法再存取 AWS Panorama 主控台或 AWS Panorama 資源。如需詳細資訊，請參閱[AWS Panorama 終止支援](https://docs.aws.amazon.com/panorama/latest/dev/panorama-end-of-support.html)。

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

# 自動化應用程式部署
<a name="api-deploy"></a>

若要部署應用程式，請同時使用 AWS Panorama 應用程式 CLI 和 AWS Command Line Interface。建置應用程式容器之後，您可以將它和其他資產上傳到 Amazon S3 存取點。然後，您可以使用 [CreateApplicationInstance](https://docs.aws.amazon.com/panorama/latest/api/API_CreateApplicationInstance.html) API 部署應用程式。

如需使用所示指令碼的更多內容和指示，請遵循[範例應用程式 README](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/aws-panorama-sample/README.md) 中的指示。

**Topics**
+ [建置容器](#api-deploy-build)
+ [上傳容器並註冊節點](#api-deploy-upload)
+ [部署應用程式](#api-deploy-deploy)
+ [監控部署](#api-deploy-monitor)

## 建置容器
<a name="api-deploy-build"></a>

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

**Example [3-build-container.sh](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/aws-panorama-sample/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
```

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

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

## 上傳容器並註冊節點
<a name="api-deploy-upload"></a>

若要上傳應用程式，請使用 `package-application`命令。此命令會將資產從 `assets` 資料夾上傳至 AWS Panorama 管理的 Amazon S3 存取點。

**Example [4-package-app.sh](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/aws-panorama-sample/4-package-app.sh)**  

```
panorama-cli package-application
```

 AWS Panorama Application CLI 會上傳每個套件中套件組態 (`package.json`) 參考的容器和描述項資產，並將套件註冊為 AWS Panorama 中的節點。然後，您可以在應用程式資訊清單中參考這些節點 (`graph.json`) 來部署應用程式。

## 部署應用程式
<a name="api-deploy-deploy"></a>

若要部署應用程式，您可以使用 [CreateApplicationInstance](https://docs.aws.amazon.com/panorama/latest/api/API_CreateApplicationInstance.html) API。此動作會採取下列參數等。

****
+ `ManifestPayload` – 定義應用程式節點、套件、邊緣和參數的應用程式資訊清單 (`graph.json`)。
+ `ManifestOverridesPayload` – 覆寫第一個 中參數的第二個資訊清單。應用程式資訊清單可視為應用程式來源中的靜態資源，其中覆寫資訊清單提供可自訂部署的部署時間設定。
+ `DefaultRuntimeContextDevice` – 目標裝置。
+ `RuntimeRoleArn` – 應用程式用來存取 AWS 服務和資源的 IAM 角色 ARN。
+ `ApplicationInstanceIdToReplace` – 從裝置移除的現有應用程式執行個體 ID。

資訊清單和覆寫承載是 JSON 文件，必須以巢狀於另一個文件內的字串值提供。若要這樣做，指令碼會從檔案載入資訊清單做為字串，並使用 [jq 工具](https://stedolan.github.io/jq/)來建構巢狀文件。

**Example [5-deploy.sh](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/aws-panorama-sample/5-deploy.sh) – compose 資訊清單**  

```
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)"' <<< {})"
```

部署指令碼使用 [ListDevices](https://docs.aws.amazon.com/panorama/latest/api/API_ListDevices.html) API 取得目前區域中已註冊裝置的清單，並將使用者選擇儲存至本機檔案以供後續部署使用。

**Example [5-deploy.sh](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/aws-panorama-sample/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](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/aws-panorama-sample/1-create-role.sh)：//) 建立。部署指令碼會從中取得此角色的 ARN AWS CloudFormation。如果應用程式已部署至裝置，則指令碼會從本機檔案取得該應用程式執行個體的 ID。

**Example [5-deploy.sh](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/aws-panorama-sample/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 來回應。

**Example https：//[5-deploy.sh](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/aws-panorama-sample/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
```

## 監控部署
<a name="api-deploy-monitor"></a>

若要監控部署，請使用 [ListApplicationInstances](https://docs.aws.amazon.com/panorama/latest/api/API_ListApplicationInstances.html) API。監控指令碼會從應用程式目錄中的檔案取得裝置 ID 和應用程式執行個體 ID，並使用它們來建構 CLI 命令。然後，它會在迴圈中呼叫 。

**Example [6-monitor-deployment.sh](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/aws-panorama-sample/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
```

部署完成時，您可以呼叫 Amazon CloudWatch Logs API 來檢視日誌。檢視日誌指令碼使用 CloudWatch Logs `GetLogEvents` API。

**Example [view-logs.sh](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/util-scripts/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
```