

지원 종료 알림: 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-scripts](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>

디바이스 ID를 사용하여 디바이스 목록을 가져오려면 [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를 사용하여 무선 업데이트(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 Application 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) – 매니페스트 작성**  

```
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 [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
```

# 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`)에 매핑합니다. `warehouse-floor` 스트림은 애플리케이션이 시작되고 `entrance-north` 노드가 신호가 켜질 때까지 기다리면 활성화됩니다.

**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에서 작업하는 경우, AWS Panorama와 함께 사용할 [VPC 엔드포인트](#services-vpc-interface)를 생성할 수 있습니다. VPC 엔드포인트를 사용하면 프라이빗 서브넷에서 실행되는 클라이언트가 인터넷 연결 없이 AWS 서비스에 연결할 수 있습니다.

AWS Panorama 어플라이언스에서 사용하는 포트 및 엔드포인트에 대한 자세한 내용은 [AWS Panorama 어플라이언스를 네트워크에 연결하기](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 또는 SDK가 AWS Panorama에 연결을 시도하면 트래픽이 VPC 엔드포인트를 통해 라우팅됩니다.

다음 설정을 사용하여 AWS Panorama용 [VPC 엔드포인트를 생성](https://console.aws.amazon.com//vpc/home#CreateVpcEndpoint:)하십시오.
+ **서비스 이름** – **com.amazonaws.*us-west-2*.panorama**
+ **유형** – **인터페이스**

VPC 엔드포인트는 추가 구성 없이 서비스의 DNS 이름을 사용하여 AWS SDK 클라이언트로부터 트래픽을 가져옵니다. VPC 엔드포인트 사용에 대한 자세한 내용은 *Amazon VPC 사용 설명서*의 [VPC 엔드포인트](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html)를 참조하십시오.

## 어플라이언스를 프라이빗 서브넷에 연결
<a name="services-vpc-appliance"></a>

AWS Panorama 어플라이언스는 AWS Site-to-Site VPN 또는 와의 프라이빗 VPN 연결을 AWS 통해에 연결할 수 있습니다 AWS Direct Connect. 이러한 서비스를 사용하여 데이터 센터까지 확장되는 프라이빗 서브넷을 생성할 수 있습니다. 어플라이언스는 프라이빗 서브넷에 연결하고 VPC 엔드포인트를 통해 AWS 서비스에 액세스합니다.

Site-to-Site VPN 및 Direct Connect 는 데이터 센터를 Amazon VPC에 안전하게 연결하기 위한 서비스입니다. Site-to-Site VPN을 사용하면 상용 네트워크 디바이스를 사용하여 연결할 AWS 디바이스를 연결하고 Direct Connect 사용할 수 있습니다.

****
+ **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** – [인터페이스 VPC 엔드포인트와 함께 AWS IoT Core 사용](https://docs.aws.amazon.com/iot/latest/developerguide/IoTCore-VPC.html)(데이터 영역 및 보안 인증 정보 공급자)
+ **Amazon Elastic 컨테이너 레지스트리** – [Amazon Elastic 컨테이너 레지스트리 인터페이스 VPC 엔드포인트](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html)
+ **Amazon CloudWatch** – [인터페이스 VPC 엔드포인트와 함께 CloudWatch 사용 ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-and-interface-VPC.html)
+ **Amazon CloudWatch Logs** – [인터페이스 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 및는 Amazon Route 53 프라이빗 호스팅 영역을 사용해야 AWS IoT 합니다. 프라이빗 호스팅 영역은 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 Panorama에서 사용할 리소스를 생성하는 데 사용할 수 있는 AWS CloudFormation 템플릿을 제공합니다. 템플릿은 두 개의 프라이빗 서브넷, 퍼블릭 서브넷, 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 SDK 또는를 사용하여 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 사용 설명서*의 [VPC 엔드포인트를 통해 서비스에 대한 액세스 제어](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 ID에 대한 참조를 리소스의 ID로 대체하여 사용 사례에 맞게 조정할 수 있습니다.