AWS IoT Greengrass AI Agents Context Packがリリース!AI エージェントでデバイスアプリケーションを開発してみた

AWS IoT Greengrass AI Agents Context Packがリリース!AI エージェントでデバイスアプリケーションを開発してみた

2025.11.07

先日、AWS IoT Greengrass AI Agents Context Pack なるものが AWS からリリースされました。

https://aws.amazon.com/jp/about-aws/whats-new/2025/10/ai-agent-context-pack-iot-greengrass-developers/

これは、Greengrass コンポーネントの開発などにおいて、その手順やサンプル、テンプレートなどを AI エージェントなどのコンテキストとして利用することで、一連のサイクルを加速化してくれるものです。

Greengrass の利用において、Greengrass環境のセットアップやコンポーネントの開発は、事前にやることが多く慣れていても骨の折れる作業でした。

これらの対応をいい感じに AI エージェントが吸収して、開発を代行してくれると Greengrass を利用するハードルが下がる気がします。
ということで、早速試してみたのでその内容をご紹介します。

今回の検証環境について

  • Greengrass デバイス:
    • Greengrass が利用できる Raspberry Pi
    • すでに Greengrass 環境がインストール済みとします。
  • EC2:
    • Greengrass コンポーネントの開発環境
    • この EC2 に Amazon Q Developer CLI をインストールしてコンポーネントを開発

EC2 に AmazonQ Developer CLI をインストール

最初に適当な EC2 インスタンスを作り、Amazon Q Developer CLI をインストールします。
今回はすでに別用途で使っていた Ubuntu の環境があったので、それを流用することにしました。

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 24.04.2 LTS
Release:	24.04
Codename:	noble
$ uname -a
Linux ip-10-60-4-20 6.14.0-1014-aws #14~24.04.1-Ubuntu SMP Tue Sep 23 14:51:14 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux

インストールしていきます。

cd ~
mkdir -p amazon-q-install
cd amazon-q-install
curl --proto '=https' --tlsv1.2 -sSf \
"https://desktop-release.q.us-east-1.amazonaws.com/latest/q-x86_64-linux.zip" \
-o "q.zip"
$ ls -lh q.zip
-rw-rw-r-- 1 ubuntu ubuntu 196M Nov  5 09:03 q.zip
sudo apt install unzip
$ unzip q.zip
Archive:  q.zip
   creating: q/
  inflating: q/install.sh
  inflating: q/README
  inflating: q/BUILD-INFO
   creating: q/bin/
  inflating: q/bin/q
  inflating: q/bin/qterm
  inflating: q/bin/qchat
$ ./q/install.sh
✔ Do you want q to modify your shell config (you will have to manually do this otherwise)? · Yes
✔ Select login method · Use for Free with Builder ID

Confirm the following code in the browser
Code: XXXX-XXXX

Open this URL: https://view.awsapps.com/start/#/device?user_code=XXXX-XXXX
▰▰▱▱▱▱▱ Logging in...

インストーラーを実行すると生成される、上記の URL にブラウザでアクセスします。

01-q-login-builder-id-2.png

確認用のコードがメールで届きます。

02-verify-code-by-mail.png

先程の画面に戻って、メールで届いたコードを入力します。

03-verify-code-2.png

次の画面で写ったコードが、Q のインストール時に表示されたコードと同じであることを確認します。

04-request-code-2.png

これで Q Developer CLI が利用できるようになりました。

05-accepted-q-dev-cli-request.png

Greengrass コンポーネントの作成に必要な IAM 権限を EC2 に付与

Greengrass のコンポーネント作成では、S3, Greengrass, AWS IoT に対する作業権限が必要になりますが、今回は細かい権限指定はせずに雑にマネージドポリシーを持つ IAM Role を EC2 に付与しました。
(本来は必要に応じて厳密にポリシーを定義するべきです)

10-greengrass-agent-role.png

Amazon Q Developer CLIのカスタムエージェントの作成

