

终止支持通知：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)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# AWS Panorama API
<a name="panorama-api"></a>

您可以使用 AWS Panorama 服务的公共 API 来自动执行设备和应用程序管理工作流程。使用 AWS Command Line Interface 或 AWS SDK，您可以开发用于管理资源和部署的脚本或应用程序。本指南的 GitHub 存储库包含脚本，您可以将其用作自己代码的起点。

****
+ [aws-panorama-developer-guide/util-script](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/util-scripts)

**Topics**
+ [自动执行设备注册](api-provision.md)
+ [使用 AWS Panorama API 管理设备](api-appliance.md)
+ [自动化应用程序部署](api-deploy.md)
+ [使用 AWS Panorama API 管理应用程序](api-applications.md)
+ [使用 VPC 端点](api-endpoints.md)

# 自动执行设备注册
<a name="api-provision"></a>

要配置设备，请使用 [ProvisionDevice](https://docs.aws.amazon.com/panorama/latest/api/API_ProvisionDevice.html)API。响应包括一个 ZIP 文件，其中包含设备的配置和临时凭证。对文件进行解码，并将其保存在前缀为 `certificates-omni_` 的存档中。

**Example [provision-device.sh](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/util-scripts/provision-device.sh)**  

```
if [[ $# -eq 1 ]] ; then
    DEVICE_NAME=$1
else
    echo "Usage: ./provision-device.sh <device-name>"
    exit 1
fi
CERTIFICATE_BUNDLE=certificates-omni_${DEVICE_NAME}.zip
aws panorama provision-device --name ${DEVICE_NAME} --output text --query Certificates | base64 --decode > ${CERTIFICATE_BUNDLE}
echo "Created certificate bundle ${CERTIFICATE_BUNDLE}"
```

配置存档中的凭证将在 5 分钟后过期。使用随附的 USB 驱动器将存档传输到您的设备。

要注册摄像头，请使用 [CreateNodeFromTemplateJob](https://docs.aws.amazon.com/panorama/latest/api/API_CreateNodeFromTemplateJob.html)API。此 API 采用摄像头用户名、密码和 URL 的模板参数映射。可以使用 Bash 字符串操作将此映射格式化为 JSON 文档。

**Example [register-camera.sh](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/util-scripts/register-camera.sh)**  

```
if [[ $# -eq 3 ]] ; then
    NAME=$1
    USERNAME=$2
    URL=$3
else
    echo "Usage: ./register-camera.sh <stream-name> <username> <rtsp-url>"
    exit 1
fi
echo "Enter camera stream password: "
read PASSWORD
TEMPLATE='{"Username":"MY_USERNAME","Password":"MY_PASSWORD","StreamUrl": "MY_URL"}'
TEMPLATE=${TEMPLATE/MY_USERNAME/$USERNAME}
TEMPLATE=${TEMPLATE/MY_PASSWORD/$PASSWORD}
TEMPLATE=${TEMPLATE/MY_URL/$URL}
echo ${TEMPLATE}
JOB_ID=$(aws panorama create-node-from-template-job --template-type RTSP_CAMERA_STREAM --output-package-name ${NAME} --output-package-version "1.0" --node-name ${NAME} --template-parameters "${TEMPLATE}" --output text)
```

或者，您可以从文件加载 JSON 配置。

```
--template-parameters file://camera-template.json
```

# 使用 AWS Panorama API 管理设备
<a name="api-appliance"></a>

您可以使用 AWS Panorama API 自动执行设备管理任务。

## 查看设备
<a name="api-appliance-view"></a>

要获取带有设备的设备列表 IDs，请使用 [ListDevices](https://docs.aws.amazon.com/panorama/latest/api/API_ListDevices.html)API。

```
$ aws panorama list-devices
    "Devices": [
        {
            "DeviceId": "device-4tafxmplhtmzabv5lsacba4ere",
            "Name": "my-appliance",
            "CreatedTime": 1652409973.613,
            "ProvisioningStatus": "SUCCEEDED",
            "LastUpdatedTime": 1652410973.052,
            "LeaseExpirationTime": 1652842940.0
        }
    ]
}
```

要获取有关设备的更多详细信息，请使用 [DescribeDevice](https://docs.aws.amazon.com/panorama/latest/api/API_DescribeDevice.html)API。

```
$ aws panorama describe-device --device-id device-4tafxmplhtmzabv5lsacba4ere
{
    "DeviceId": "device-4tafxmplhtmzabv5lsacba4ere",
    "Name": "my-appliance",
    "Arn": "arn:aws:panorama:us-west-2:123456789012:device/device-4tafxmplhtmzabv5lsacba4ere",
    "Type": "PANORAMA_APPLIANCE",
    "DeviceConnectionStatus": "ONLINE",
    "CreatedTime": 1648232043.421,
    "ProvisioningStatus": "SUCCEEDED",
    "LatestSoftware": "4.3.55",
    "CurrentSoftware": "4.3.45",
    "SerialNumber": "GFXMPL0013023708",
    "Tags": {},
    "CurrentNetworkingStatus": {
        "Ethernet0Status": {
            "IpAddress": "192.168.0.1/24",
            "ConnectionStatus": "CONNECTED",
            "HwAddress": "8C:XM:PL:60:C5:88"
        },
        "Ethernet1Status": {
            "IpAddress": "--",
            "ConnectionStatus": "NOT_CONNECTED",
            "HwAddress": "8C:XM:PL:60:C5:89"
        }
    },
    "LeaseExpirationTime": 1652746098.0
}
```

## 升级设备软件
<a name="api-appliance-upgrade"></a>

如果 `LatestSoftware` 版本比 `CurrentSoftware` 版本新，您可以升级设备。使用 [CreateJobForDevices](https://docs.aws.amazon.com/panorama/latest/api/API_CreateJobForDevices.html)API 创建 over-the-air (OTA) 更新任务。

```
$ aws panorama create-job-for-devices --device-ids device-4tafxmplhtmzabv5lsacba4ere \
  --device-job-config '{"OTAJobConfig": {"ImageVersion": "4.3.55"}}' --job-type OTA
{
    "Jobs": [
        {
            "JobId": "device-4tafxmplhtmzabv5lsacba4ere-0",
            "DeviceId": "device-4tafxmplhtmzabv5lsacba4ere"
        }
    ]
}
```

在脚本中，可以使用 Bash 字符串操作填充作业配置文件中的映像版本字段。

**Example [check-updates.sh](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/util-scripts/check-updates.sh)**  

```
apply_update() {
    DEVICE_ID=$1
    NEW_VERSION=$2
    CONFIG='{"OTAJobConfig": {"ImageVersion": "NEW_VERSION"}}'
    CONFIG=${CONFIG/NEW_VERSION/$NEW_VERSION}
    aws panorama create-job-for-devices --device-ids ${DEVICE_ID} --device-job-config "${CONFIG}" --job-type OTA
}
```

设备将下载指定的软件版本并自行更新。使用 [DescribeDeviceJob](https://docs.aws.amazon.com/panorama/latest/api/API_DescribeDeviceJob.html)API 查看更新进度。

```
$ aws panorama describe-device-job --job-id device-4tafxmplhtmzabv5lsacba4ere-0
{
    "JobId": "device-4tafxmplhtmzabv5lsacba4ere-0",
    "DeviceId": "device-4tafxmplhtmzabv5lsacba4ere",
    "DeviceArn": "arn:aws:panorama:us-west-2:559823168634:device/device-4tafxmplhtmzabv5lsacba4ere",
    "DeviceName": "my-appliance",
    "DeviceType": "PANORAMA_APPLIANCE",
    "ImageVersion": "4.3.55",
    "Status": "REBOOTING",
    "CreatedTime": 1652410232.465
}
```

要获取所有正在运行的作业的列表，请使用[ListDevicesJobs](https://docs.aws.amazon.com/panorama/latest/api/API_ListDevicesJobs.html)。

```
$ aws panorama list-devices-jobs
{
    "DeviceJobs": [
        {
            "DeviceName": "my-appliance",
            "DeviceId": "device-4tafxmplhtmzabv5lsacba4ere",
            "JobId": "device-4tafxmplhtmzabv5lsacba4ere-0",
            "CreatedTime": 1652410232.465
        }
    ]
}
```

有关检查和应用更新的示例脚本，请参阅本指南 GitHub 存储库[中的 check-updates.sh](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/util-scripts/check-updates.sh)。

## 重新启动设备
<a name="api-appliance-reboot"></a>

要重启设备，请使用 [CreateJobForDevices](https://docs.aws.amazon.com/panorama/latest/api/API_CreateJobForDevices.html)API。

```
$ aws panorama create-job-for-devices --device-ids device-4tafxmplhtmzabv5lsacba4ere --job-type REBOOT
{
    "Jobs": [
        {
            "JobId": "device-4tafxmplhtmzabv5lsacba4ere-0",
            "DeviceId": "device-4tafxmplhtmzabv5lsacba4ere"
        }
    ]
}
```

在脚本中，您可以获取设备列表，并选择一个设备以交互方式重新启动。

**Example [reboot-device.sh](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/util-scripts/reboot-device.sh) – 用法**  

```
$ ./reboot-device.sh
Getting devices...
0: device-53amxmplyn3gmj72epzanacniy     my-se70-1
1: device-6talxmpl5mmik6qh5moba6jium     my-manh-24
Choose a device
1
Reboot device device-6talxmpl5mmik6qh5moba6jium? (y/n)y
{
    "Jobs": [
        {
            "DeviceId": "device-6talxmpl5mmik6qh5moba6jium",
            "JobId": "device-6talxmpl5mmik6qh5moba6jium-8"
        }
    ]
}
```

# 自动化应用程序部署
<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 部署应用程序。

有关使用所示脚本的更多上下文和说明，请按照[示例应用程序自述文件](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 应用程序 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) – 撰写清单**  

```
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 作为响应，脚本会存储该实例 ID 以供日后使用。

**Example [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 日志 API 来查看 CloudWatch 日志。查看日志脚本使用日 CloudWatch 志 `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
```

# 使用 AWS Panorama API 管理应用程序
<a name="api-applications"></a>

您可以使用 AWS Panorama API 监控和管理应用程序。

## 查看应用程序
<a name="api-applications-view"></a>

要获取设备上运行的应用程序列表，请使用 [ListApplicationInstances](https://docs.aws.amazon.com/panorama/latest/api/API_ListApplicationInstances.html)API。

```
$ aws panorama list-application-instances
    "ApplicationInstances": [
        {
            "Name": "aws-panorama-sample",
            "ApplicationInstanceId": "applicationInstance-ddaxxmpl2z7bg74ywutd7byxuq",
            "DefaultRuntimeContextDevice": "device-4tafxmplhtmzabv5lsacba4ere",
            "DefaultRuntimeContextDeviceName": "my-appliance",
            "Description": "command-line deploy",
            "Status": "DEPLOYMENT_SUCCEEDED",
            "HealthStatus": "RUNNING",
            "StatusDescription": "Application deployed successfully.",
            "CreatedTime": 1661902051.925,
            "Arn": "arn:aws:panorama:us-east-2:123456789012:applicationInstance/applicationInstance-ddaxxmpl2z7bg74ywutd7byxuq",
            "Tags": {
                "client": "sample"
            }
        },
    ]
}
```

要获取有关应用程序实例节点的更多详细信息，请使用 [ListApplicationInstanceNodeInstances](https://docs.aws.amazon.com/panorama/latest/api/API_ListApplicationInstanceNodeInstances.html)API。

```
$ aws panorama list-application-instance-node-instances --application-instance-id applicationInstance-ddaxxmpl2z7bg74ywutd7byxuq
{
    "NodeInstances": [
        {
            "NodeInstanceId": "code_node",
            "NodeId": "SAMPLE_CODE-1.0-fd3dxmpl-interface",
            "PackageName": "SAMPLE_CODE",
            "PackageVersion": "1.0",
            "PackagePatchVersion": "fd3dxmpl2bdfa41e6fe1be290a79dd2c29cf014eadf7416d861ce7715ad5e8a8",
            "NodeName": "interface",
            "CurrentStatus": "RUNNING"
        },
        {
            "NodeInstanceId": "camera_node_override",
            "NodeId": "warehouse-floor-1.0-9eabxmpl-warehouse-floor",
            "PackageName": "warehouse-floor",
            "PackageVersion": "1.0",
            "PackagePatchVersion": "9eabxmple89f0f8b2f2852cca2a6e7971aa38f1629a210d069045e83697e42a7",
            "NodeName": "warehouse-floor",
            "CurrentStatus": "RUNNING"
        },
        {
            "NodeInstanceId": "output_node",
            "NodeId": "hdmi_data_sink-1.0-9c23xmpl-hdmi0",
            "PackageName": "hdmi_data_sink",
            "PackageVersion": "1.0",
            "PackagePatchVersion": "9c23xmplc4c98b92baea4af676c8b16063d17945a3f6bd8f83f4ff5aa0d0b394",
            "NodeName": "hdmi0",
            "CurrentStatus": "RUNNING"
        },
        {
            "NodeInstanceId": "model_node",
            "NodeId": "SQUEEZENET_PYTORCH-1.0-5d3cabda-interface",
            "PackageName": "SQUEEZENET_PYTORCH",
            "PackageVersion": "1.0",
            "PackagePatchVersion": "5d3cxmplb7113faa1d130f97f619655d8ca12787c751851a0e155e50eb5e3e96",
            "NodeName": "interface",
            "CurrentStatus": "RUNNING"
        }
    ]
}
```

## 管理摄像头流式传输
<a name="api-applications-cameras"></a>

您可以使用 [SignalApplicationInstanceNodeInstances](https://docs.aws.amazon.com/panorama/latest/api/API_SignalApplicationInstanceNodeInstances.html)API 暂停和恢复摄像机直播节点。

```
$ aws panorama signal-application-instance-node-instances --application-instance-id applicationInstance-ddaxxmpl2z7bg74ywutd7byxuq \
        --node-signals '[{"NodeInstanceId": "camera_node_override", "Signal": "PAUSE"}]'
{
    "ApplicationInstanceId": "applicationInstance-ddaxxmpl2z7bg74ywutd7byxuq"
}
```

在脚本中，您可以获取节点列表，并选择一个节点以交互方式暂停或恢复。

**Example [pause-camera.sh](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/util-scripts/pause-camera.sh) – 使用**  

```
my-app$ ./pause-camera.sh

Getting nodes...
0: SAMPLE_CODE              RUNNING
1: warehouse-floor          RUNNING
2: hdmi_data_sink           RUNNING
3: entrance-north           PAUSED
4: SQUEEZENET_PYTORCH       RUNNING
Choose a node
1
Signalling node warehouse-floor
+ aws panorama signal-application-instance-node-instances --application-instance-id applicationInstance-r3a7xmplcbmpjqeds7vj4b6pjy --node-signals '[{"NodeInstanceId": "warehouse-floor", "Signal": "PAUSE"}]'
{
    "ApplicationInstanceId": "applicationInstance-r3a7xmplcbmpjqeds7vj4b6pjy"
}
```

通过暂停和恢复摄像头节点，您可以循环处理比同时处理数量更多的摄像头流式传输。为此，请将多个摄像头流式传输映射到覆盖清单中的同一输入节点。

在以下示例中，覆盖清单将两个摄像头流式传输 `warehouse-floor` 和 `entrance-north` 映射到同一输入节点 (`camera_node`)。当应用程序启动并且 `entrance-north` 节点等待信号开启时，`warehouse-floor` 流式传输处于活动状态。

**Example [override-multicam.json](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/aws-panorama-sample/graphs/my-app/override-multicam.json)**  

```
    "nodeGraphOverrides": {
        "nodes": [
            {
                "name": "warehouse-floor",
                "interface": "123456789012::warehouse-floor.warehouse-floor",
                "launch": "onAppStart"
            },
            {
                "name": "entrance-north",
                "interface": "123456789012::entrance-north.entrance-north",
                "launch": "onSignal"
            },
        ...
        "packages": [
            {
                "name": "123456789012::warehouse-floor",
                "version": "1.0"
            },
            {
                "name": "123456789012::entrance-north",
                "version": "1.0"
            }
        ],
        "nodeOverrides": [
            {
                "replace": "camera_node",
                "with": [
                    {
                        "name": "warehouse-floor"
                    },
                    {
                        "name": "entrance-north"
                    }
                ]
            }
```

有关使用 API 进行部署的详细信息，请参阅 [自动化应用程序部署](api-deploy.md)。

# 使用 VPC 端点
<a name="api-endpoints"></a>

如果您在无法访问互联网的 VPC 中工作，则可以创建一个 [VPC 端点](#services-vpc-interface)以与 AWS Panorama 一起使用。VPC 端点允许在私有子网中运行的客户端无需互联网连接即可连接到 AWS 服务。

有关 AWS Panorama 设备使用的端口和端点的详细信息，请参阅 [将 AWS Panorama Appliance 连接到您的网络](appliance-network.md)。

**Topics**
+ [创建 VPC 端点](#services-vpc-interface)
+ [将设备连接到私有子网](#services-vpc-appliance)
+ [示例 AWS CloudFormation 模板](#services-vpc-templates)

## 创建 VPC 端点
<a name="services-vpc-interface"></a>

要在 VPC 和 AWS Panorama 之间建立私有连接，请创建 *VPC 端点*。使用 AWS Panorama 不需要 VPC 端点。只有在无法访问互联网的 VPC 中工作时，才需要创建 VPC 端点。当 AWS CLI 或软件开发工具包尝试连接到 AWS Panorama 时，流量将通过 VPC 端点进行路由。

使用以下设置为 AWS Panorama [创建 VPC 端点](https://console.aws.amazon.com//vpc/home#CreateVpcEndpoint:)：
+ **服务名称** – **com.amazonaws.*us-west-2*.panorama**
+ **类型** – **接口**

VPC 端点可使用服务的 DNS 名称从 AWS 软件开发工具包客户端获取流量，而无需任何额外配置。有关使用 VPC 端点的更多信息，请参阅 *Amazon VPC 用户指南*中的[接口 VPC 端点](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html)。

## 将设备连接到私有子网
<a name="services-vpc-appliance"></a>

AWS Panorama 设备可以通过私有 VPN 连接与 AWS Site-to-Site VPN 或进行连接 AWS Direct Connect。 AWS 借助这些服务，您可以创建一个延伸至数据中心的私有子网。设备连接到私有子网并通过 VPC 终端节点访问 AWS 服务。

Site-to-Site VPN 以及 Direct Connect 用于将您的数据中心安全地连接到 Amazon VPC 的服务。使用 Site-to-Site VPN，您可以使用市售的网络设备进行连接。 Direct Connect 使用 AWS 设备进行连接。

****
+ **Site-to-Site VPN** — [什么是 AWS Site-to-Site VPN？](https://docs.aws.amazon.com/vpn/latest/s2svpn/)
+ **Direct Connect** – [什么是 AWS Direct Connect？](https://docs.aws.amazon.com/directconnect/latest/UserGuide/)

将本地网络连接到 VPC 中的私有子网后，请为以下服务创建 VPC 端点。

****
+ **Amazon Simple Storage Service** – [适用于 Amazon S3 的AWS PrivateLink](https://docs.aws.amazon.com/AmazonS3/latest/userguide/privatelink-interface-endpoints.html)
+ **AWS IoT Core** – [将 AWS IoT Core 与接口 VPC 端点配合使用](https://docs.aws.amazon.com/iot/latest/developerguide/IoTCore-VPC.html)（数据面板和凭证提供程序）
+ **Amazon Elastic 容器注册表** – [亚马逊弹性容器注册表接口 VPC 端点](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html)
+ **亚马逊 CloudWatch** — [使用 CloudWatch 接口 VPC 终端节点](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-and-interface-VPC.html)
+ **Amazon CloudWatch 日志** — [使用带有接口 VPC 终端节点的 CloudWatch 日](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html)志

该设备无需连接 AWS Panorama 服务。它通过中的消息渠道与 AWS Panorama 通信。 AWS IoT

除了 VPC 终端节点外，Amazon S3 和还 AWS IoT 需要使用 Amazon Route 53 私有托管区域。私有托管区域将来自子域（包括 Amazon S3 接入点和 MQTT 主题的子域）的流量路由到正确的 VPC 端点。有关私有托管区域的信息，请参阅 Amazon Route 53 开发者指南中的[使用私有托管区域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-private.html)。

有关包含 VPC 端点和私有托管区域的 VPC 配置示例，请参阅 [示例 AWS CloudFormation 模板](#services-vpc-templates)。

## 示例 AWS CloudFormation 模板
<a name="services-vpc-templates"></a>

本指南的 GitHub 存储库提供了 AWS CloudFormation 模板，您可以使用这些模板来创建用于 AWS Panorama 的资源。这些模板创建了一个包含两个私有子网、一个公有子网和一个 VPC 端点的 VPC。您可以使用 VPC 中的私有子网来托管与互联网隔离的资源。公有子网中的资源可以与私有资源通信，但无法从互联网访问私有资源。

**Example [vpc-endpoint.yml](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/cloudformation-templates/vpc-endpoint.yml) – 私有子网**  

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  vpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 172.31.0.0/16
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: !Ref AWS::StackName
  privateSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref vpc
      AvailabilityZone:
        Fn::Select:
         - 0
         - Fn::GetAZs: ""
      CidrBlock: 172.31.3.0/24
      MapPublicIpOnLaunch: false
      Tags:
        - Key: Name
          Value: !Sub  ${AWS::StackName}-subnet-a
  ...
```

`vpc-endpoint.yml` 模板展示了如何为 AWS Panorama 创建 VPC 端点。您可以使用此终端节点通过 AWS 软件开发工具包管理 AWS Panorama 资源或 AWS CLI。

**Example [vpc-endpoint.yml](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/cloudformation-templates/vpc-endpoint.yml) – VPC 端点**  

```
  panoramaEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub com.amazonaws.${AWS::Region}.panorama
      VpcId: !Ref vpc
      VpcEndpointType: Interface
      SecurityGroupIds:
      - !GetAtt vpc.DefaultSecurityGroup
      PrivateDnsEnabled: true
      SubnetIds:
      - !Ref privateSubnetA
      - !Ref privateSubnetB
      PolicyDocument:
        Version: 2012-10-17		 	 	 
        Statement:
        - Effect: Allow
          Principal: "*"
          Action:
            - "panorama:*"
          Resource:
            - "*"
```

`PolicyDocument` 是一种基于资源的权限策略，用于定义可使用端点进行的 API 调用。您可以修改策略以限制可通过端点访问的操作和资源。有关更多信息，请参阅《Amazon VPC User Guide》**中的 [Controlling access to services with VPC endpoints](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-access.html)。

`vpc-appliance.yml` 模板展示了如何为 AWS Panorama 设备使用的服务创建 VPC 端点和私有托管区域。

**Example [vpc-appliance.yml](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/cloudformation-templates/vpc-appliance.yml) – 带有私有托管区域的 Amazon S3 接入点端点**  

```
  s3Endpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      ServiceName: !Sub com.amazonaws.${AWS::Region}.s3
      VpcId: !Ref vpc
      VpcEndpointType: Interface
      SecurityGroupIds:
      - !GetAtt vpc.DefaultSecurityGroup
      PrivateDnsEnabled: false
      SubnetIds:
      - !Ref privateSubnetA
      - !Ref privateSubnetB
...
  s3apHostedZone:
    Type: AWS::Route53::HostedZone
    Properties:
      Name: !Sub s3-accesspoint.${AWS::Region}.amazonaws.com
      VPCs: 
        - VPCId: !Ref vpc
          VPCRegion: !Ref AWS::Region
  s3apRecords:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: !Ref s3apHostedZone
      Name: !Sub "*.s3-accesspoint.${AWS::Region}.amazonaws.com"
      Type: CNAME
      TTL: 600
      # first DNS entry, split on :, second value
      ResourceRecords: 
      - !Select [1, !Split [":", !Select [0, !GetAtt s3Endpoint.DnsEntries ] ] ]
```

示例模板演示了如何使用示例 VPC 创建 Amazon VPC 和 Route 53 资源。您可以通过删除 VPC 资源并将对子网、安全组和 VPC 的引用替换为您的资源来调整这些内容，以适应您的 IDs 用例。 IDs 