🦁

AWS IoT Greengrass V2の初期セットアップまとめ

に公開

はじめに

AWS IoT Greengrassを触れる機会があり、初期セットアップがめちゃくちゃめんどくさかったため、セットアップ方法をまとめます。

対象読者

  • AWSに基礎的な知識がある方

手順

前提条件

下記のパッケージをインストールしていることを前提とします。

  • AWS CLI
  • AWS CLIを利用するためのIAMユーザーのクレデンシャル情報

1. インストールに利用するIAMロール・ポリシーの作成

Greengrassをインストールする際に利用するIAMロール・ポリシーを作成する。
まず、IAMポリシーを作成する。このポリシー名は適当でよい。
重要なのは下記の内容である。

  • GreengrassV2TokenExchangeRoleGreengrassV2TokenExchangeRoleAccessの箇所は、この後で実行するインストーラの引数で指定したものと同じ値をセットする必要がある。
  • ここで指定しているIAMロールとポリシーは、Greengrassコアデバイスのインストール後にデバイスが各種AWSサービスとやり取りするためのAWS認証情報を取得するために使用するものになる。
  • 特にGreengrassV2TokenExchangeRoleAccessの指定は、上記のIAMロール名+Accessという形にする必要がある。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "CreateTokenExchangeRole",
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:CreatePolicy",
                "iam:CreateRole",
                "iam:GetPolicy",
                "iam:GetRole",
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:iam::account-id:role/GreengrassV2TokenExchangeRole",
                "arn:aws:iam::account-id:policy/GreengrassV2TokenExchangeRoleAccess"
            ]
        },
        {
            "Sid": "CreateIoTResources",
            "Effect": "Allow",
            "Action": [
                "iot:AddThingToThingGroup",
                "iot:AttachPolicy",
                "iot:AttachThingPrincipal",
                "iot:CreateKeysAndCertificate",
                "iot:CreatePolicy",
                "iot:CreateRoleAlias",
                "iot:CreateThing",
                "iot:CreateThingGroup",
                "iot:DescribeEndpoint",
                "iot:DescribeRoleAlias",
                "iot:DescribeThingGroup",
                "iot:GetPolicy"
            ],
            "Resource": "*"
        },
        {
            "Sid": "DeployDevTools",
            "Effect": "Allow",
            "Action": [
                "greengrass:CreateDeployment",
                "iot:CancelJob",
                "iot:CreateJob",
                "iot:DeleteThingShadow",
                "iot:DescribeJob",
                "iot:DescribeThing",
                "iot:DescribeThingGroup",
                "iot:GetThingShadow",
                "iot:UpdateJob",
                "iot:UpdateThingShadow"
            ],
            "Resource": "*"
        }
    ]
}

次にIAMロールを作成する。
ここでもIAMロールの名前は適当でよい。

まず、IAMロールに先ほど作成したIAMポリシーをアタッチする。
IAMロールの信頼関係は下記のように設定する。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::account-id:user/user-name"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

2. 一時クレデンシャルの取得

次にインストーラ実行時に必要な一時クレデンシャルを取得する。
この作業は先ほど作成したIAMロールの信頼関係で指定したPricipalの内容で作業する。
つまり、PrincipalにIAMユーザーを指定したIAMロールを作成した場合は、そのPrincipalで指定したIAMユーザーで作業する。

ここでの作業の流れは以下の通り。

  1. 作成したIAMロールの内容で一時クレデンシャルを取得する
  2. 取得したクレデンシャルをインストーラを実行するデバイスの環境変数にセットする

まず、作成したIAMロールの内容で一時クレデンシャルを下記のコマンドで取得する。

aws sts assume-role --role-arn arn:aws:iam::account_id:role/role_name --role-session-name "RoleSession01"

出力された値を環境変数にセットする。

export AWS_ACCESS_KEY_ID=<AWS_ACCESS_KEY_ID>
export AWS_SECRET_ACCESS_KEY=<AWS_SECRET_ACCESS_KEY>
export AWS_SESSION_TOKEN=<AWS_SESSION_TOKEN>

Javaのインストール

Greengrassを利用するにはJavaの実行権限が必要です、Java8以上が必要になるのでインストールする。

sudo apt-get update
sudo apt install default-jdk

以下のコマンドでバージョンを確認

java -version

AWS IoT GreengrassCoreソフトウェアのインストール

Greengrass Coreソフトウェアのインストール作業を行うために、インストーラをダウンロードする。

curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip > greengrass-nucleus-latest.zip