次に開発用の EC2 インスタンスにログインして、今回のコンテキストパックのリポジトリからソースをクローンしておきます。

リポジトリのクローン

$ git clone https://github.com/aws-greengrass/greengrass-agent-context-pack.git
cd greengrass-agent-context-pack

カスタムエージェントの作成

次に、Amazon Q Developer CLIでチャットセッションを開始し、カスタムエージェントを作成します。

$ q chat

20-launch-q-dev-cli.png

チャット内で以下のコマンドを実行:

/agent create --name greengrass-agent

これにより、デフォルトエディタでエージェント設定ファイル( ~/.aws/amazonq/cli-agents/greengrass-agent.json )が開きます。

このカスタムエージェントは、設定ファイルのパスの構造的にグローバルなスコープで作られるので、どのプロジェクトからも利用可能なエージェントになります。

参考ブログはこちらをご参照ください。

https://dev.classmethod.jp/articles/amazon-q-developer-cli-custom-agent/

  • エージェント設定の編集

以下の例を参考に、Greengrass Context Packを含むようにエージェント設定を編集します。

~/.aws/amazonq/cli-agents/greengrass-agent.json
{
	"$schema": "https://raw.githubusercontent.com/aws/amazon-q-developer-cli/refs/heads/main/schemas/agent-v1.json",
	"name": "greengrass-agent",
	"description": "AWS IoT Greengrass development assistant with context pack",
	"prompt": "You are an expert AWS IoT Greengrass developer assistant. You have access to comprehensive Greengrass setup guides,component examples, and deployment workflows. Always follow the documentation-first workflow and verify end-to-end functionality.",
	"tools": [
		"fs_read",
		"fs_write",
		"execute_bash",
		"use_aws"
	],
	"allowedTools": [
		"fs_read"
	],
	"toolsSettings": {
		"fs_read": {
			"allowedPaths": [
				"~/greengrass-agent-context-pack/**"
			]
		},
		"execute_bash": {
			"allowReadOnly": true,
			"allowedCommands": [
				"git status",
				"docker ps",
				"docker images",
				"aws iot .*",
				"aws greengrass .*"
			]
		},
		"use_aws": {
			"allowedServices": [
				"iot",
				"greengrass",
				"s3",
				"iam",
				"logs"
			]
		}
	},
	"resources": [
		"file://~/greengrass-agent-context-pack/README.md",
		"file://~/greengrass-agent-context-pack/AGENTS.md",
		"file://~/greengrass-agent-context-pack/setup/**/*.md",
		"file://~/greengrass-agent-context-pack/components/**/*.yaml",
		"file://~/greengrass-agent-context-pack/examples/**/*.md"
	],
	"hooks": {
		"agentSpawn": [
			{
				"command": "echo 'Working directory: '$(pwd)",
				"timeout_ms": 5000
			}
		]
	}
}

これでカスタムエージェント「greengrass-agent」が作成できました。
設定ファイルを保存したら、新しいチャットセッションを開始するために一度チャットを終了しておきます。

/quit

AI エージェントで簡単な Greengrass コンポーネントを作ってみる

AI エージェントでコンポーネントを作る

新しいセッションを開始して、コンポーネントの作成を開始しましょう。
(作業ディレクトリはどこでもOKです。指定のエージェントを読み出します)

$ q chat --agent greengrass-agent

21-create-component.png

このエージェントに対して次の指示を与えてコンポーネントを作成してもらいます。

- 次のダミーデータを生成して、デバイスのローカルファイルにデータを記録します。
  - timestamp: データの生成時間です
  - 整数のダミーデータ:5秒ごとにインクリメントした値です。
  - ファイルはCSV形式でカラムは `timestamp,data` にしてください。
- 上記のデータを `/tmp/ggc-dummy.csv` というファイルに追記形式で出力します。
- カスタムコンポーネントの名前は `agent-test-local-component` にしてください
- カスタムコンポーネントは python で作成してください

指示を出すと、サンプルのスクリプトやレシピを参照して学習が始まります。

22-read-files.png

