アプリケーションのデプロイを自動化する - AWS Panorama

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

アプリケーションのデプロイを自動化する

アプリケーションをデプロイするには、AWS Panorama アプリケーション CLI AWS Command Line Interface との両方を使用します。アプリケーションコンテナを構築したら、それと他のアセットを Amazon S3 Access Points にアップロードします。次に、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 Access Points にアセットをアップロードします。

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

AWS Panorama アプリケーション CLI は、各パッケージのパッケージ設定 (package.json) によって参照されるコンテナアセットと記述子アセットをアップロードし、パッケージを AWS Panorama のノードとして登録します。次に、アプリケーションマニフェスト (graph.json) でこれらのノードを参照してアプリケーションをデプロイします。

アプリケーションのデプロイ

アプリケーションをデプロイするには、CreateApplicationInstance API を使用します。このアクションは、特に以下のパラメーターを取ります。

  • ManifestPayload — アプリケーションのノード、パッケージ、エッジ、パラメータを定義するアプリケーションマニフェスト (graph.json)。

  • ManifestOverridesPayload — 最初のマニフェストのパラメータをオーバーライドする 2 つ目のマニフェスト。アプリケーション マニフェストはアプリケーション ソース内の静的リソースとみなすことができ、オーバーライド マニフェストはデプロイをカスタマイズするデプロイ時設定を提供します。

  • 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