애플리케이션 배포 자동화 - AWS Panorama

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

애플리케이션 배포 자동화

애플리케이션을 배포하려면 AWS Panorama 애플리케이션 CLI와 AWS Command Line Interface을 모두 사용합니다. 애플리케이션 컨테이너를 구축한 후 Amazon S3 액세스 포인트에 애플리케이션 및 기타 자산을 업로드합니다. 그러면 CreateApplicationInstance API를 사용하여 애플리케이션 배포할 수 있습니다.

표시된 스크립트 사용에 대한 자세한 컨텍스트 및 지침은 샘플 애플리케이션 README의 지침을 따르십시오.

컨테이너 빌드

애플리케이션 컨테이너를 빌드하려면 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

명령줄 완성 기능을 사용하여 경로의 일부를 입력한 다음 TAB을 눌러 경로 인수를 채울 수도 있습니다.

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

컨테이너 업로드 및 노드 등록

애플리케이션을 업로드하려면 package-application 명령을 사용하십시오. 이 명령은 assets 폴더의 자산을 AWS Panorama가 관리하는 Amazon S3 액세스 포인트에 업로드합니다.

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

AWS Panorama Application CLI는 각 패키지의 패키지 구성(package.json)에서 참조하는 컨테이너 및 설명자 자산을 업로드하고 패키지를 AWS Panorama의 노드로 등록합니다. 그런 다음 애플리케이션 매니페스트(graph.json)에서 이러한 노드를 참조하여 애플리케이션을 배포합니다.

애플리케이션 배포

애플리케이션을 배포하려면 CreateApplicationInstance API를 사용하십시오. 이 작업에는 특히 다음과 같은 파라미터가 사용됩니다.

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

배포 스크립트는 ListDevices API를 사용하여 현재 리전에 등록된 디바이스 목록을 가져오고, 이후 배포를 위해 사용자 선택 항목을 로컬 파일에 저장합니다.

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)에 의해 생성됩니다. 배포 스크립트는 이 역할의 ARN을 AWS 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

배포 모니터링

배포를 모니터링하려면 ListApplicationInstances API를 사용하십시오. 모니터 스크립트는 애플리케이션 디렉토리의 파일에서 디바이스 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

배포가 완료되면 Amazon CloudWatch Logs API를 호출하여 로그를 볼 수 있습니다. 로그 보기 스크립트는 CloudWatch Logs GetLogEvents API를 사용합니다.

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