必要なファイルの参照が終われば、次にコンポーネントの作成に移ります。
最初に作業ディレクトリを /tmp/agent-test-local-component/src として作成しています。

23-create-files.png

Greengrass コンポーネントに必要となるレシピファイルや処理の実体となるスクリプトファイルが作成されます。
コンポーネントが作成できたら、ローカルでテストを実施しています。

24-test-component.png

テストもパスできたら、コンポーネントの作成が完了です。
アーティファクトとして Greengrass に登録するための ZIP ファイルも作成してくれていますね。

25-created-component.png

実際に作成された Python コードは次のようなシンプルな内容でした。

src/main.py
#!/usr/bin/env python3

import csv
import time
from datetime import datetime

def main():
    counter = 0
    csv_file = '/tmp/ggc-dummy.csv'

    # CSVヘッダーを書き込み(ファイルが存在しない場合のみ)
    try:
        with open(csv_file, 'x', newline='') as f:
            writer = csv.writer(f)
            writer.writerow(['timestamp', 'data'])
    except FileExistsError:
        pass

    while True:
        timestamp = datetime.now().isoformat()

        # CSVファイルにデータを追記
        with open(csv_file, 'a', newline='') as f:
            writer = csv.writer(f)
            writer.writerow([timestamp, counter])

        counter += 1
        time.sleep(5)

if __name__ == "__main__":
    main()

コンポーネントのデプロイを AI エージェントで実行する

それでは、コンポーネントを Greengrass デバイスにデプロイするのもエージェントにやってもらいましょう。

26-deploy-start.png

最初にデプロイするデバイスの情報を収集しようとしています。
us-east-1 リージョンを調べているようです。Greengrass デバイスの登録があるのは、ap-northeast-1 なのでデプロイの対象となるリージョンを教えてあげました。

さらにこの画面ショットでは AWS CLI を利用しているのが分かります。
もし AWS CLI がインストールされていなければ、ここで処理が失敗しますが、エージェントが自分で AWS CLI のインストールまでやってくれました。

27-modify-region.png

あとはエージェントが Greengrass に登録されているデバイスなどを確認して、そのデバイスにデプロイを開始します。
エージェントは最初に S3 バケットを作成しています。このバケットはコンポーネントを Greengrass に登録するために必要なアーティファクトのアップロード先となります。

28-upload-artifact-2.png

次にコンポーネントの登録が行われます。
コンポーネントの登録が完了したら、最後に Greengrass デバイスへのデプロイが実施されます。

29-create-deploy-2.png

AWS CLI でcreate-deployment が実行されています。
デプロイ後、そのデプロイが成功したかどうかステータスの確認まで行ってくれてます。

30-create-deploy-2.png

しかし、今回のデプロイは失敗してしまったようです。
Greengrass をデバイスで利用する場合、デバイスに Greengrass コアソフトウェアという中核となるソフトウェアをインストールするのですが、このコアソフトウェアには2種類あります。

  • 従来のコアソフトウェア: 比較的リッチなマシン環境で利用。汎用的に使える。
  • Greengras Lite:マシンリソースが少ない環境用。メモリフットプリントが最小限になるように最適化されている。

今回、エージェントが作成したものは「Greengrass Lite」用のものだったようなので、エージェントが自ら作り直しをしています。

31-error-deploy.png

しかし、残念ながら上記の修正を行っても、このコンポーネントはデプロイは成功しましたが、正常に実行できませんでした。
エラーログの内容を読ませて何度か調査を依頼しましたが、解決に至りませんでした。

そこで、私の方で間違いと思われる箇所を特定し、その修正依頼をしています。
実際には、コンポーネントのレシピで正しくないレシピ変数が使われていました。

32-modify-recipe.png

ただ、実際には私の修正依頼も微妙に間違えていて、最終的に下記で修正依頼を出しています。

run: 'python3 {artifacts:decompressedPath}/agent-test-local-component/src/main.py'

33-modify-recipe2.png

修正できたら、そのままデプロイまで実行してくれました。
デプロイも正常に完了しています。

