[AWS IoT Greengrass V2] クラウド側から複数のコアデバイスにコンポーネントをデプロイしてみました

2021.08.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

IoT事業部の平内(SIN)です。

前回、AWS IoT Greengrass V2(以下、Greengrass V2)のコンポーネントをローカルでデプロイしてみました。

今回は、上記でローカルにデプロイしたものを一旦削除し、同じコンポーネントをクラウド側からデプロイしてみました。

なお、複数のデバイスにデプロイできる事を確認するために、同じグループでもう一台、コアデバイス(gg-device-002)を追加して作業を進めました。

2 アーティファクト

ローカルでのデプロイと違って、アーティファクト(複数のスクリプト、バイナリ、静的リソースなど)は、S3バケットに配置します。

(1) S3バケットへの配置

フォルダ構成は、ローカルの時と同じですが、この形式でS3バケットにアップロードします。

バケット(名前をgg_artifacts-2021-08-11としました)を作成し、アーティファクトを配置した様子です。

(2) S3バケットへのアクセス権

Greengrass V2では、ロールエリアス経由で、IAMポリシーとしてGreengrassV2TokenExchangeRoleAccessが設定されていますが、デフォルトでは、作成したバケットへのパーミッションがありません。

そこで、新たに、作成したバケットへのアクセス権を付与するため、下記のようなポリシーを作成し、上記のロールに追加しています。

gg-policy-2021-08-11

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::gg-artifacts-2021-08-11/*"
        }
    ]
}

追記
2023/01/05現在、 s3:GetObject の他に、 s3:GetBucketLocation が必要です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::gg-artifacts-2021-08-11/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::gg-artifacts-2021-08-11"
        }
    ]
}

3 レシピ

AWS IoTのコンソールから、Greengrass - コンポーネント - コンポーネントを作成 - レシピをYAMLとして入力すると辿ります。

設定したYAMLは、以下の通りですが、ローカルで使用したものの Artifacts: - Uri: をS3のパスに変更しただけのものです。

---
RecipeFormatVersion: '2020-01-25'
ComponentName: com.example.HelloWorld
ComponentVersion: 1.0.0
ComponentDescription: My first Greengrass component.
ComponentPublisher: Me
ComponentConfiguration:
  DefaultConfiguration:
    Message: world
Manifests:
- Name: Linux
  Platform:
    os: linux
  Lifecycle:
    Run: |
      python3 {artifacts:path}/hello_world.py '{configuration:/Message}'
  Artifacts:
  - Uri: s3://gg-artifacts-2021-08-11/artifacts/com.example.HelloWorld/1.0.0/hello_world.py

画面一番下の「コンポーネントを作成」をクリックするとコンポーネントの作成は完了です。

4 デプロイ

作成したコンポーネントを開くと、右上の「デプロイ」が利用可能になっています。

デプロイは、「既存のデプロイに追加」と「新しいデプロイを作成」の2種類から選択可能です。(「新しいデプロイを作成」を選択した場合、既存のコンポーネントは、いったんクリアされますので、注意が必要です)

今回は、インストール時に使用されたデプロイを選択したので、当該グループに所属する全てのコアデバイスがデプロイ対象となります。

デプロイ設定のステップ1〜5は、特に変更が必要なければ「次へ」だけで進めても問題ありません。

デプロイが完了したかどうかは、それぞれのコアデバイスでコンポーネントのタブから確認できます。

5 確認

下記は、コアデバイスで、Greengrass CLIを使用して、コンポーネントの一覧を確認している様子です。

pi@device-001:~ $ sudo /greengrass/v2/bin/greengrass-cli component list

・・・略・・・

Component Name: com.example.HelloWorld
    Version: 1.0.0
    State: FINISHED
    Configuration: {"Message":"world"}

・・・略・・・

hello_world.pyが出力するログも確認できています。

pi@device-001:~ $ tail -f /tmp/Greengrass_HelloWorld.log
Hello, world! Current time: 2021-08-11 12:56:26.796150.

6 複数デバイス

最初に書いた通り、所属するグループには、もう一台のコアデバイス(gg-device-002)が追加されています。

先のデプロイで、もう一台にも同じコンポーネントが動作していることを確認できました。

pi@device-002:~ $ sudo /greengrass/v2/bin/greengrass-cli component list

・・・略・・・

Component Name: com.example.HelloWorld
    Version: 1.0.0
    State: FINISHED
    Configuration: {"Message":"world"}

・・・略・・・
pi@device-002:~ $ tail -f /tmp/Greengrass_HelloWorld.log
Hello, world! Current time: 2021-08-11 12:56:28.183961.

7 最後に

今回は、クラウド側から複数のデバイスに対してコンポーネントをデプロイしてみました。 単なるスクリプトを配布できると意味では、エッジデバイスへのデプロイ環境としても有効だと感じました。

8 参考リンク


[AWS IoT Greengrass V2] RaspberryPIにインストールしてみました
[AWS IoT Greengrass V2] RaspberryPIでコンポーネントを作成してみました
[AWS IoT Greengrass V2] クラウド側から複数のコアデバイスにコンポーネントをデプロイしてみました
[AWS IoT Greengrass V2] クラウド側からコンポーネントを削除してみました
[AWS IoT Greengrass V2] ローカルデバッグコンソール(aws.greengrass.LocalDebugConsole)を使用してみました
[AWS IoT Greengrass V2] Lambda関数(コンポーネント)をデプロイしてみました
[AWS IoT Greengrass V2] コンポーネントからIoT CoreのメッセージブローカーにPublish/Subscribeしてみました
[AWS IoT Greengrass V2] コンポーネントからシークレットマネージャにアクセスしてみました