ダウンロードしたzipファイルをGreengrassInstallerディレクトリで解凍する。

unzip greengrass-nucleus-latest.zip -d GreengrassInstaller && rm greengrass-nucleus-latest.zip

次に、インストーラを実行して、Greengrass Coreソフトウェアをインストールする。各パラメータは以下のようになる。

sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE \
  -jar ./GreengrassInstaller/lib/Greengrass.jar \
  --aws-region ap-northeast-1 \
  --thing-name MyRpi3b-20231219-GreengrassV2Core \
  --thing-group-name MyRpi3b-20231219-GreengrassV2CoreGroup \
  --thing-policy-name MyRpi3b-20231219-GreengrassV2IoTThingPolicy \
  --tes-role-name GreengrassV2TokenExchangeRole \
  --tes-role-alias-name GreengrassCoreTokenExchangeRoleAlias \
  --component-default-user ggc_user:ggc_group \
  --provision true \
  --setup-system-service true \
  --deploy-dev-tools true

コンポーネント作成

AWS IoT Greengrassではコンポーネントという単位でCoreデバイスに機能をデプロイする。
コンポーネントにはアーティファクトとレシピが含まれる。

レシピ

  • メタデータの定義
  • ライフサイクル
  • 依存関係
  • プラットフォーム
  • インストールや実行

アーティファクト

  • スクリプト
  • コンパイルされたコード
  • 静的リソース

コンポーネントを作成するために下記のフォルダ構成を作成する。

/
└─ components
   ├─ artifacts
   │  └─ com.example.HelloWorld
   │     └─ 1.0.0
   │        └─ artifact.py
   └─ recipes
      └─ com.example.HelloWorld-1.0.0.yaml

アーティファクトにはPythonプログラムを記述すればよい。
レシピには下記のような内容を記述する必要がある。

RecipeFormatVersion: 2020-01-25
ComponentName: com.example.HelloWorld
ComponentVersion: '1.0.0'
ComponentDescription: My first AWS IoT Greengras component.
ComponentPublisher: Amazon
ComponentConfiguration:
  DefaultConfiguration:
    Message: world
Manifests:
  - Platform:
      os: linux
    Lifecycle:
      Run: |
        python3 -u {artifacts:path}/hello_world.py '{configuration:/Message}'
    Artifacts:
      - Uri: s3://<S3オブジェクトキー>
        Unarchive: NONE

ローカル環境でのコンポーネント開発

ローカルコンポーネントは下記のコマンドから作成する。

sudo /greengrass/v2/bin/greengrass-cli deployment create \
--recipeDir ./recipes \
--artifactDir ./artifacts \
--merge "<コンポーネント名>"

ローカルコンポーネントの稼働状況は下記のコマンドから確認できる。

sudo /greengrass/v2/bin/greengrass-cli component list

ローカルコンポーネントが正常に動作していることが確認できれば、ローカルコンポーネントを削除する。

sudo /greengrass/v2/bin/greengrass-cli deployment create --remove <component-name>

クラウド環境へコンポーネントをデプロイする

作成したアーティファクトをS3にアップロードする。

aws s3 cp <アーティファクトのファイルパス> s3://<S3オブジェクトキー>

クラウドにアップロードするレシピを作成する。

---
RecipeFormatVersion: "2020-01-25"
ComponentName: "com.example.HelloWorld"
ComponentVersion: "1.0.0"
ComponentType: "aws.greengrass.generic"
ComponentDescription: "My first Greengrass component."
ComponentPublisher: "Me"
ComponentConfiguration:
  DefaultConfiguration:
    Message: "world"
Manifests:
- Platform:
    os: "linux"
  Name: "Linux"
  Lifecycle:
    run: "python3 {artifacts:path}/hello_world.py '{configuration:/Message}'\n"
  Artifacts:
  - Uri: "s3://<BucketName>/artifacts/<component-name>/1.0.0/artifact.py"
    Digest: "cH/aAuosqcoyomCrcfBlJYiWoZUkDTSX8jE+UXO08CY="
    Algorithm: "SHA-256"
    Unarchive: "NONE"
    Permission:
      Read: "OWNER"
      Execute: "NONE"
Lifecycle: {}

クラウド側にコンポーネントを作成する場合は、下記のコマンドを実行する。

aws greengrassv2 create-component-version --inline-recipe fileb://<レシピのファイルパス>

クラウドにアップロードしたコンポーネントをコアデバイスにデプロイする。

上記までの操作でクラウドからコアデバイスにコンポーネントがデプロイされる。

Discussion