34-deploy-status.png

Greengrass デバイスにログインして動作確認してみます。
最初のプロンプトで指示したとおり、tmp/ggc-dummy.csvに 5 秒間隔でログが出力されていました。

35-csv-check.png

途中で、人(筆者)が介入してミスの修正を行いましたが、ここまでは非常にスムーズにコンポーネントの開発・デプロイを進めることができました。

それでは次に AWS IoT Core とデータ連携するコンポーネントを作ってみます。
先程のような単純な内容ではないので、どこまでできるのか試しみましょう。

AWS IoT Core とデータ連携するコンポーネントを作ってみる

次に作成するのは、デバイスのデータを Greengrass デバイスから AWS IoT Core に Publish するコンポーネントを作ってみようと思います。

IoT Core と MQTT Pub/Sub するには、汎用の MQTT ライブラリなどを使うこともできますが、今回は、AWS IoT の SDK を使って IPC(プロセス間通信)によるデータ送信を実装させてみます。

新規に別のコンポーネントを作るので一旦チャットを抜けます。

/quit

先程のエージェントを指定して、新しいセッションを開始します。
(作業ディレクトリはどこでもOK。指定のエージェントを読み出します)

$ q chat --agent greengrass-agent

次のプロンプトを投入します。

次の 2 種類のセンサーデータをダミーで生成して、AWS IoT Core に MQTT で 5 秒間隔で Publish するカスタムコンポーネントを作成してください。

- value: 整数で 5 秒ごとにインクリメントした値
- timestamp: データ生成した時間を ISO8601 形式で記載

パブリッシュ先のトピックは、`topic/agent-test` にしてください。
データのフォーマットは JSON にしてください。
カスタムコンポーネントの名前は `agent-test-ipc` にしてください
カスタムコンポーネントは python で作成してください

先ほどと同じ流れでコンポーネントが作成されていきましたが、今回はアーティファクトをアップロードする S3 バケットは自動で作成されませんでした。

37-select-s3-bucket.png

そのため事前に作成した S3 バケットを指定してコンポーネントを Greengrass に登録させています。

38-specify-s3.png

しかし、また異なるリージョンを参照してエラーになっていたので、あらためてリージョンを指定し直しています。

39-modify-s3-2.png

これでコンポーネントが無事に登録できたので、デバイスにデプロイを実行してもらえば完了です。
と思いましたが、そう簡単にはいきませんでした…

トラブルシュート 〜デプロイできたけどメッセージが AWS に届かない〜

先程の手順で AI によるデプロイ自体は成功するものの、AWS IoT Core にメッセージが届かず、デバイス上のログにエラーが出力されていました。

このとき生成されていたコードは次のとおりです。

#!/usr/bin/env python3

import json
import logging
import os
import sys
import time
from datetime import datetime, timezone

try:
    from awsiot.greengrasscoreipc.clientv2 import GreengrassCoreIPCClientV2
    GREENGRASS_IPC_AVAILABLE = True
except ImportError:
    GREENGRASS_IPC_AVAILABLE = False
    logging.warning("Greengrass IPC が利用できません - シミュレーションモードで実行")

# ログ設定
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger('AgentTestIPC')

