

지원 종료 알림: 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 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
```