class AgentTestPublisher:
    def __init__(self):
        self.config = self.load_configuration()
        self.ipc_client = None
        self.counter = 0
        self.setup_ipc_client()

    def load_configuration(self):
        """コンポーネント設定を読み込み"""
        try:
            config = {
                "topic": "topic/agent-test",
                "interval": 5
            }

            # 環境変数から設定を読み込み(テスト用)
            config["topic"] = os.environ.get('GG_TOPIC', config["topic"])
            config["interval"] = int(os.environ.get('GG_INTERVAL', config["interval"]))

            return config
        except Exception as e:
            logger.error(f"設定の読み込みに失敗: {e}")
            raise

    def setup_ipc_client(self):
        """Greengrass IPC V2クライアントを初期化"""
        if GREENGRASS_IPC_AVAILABLE:
            try:
                self.ipc_client = GreengrassCoreIPCClientV2()
                logger.info("Greengrass IPC V2に接続しました")
            except Exception as e:
                logger.error(f"Greengrass IPC V2への接続に失敗: {e}")
                self.ipc_client = None
        else:
            logger.info("シミュレーションモードで実行 - メッセージはログのみに出力")

    def generate_sensor_data(self):
        """センサーデータを生成"""
        self.counter += 1

        data = {
            "value": self.counter,
            "timestamp": datetime.now(timezone.utc).isoformat()
        }

        return data

    def publish_to_iot_core(self, message_data):
        """IoT Coreにメッセージを送信"""
        try:
            message_json = json.dumps(message_data)

            if self.ipc_client:
                # 実際のGreengrass環境 - IPC V2使用
                self.ipc_client.publish_to_iot_core(
                    topic_name=self.config['topic'],
                    payload=message_json.encode('utf-8'),
                    qos=1
                )

                logger.info(f"IoT Coreトピック '{self.config['topic']}' に送信: {message_json}")
            else:
                # シミュレーションモード
                logger.info(f"[シミュレーション] トピック '{self.config['topic']}' に送信予定: {message_json}")

        except Exception as e:
            logger.error(f"メッセージの送信に失敗: {e}")
            raise

    def run(self):
        """メインコンポーネントループ"""
        logger.info("Agent Test IPCコンポーネントを開始...")
        logger.info(f"設定: {json.dumps(self.config, indent=2)}")

        try:
            while True:
                sensor_data = self.generate_sensor_data()
                self.publish_to_iot_core(sensor_data)
                time.sleep(self.config['interval'])

        except KeyboardInterrupt:
            logger.info("Agent Test IPCコンポーネントを停止...")
        except Exception as e:
            logger.error(f"予期しないエラー: {e}")
            sys.exit(1)
        finally:
            if self.ipc_client:
                self.ipc_client.close()

if __name__ == "__main__":
    publisher = AgentTestPublisher()
    publisher.run()

エージェントはエラーに対して、このコードを更に肥大化し複雑化させていってしまい、直感的に「トラブルシュートの方向性が間違っている」と感じたので、途中でコードを極力シンプルなものに書き換えるよう指示を出しました。

最終的に生成されたコードは以下の通りで、スッキリしたものになりました。
トラブルシュートの方向が間違っていると、原因の本質を見失いコードがカオスになるので、まずはコードをシンプルにして、別の部分を見直し改善を図りました。
その改善で解決できれば、その後でコードをよりしっかりしたものに作り込んでいく方がいいように思います。

#!/usr/bin/env python3

import json
import logging
import time
import traceback
from datetime import datetime, timezone

from awsiot.greengrasscoreipc.clientv2 import GreengrassCoreIPCClientV2

# ログ設定
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def main():
    counter = 0

    try:
        # IPC クライアント作成
        ipc_client = GreengrassCoreIPCClientV2()
        logger.info("IPC クライアントに接続しました")

        while True:
            counter += 1

            # メッセージ作成
            message = {
                "value": counter,
                "timestamp": datetime.now(timezone.utc).isoformat()
            }

            # IoT Core に送信 (payloadをbytes型に変換)
            ipc_client.publish_to_iot_core(
                topic_name="topic/agent-test",
                payload=json.dumps(message).encode('utf-8'),
                qos=1
            )

            logger.info(f"メッセージ送信: {message}")

            # 5秒待機
            time.sleep(5)

    except Exception as e:
        logger.error(f"エラー: {e}")
        logger.error(traceback.format_exc())

if __name__ == "__main__":
    main()

このように、このトラブルシュートを AI で完了させるのは難しいだろうと個人的な経験から想像できたので、生成されたコードの中身とレシピを自分で確認して、次の内容の修正指示を出しました。

エラーになっています。次の点を修正してください。

- レシピの「"run": "python3 {artifacts:path}/src/main.py"」を「run: 'python3 {artifacts:decompressedPath}/agent-test-ipc/src/main.py'」に修正してデプロイして下さい。
- IPCクライアントは 新しいバージョンである V2 を使ってください
	- 参考ドキュメント:https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html#ipc-service-connect
- Pythonのコードは下記のドキュメントに記載のコードを参考にして修正して下さい
	 - https://docs.aws.amazon.com/greengrass/v2/developerguide/ipc-iot-core-mqtt.html
- Greengrassデバイスの Python環境には awsiotsdk がインストールされていないので、レシピでインストールする指示を追加してください。実行するのは `python3 -m pip install awsiotsdk` です。
- ファイルの修正が終わったら、デプロイを実行せず変更内容を出力してください。

これでもまだエラーを解消できなかったのですが、何度かエラーログを読み込ませて、Python スクリプトやレシピを改修することで AWS IoT Core にメッセージを送ることができるようになりました。

主な修正ポイントは、下記の 2 点でした。

  1. レシピに記載する「コンポーネントに IPC 操作の実行を許可するポリシー」の不備を修正
  2. Python のコードでペイロードのフォーマットをバイナリとするように修正

1点目は、公式ドキュメントを見ながら不要なものを削除しました。

https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html

2 点目は、エラーをエージェントに読ませてエージェントに修正してもらいました。
IPC を使って AWS IoT Core と Pub/Sub する場合、メッセージのペイロードフォーマットを指定できます。
指定しない場合は、デフォルトでバイナリの byte 型になりますが、AI が生成したコードはテキストで処理するものになってたので、byte 型で処理することにしました。

- 35    :                 payload=json.dumps(message),
+ 35    :                 payload=json.dumps(message).encode('utf-8'),

なお、エージェントに渡したエラー情報は、Greengrass デバイス側の greengrass.log と コンポーネントのログのエラー箇所です。

https://docs.aws.amazon.com/ja_jp/greengrass/v2/developerguide/ipc-iot-core-mqtt.html#ipc-operation-publishtoiotcore

デバイス側の python 実行環境に関する配慮

ちなみに、対象の Greengrass デバイスには pip がインストールされていなかったので、pip のインストールは手動で直接実行しています。

# Greengrass デバイス上で手動で実行
sudo apt install python3-pip

このように、必要なライブラリがデバイス側にすでに利用できるのかどうかという観点も重要です。
エージェントを Greengrass デバイス上で利用することは少ないと思います。そのため盲目的になんでも AI にやらせようとすると 、AI はリモートデバイスの状況は確認できないので、思わぬ落とし穴になりがちです。

動作確認

これで全ての問題が解決しました。無事に topic/agent-test というトピックでAWS IoT Core 側でもメッセージを受信できています。

36-iot-core-client.png

AI agent context pack の注意点

今回は 2 種類のコンポーネントの開発・デプロイを試してみましたが、共通して注意した方が良いと思える点がいくつかありました。
特に、次の点は毎回失敗したので、追加でコンテキストに追加したほうがいいかと思いました。

コンポーネントのデプロイ時にアーティファクトの Zip 展開の指定がない

Python でコンポーネントを作ったとき、多くの場合は Zip にしたアーティファクトを S3 に保存すると思います。
このコンテキストパックでもアーティファクトは Zip にするように書かれています。

しかし実際には次のようなレシピが毎回、作成されていました。
ここでは、Artifact に zip ファイルが指定されており、ZIP展開も "Unarchive": "ZIP" と指定されています。

  "Manifests": [
    {
      "Platform": {
        "os": "linux"
      },
      "Lifecycle": {
        "run": "python3 {artifacts:path}/src/main.py"
      },
      "Artifacts": [
        {
          "Uri": "s3://greengrass-agent-test-ipc/agent-test-ipc/1.0.0/agent-test-ipc.zip",
          "Unarchive": "ZIP"
        }
      ]
    }
  ]

しかし、実際に動かすコンポーネントのスクリプトのパスは下記のようになっています。

"run": "python3 {artifacts:path}/src/main.py"

本来は ZIP 展開後のパスを参照するレシピ変数 {artifacts:decompressedPath} を使うべきです。
また、パスの後ろにコンポーネント名のディレクトリも入っている必要があります。
(元のディレクトリ構成に応じて、ZIP 展開後のパスを記載する必要があります)

"run": "python3 {artifacts:decompressedPath}/[YOUR_ARTIFACT_NAME]/src/main.py"

このアーティファクトのパスの指定は毎回間違えていて、デプロイすると該当のスクリプトが見つからないというエラーになっていました。

原因はコンテキストとして参照しているサンプルのレシピが全て次のようになっているためだと思います。これらのサンプルを修正すれば発生しなくなると思われます。

      "Lifecycle": {
        "run": "python3 {artifacts:path}/src/main.py"
      },
      "Artifacts": [
        {
          "Uri": "s3://YOUR_BUCKET/iot-core-publisher/1.0.0/iot-core-publisher.zip",
          "Unarchive": "ZIP"

サンプル集は下記です。

https://github.com/aws-greengrass/greengrass-agent-context-pack/tree/main/examples

利用リージョンが常に us-east-1

これも参照しているコンテキストに指定されているためと思います。
下記に記載されている AWS CLI では us-east-1 が明示的に指定されているので、これを利用するリージョンに修正すれば解消できると思われます。

https://github.com/aws-greengrass/greengrass-agent-context-pack/blob/main/deployment/deploy-components-to-greengrass-lite.md

awsiotsdk の利用について

個人的には Python のコードの内容が気になったので参考情報として紹介します。

IPC による AWS IoT Core との通信には、プロセス間通信 (IPC) ライブラリを利用しますが、このクライアントライブラリは改良バージョンである V2 の利用が推奨されています。

https://docs.aws.amazon.com/ja_jp/greengrass/v2/developerguide/interprocess-communication.html

公式ドキュメントでも次のようなサンプルが紹介されています。

from awsiot.greengrasscoreipc.clientv2 import GreengrassCoreIPCClientV2

try:
    ipc_client = GreengrassCoreIPCClientV2()
    # Use IPC client.
except Exception:
    print('Exception occurred when using IPC.', file=sys.stderr)
    traceback.print_exc()
    exit(1)

一方でコンテキストで紹介されるサンプルコードでは次のようになっています。

    import awsiot.greengrasscoreipc
    from awsiot.greengrasscoreipc.model import (
        PublishToTopicRequest,
        PublishMessage,
        BinaryMessage
    )

https://github.com/aws-greengrass/greengrass-agent-context-pack/blob/main/examples/ipc-publisher/src/main.py

なお、下記では GreengrassCoreIPCClientV2 from awsiotsdk を使うように記載がありましたが、Greengrass Lite のデバイスにデプロイするコンテキストとして紹介されていたので、場合によっては AI が実装に取り込まないケースがあるのかもしれません。

https://github.com/aws-greengrass/greengrass-agent-context-pack/blob/main/deployment/deploy-components-to-greengrass-lite.md

個人的には公式ドキュメントの内容に寄せたいので、ここもエージェントに修正の指示を出しました。

- IPCクライアントは 新しいバージョンである V2 を使ってください
	- 参考ドキュメント:https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html#ipc-service-connect
- Pythonのコードは下記のドキュメントに記載のコードを参考にして修正して下さい
	 - https://docs.aws.amazon.com/greengrass/v2/developerguide/ipc-iot-core-mqtt.html

awsiotsdk のインストールについて

あと、直接関係はないですが SDK のインストールについても注意が必要です。
エージェントは AWS CLI を使って AWS リソースにアクセスできますが、何も準備していなければリモートにあるデバイスには直接アクセスできません。
そのため、エージェントはデバイス側に SDK がインストールされているかどうかを考慮できません。

デバイスに SDK がインストールされていなければ、別途事前にインストールしておくか、コンポーネントのデプロイ時にインストールするようにレシピを作る必要があります。
どちらがいいかは運用の要件次第で変わりますが、今回はデプロイ時にインストールするようにレシピの修正を依頼しました。

- Greengrassデバイスの Python環境には awsiotsdk がインストールされていないので、レシピでインストールする指示を追加してください。実行するのは `python3 -m pip install awsiotsdk` です。

これでレシピが次のように編集されました。

      "Lifecycle": {
        "run": "python3 {artifacts:decompressedPath}/agent-test-ipc/src/main.py"
      },

      ↓ ↓ ↓(編集後)

      "Lifecycle": {
        "install": "python3 -m pip install awsiotsdk",
        "run": "python3 {artifacts:decompressedPath}/agent-test-ipc/src/main.py"
      },

使わないパラメータの記載がある

これも大したことではないのですが、レシピに使わないパラメーターの記載がありました。

  DefaultConfiguration:
    outputFile: /tmp/ggc-dummy.csv
    interval: 5

これもコンテキストで参照しているサンプルの内容を踏襲していることが原因と思われますが、スクリプトにはこれらのパラメーターがハードコードされていたので、あまり意味が無いかと思います。
私はこれらを削除する指示を出して使いました。

エージェントが自動で処理を進めすぎないように注意

エージェントに任せるとどんどん処理を自動で進めてくれますが、S3 バケットの作成やデプロイ先のデバイスの指定を、こちらの指示なしに独自の解釈で選別・判断して進めてしまうことがありました。

S3 バケットは作成するバケット名を確認されることがありましたが、デプロイ対象となるデバイスの特定は自動で実行されてしまったので、都度確認を入れるように進めるのが良いかと思います。

ちなみに、デプロイするデバイスの特定は「デバイスのステータスがアクティブで、最後のデプロイが一番新しいもの」という条件でした。

最後に

今回は、リリースされたばかりのコンテキストパックを試してみました。
ベストプラクティスに近い形で Greengrass コンポーネントを実装してくれるのは便利だなと思います。

しかし、サンプルに無いような複雑な要件があれば、別途、詳細仕様書などを追加で参照させたり、プロンプトを工夫する必要がありそうです。

また、比較的単純な要件(たとえばセンシングしたデータを一定間隔でローカルDB に蓄積)であれば、Greengrassの利用経験がある人なら、GDK CLI など従来のツールを使って作ってしまったほうが早い場合も多そうな印象を受けました。

逆に、コンポーネントとAWSの通信や、コンポーネント間の通信は IPC 通信を実装する必要があり、AWS 特有のプログラムになるので不慣れな人も多いと思います。
そのような場合に、AWS 固有の実装をエージェントが代行してくれると実装時間の短縮につながります。

このコンテキストパックは Greengrass コアソフトウェアのインストールにも対応しているようなので、また試して紹介したいと思います。

以上です。

IoT 導入支援 / 相談会の紹介

クラスメソッドでは、AWS を中心とした IoT 導入においてエッジからクラウドまでトータルでお客様をサポートします。

次のようなお困りごとがあれば、お気軽にお問い合わせください。

  • ローカルでデータ収集と可視化はできたが、クラウドで可視化する適切な構成が分からない
  • 集めたデータを使って故障予知などに使いたい
  • 工場設備からデータ収集してクラウドに送る方法が分からない
  • スマートファクトリー化を検討しているが何から着手していいか分からない
  • IoT や スマートファクトリーのユースケースで AI を活用したい
  • デバイスで動くアプリケーションの開発を AWS で効率化したい
  • エッジデバイスのセキュリティが心配だ
  • カメラ映像をクラウドにストリーミングして活用したい
  • 組み込み開発は得意だが Web アプリケーションやクラウド利用の経験が少なく不安だ
  • その他、お困り事があれば何でもご相談ください

https://classmethod.jp/aws/services/consulting/

https://classmethod.jp/seminar/aws-consultation/

https://classmethod.jp/aws/services/modern-application-development/

この記事をシェアする

FacebookHatena blogX

関連記事