AWS Greengrass~DynamoDBやってみる その2 Greengrass

次はLinuxへのGreengrassのインストールです。 私の場合、PetalinuxなのでRedHat系のdnfを使用しています。(debianだとapt、Mac OSだとyum) またデバイスにSSHサーバーが必要です。 IoT Core関連は言葉がややこしいので最初に用語関連をまとめていますが不要の場合はスキップして、aws cliインストールから進めたらいいと思います。

AWS IoT Coreとは

IoT Coreは以下の機能を持つAWSクラウド上のサービスの総称(私の理解です)

  • IoTデバイスとAWSクラウド送受信の接続ポイント(認証含む)
  • IoTデバイスの作成・管理(グループ化、状態監視)
  • IoTデバイスで動作するコンポーネントの管理・監視
  • IoT Coreで使用するプロトコルはMQTT over TSLかHTTPSsudo /greengrass/v2/bin/greengrass-cli component listIoTデバイスとAWSクラウド送受信の接続ポイント(認証含む)
  • IoTデバイスの作成・管理(グループ化、状態監視)
  • IoTデバイスで動作するコンポーネントの管理・監視
  • IoT Coreで使用するプロトコルはMQTT over TSLかHTTPS

上記のIoT Coreサービスの一つにGreengrassというサービスがあります。 GreengrassはAWSクラウドに接続するエッジ機器にインストールして動作するサービスです。

AWS Greengrassとは

Greengrassとはサービス名で、Greengrassサービス=Nucleus + Greengrass Core+Device Client+…などのソフト(ライブラリ)を含みます。 Greengrassサービスを使うためには、Greengrass Coreが必須でGreengrass Coreを使うにはNucleusが必要です。

Greengrassの構成

  1. Nucleus:
    • Greengrass Coreを実行する最小限の必須コンポーネント。
    • NucleusはGreengrass Core等をインストールしたりカスタマイズして更新(OTA)できます。
  2. Device Client:
    • Greengrass Coreとは別に、エッジデバイス上で動作し、デバイスとGreengrass Coreとの通信をハンドリングします。
  3. Greengrass Core:
    1. Greengrassの中心的な要素で、エッジデバイス上で実行されます。ローカルでのデバイス間通信やデバイスとクラウド間の通信の仲介役として機能します。
    2. Lambdaランタイム:
      • AWS LambdaのランタイムがGreengrass上で提供され、Lambda関数がエッジデバイス上で実行される際に利用されます。
    3. ローカルデバイスディスカバリ:
      • Greengrassがデバイスを検出し、デバイス間通信を可能にするための機能。
    4. シャドウサービス:
      • デバイスのシャドウ(デバイスの最後の既知の状態)を管理し、デバイスの状態同期を提供するサービス。
    5. セキュリティサービス:
      • Greengrass Coreがエッジデバイス上で実行されるため、セキュリティが非常に重要です。セキュリティサービスは、認証、暗号化、署名付きのメッセージの交換などのセキュリティ機能を提供します。
    6. ローカルガレージ:
      • エッジデバイス上でデータを一時的に保存するためのローカルガレージが含まれます。
    7. デバイスシャドウシンク:
      • ローカルデバイスディスカバリ、ローカルガレージ、シャドウサービスなどのコンポーネントを組み合わせて、デバイスの状態やデータを管理します。

IoT Core/Greengrass関連用語

  • Thingとは
    • ThingとはIoTデバイスの事。
    • IoTデバイス1台に1つのThing Nameが付けられる
    • GreengrassはThingのIoTデバイスの種類の一つであるコアデバイスにインストールするサービス。
  • IoTデバイス(この後はデバイスと呼ぶ)の種類
    • コアデバイス:ローカルでデータを処理したり、子局からのデータを集計してIoT Coreにデータを転送するGreengrassがインストールされたエッジデバイスの事。 Greengrassを実行するにはLinux、Windows等のOSが必要です。 今回はGreengrassを使うのでコアデバイスです。
    • Device Client:Linux Windows OS搭載のデバイスに。Greengrassの機能を削った軽量の通信監理ソフト(Device Client)を搭載されたデバイス。
    • モバイルデバイス:スマホや等。 モバイルデバイスにもOSが搭載されているのでGreengrassやDevice Clientをインストールできる。(Greengrassを入れるとモバイルデバイスでありエッジデバイスでもある)
    • デバイス:LinuxやWindows等のOSがなく、軽量の組込みソフトで動作するセンサやアクチュエータにDevice SDKを使ってIoT Coreと通信するIoTデバイス。
  • Thing Group
    • 1000台 Thingがあっても、Thing Groupで分ける事が出来る。
    • 1台のThingは複数のThing Groupに所属出来る。
  • コンポーネント
    • コンポーネントはデバイスで実行するソフトの事
    • これらのソフトはAWSで用意されているものと、ユーザーが作成するものがある。
    • 作成できるプログラム言語はPython,NodeJS、C・C++、Java、Go等が使用できる。(通信以外なら、Rust、R、Kotlinも使用できる)
  • Deploy
    • コンポーネントを起動するにはいろいろな工程がありそれらの工程を全て行ってくれるのがDeploy。 工程は、工程表みたいな物があり、各工程の指示はrecipe.jsonに記述する。 工程は以下がある(もっとあるかもしれません)。
      • 実行するDeployのRevision管理をする。(後に戻って実行が出来る)
      • プログラムがs3にある場合は、s3からソースコードを取得して、デバイスに転送する。
      • プログラムを実行する為に足りないモジュールがあればインストールする。
      • プログラムを実行して、実行状況のログを取る
      • プログラムの状態を監視し続ける
      • Thing Group毎やThing毎にDeployもできる。 例えば各地に300台の同じThing Groupのデバイスがあっても、それらにs3のコンポーネントを一斉にDeploy出来る。
      • DeployはAWSのWeb画面(Consoleと呼ぶ)からでも可能。 或いはデバイスにSSH接続したコンソール画面からgreengrass-cliを使ってDeployも可能。
      • Deploy=『プログラムをデバイスに展開して実行』みたいな感じ
    • GreengrassのDeployは、
      • 1つのコンポーネントだけを既に起動中のDeployに対して追加や変更が出来る。
      • また複数のコンポーネントを組み合わせて一斉に起動する事ができる。
      • Delopyは通常AWSコンソールからだが、コンソールでawsコマンドでもできる。
  • Nucleus
    • Greengrass Coreを実行する為の必須コンポーネント。
    • Nucleusのバージョンが変更されたり、設定パラメーターが変更されたらGreengrass Coreが自動的に更新されて再起動がかかってしまう。 予期せぬ再起動を防ぐにはデプロイする際優先するNecleusコンポーネントのバージョンを指定しておく事。

IAM権限関連用語

IAM(Identity and Access Management)はAWSのアクセス管理サービス。 それぞれのAWSへのアクセス権限を設定できます。

  1. Users
    • IAMユーザーを作成できます
    • 初期設定のrootユーザーは全ての権限を持っている為、誤操作で全てを消す危険性があるため、通常必要権限だけ持たせてユーザーを作成します。
    • Windowsの管理者とログインユーザーのようなもの。
  2. User groups
    • 研究所や営業所やテニスサークル等のように所属できるグループの事。
    • 各グループに幾つかの特定の権限を付与しておくと、そのグループに所属するユーザーはそのグループに付与された権限が与えられる。
  3. Roles
    • 弁護士や警察や会社員や会社でも役員、部長、課長のような役割の事。
    • Roleにも権限を付与できる。
  4. Entity
    • 上記の3つをIAMでのEntity(実体、実在物)と呼ぶ
  5. Resources
    • AWSで言うResource(資源)とは、以下のようなAWSが提供するサービス
      • IoT Core
      • EC2インスタンス
      • S3バケット
      • RDSデータベース
      • Lambda関数
      • IAMユーザー
      • SQSキュー
      • DynamoDBテーブル
      • VPC(Virtual Private Cloud)
      • CloudWatch、Billing、Cost
    • IAMではResourceに対するアクセス権限を設定します。
    • 例えば、IoT Coreへのiot:Connectの権限を付与しなければIoT Coreに接続できません。 またs3:PutObjectの権限を付与しなければs3にファイルを保存できません。
  6. Policies
    • アクセス権限を記載するところ
    • Policyに複数の権限を記載できる
    • PolicyはEntity(Users, User groups, Role)にAttach出来る。
    • Policyに異なるPolicyをAttachする事も出来る。
  7. Certificate
    • CertificateはIAMでなく、IoT CoreのThingに付属している。
    • Thingのアクセス権限はCertificateにAttachする事によってThingがIoT Coreやs3等にアクセスできる。

aws cli インストール

Greengrassをインストールする前にaws v1を削除してからv2をインストールしておきます。 これをどの段階でするのがいいのか分かっていません。  awscli v2でなかったら必要なawsのcliコマンドを使用できなかったので、いつかはv2に変更しておいた方がいいと思います。

$ sudo dnf remove awscli

$cd ~
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install

$ export PATH=~/.local/lib/aws/bin:\$PATH"
// インストールされているか確認
$ aws --version

Greengrassをインストール

  • デバイスにはPython3がインストールされていないといけません。 デバイスのコンソールで『$ python3 –version』を実行してバージョン番号が表示されたらOK。 なければPython3をインストールします。
  • 簡単にデバイスをIoT Coreに接続するための手順を示します。 このステップではIoT Coreに接続のPythonのモジュールがインストールされます。『aws-iot-device-sdk-python-v2』

IAM credential作成 (Access Key)

IAM』画面に移動=>『 Users』=>『 ichiri』(私のユーザー名なので、あなたのユーザー名に書き換えてください)=>『Security credentials』=>『Access keys』の項目の 『Create access key』をクリック

  • Use caseで『Other』を選択して『Next』
  • Description tag valueには『GG_credentials』(何でもよい)と入れて『Create access key』とすると
  • Access keyとSecrete access keyが生成されるが、ここが重要! 『Done』を押してはいけない。
  • このページを離れるとSecrete access keyは2度と見れないので、csvファイルをダウンロードしておく。
  • 【重要】csvファイルをダウンロードした後に『Done』とする。
  • 【参考】Access keyは複数作れて、使わない時はDeactivateできる。 削除する時はまずDeactivateしてから削除する。
  • そしてGreengrassをインストールするLinuxデバイスで以下の実行する。
  • 以下を実行します。 (AWS_SESSION_TOKENは使いません。これはAccess key作成時にExpirationを設定した時に生成されるTokenを入れます。 今回Access key作成時にOtherを選択したので、時間で切れる事はなく、Tokenも作成されていないので設定しません。)
  • しかしRebootすると消えてしまうので、これらのキーは毎回登録しないといけないので、/etc/environmentに追記しておきます。

Access keyの登録

LinuxシェルプロンプトでReboot時までの仮登録します。

Defaults secure_path=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/greengrass/v2/bin”

ユーザー、グループ作成

GreengrassをインストールするデバイスにGreengrassが使用するSystemユーザーとSystemグループを作成しておきます。

$ sudo useradd --system --create-home ggc_user
$ sudo groupadd --system ggc_group

Java Runtimgのインストール

GreengrassはAmazon correttoのJava Runtimeを使うのでインストールする。 debian系はapt、Mac系はyum、私はPetalinuxなのでdnfを使いました。(/usr/lib/jvm/java-11-amazon-corretto/bin/にjavaがありませう)

バージョンがCorretto-11.で表示されたらOKです。

$ cd ~
$ sudo rpm --import https://yum.corretto.aws/corretto.key
$ sudo curl -L -o /etc/yum.repos.d/corretto.repo https://yum.corretto.aws/corretto.repo
$ sudo dnf install -y java-11-amazon-corretto-devel

$ java --version
openjdk 11.0.22 2024-01-16 LTS
OpenJDK Runtime Environment Corretto-11.0.22.7.1 (build 11.0.22+7-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.22.7.1 (build 11.0.22+7-LTS, mixed mode)

バージョンが表示されなければPATHに/usr/lib/jvm/java-11-amazon-corretto/bin/を追加しましょう。

debian系の場合

以下を実行したら自動的にPATHも設定してくれました。

$ cd ~
$ wget -O - https://apt.corretto.aws/corretto.key | sudo gpg --dearmor -o /usr/share/keyrings/corretto-keyring.gpg && \
echo "deb [signed-by=/usr/share/keyrings/corretto-keyring.gpg] https://apt.corretto.aws stable main" | sudo tee /etc/apt/sources.list.d/corretto.list
$ sudo apt update; sudo apt install -y java-11-amazon-corretto-jdk

$ java --version
openjdk 11.0.22 2024-01-16 LTS
OpenJDK Runtime Environment Corretto-11.0.22.7.1 (build 11.0.22+7-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.22.7.1 (build 11.0.22+7-LTS, mixed mode)

余談(Petalinx SD起動の場合)—容量が足りずエラーになった時の対処

Java Runtimeのインストラーは実行出来ましたが128MBの空きが必要とエラーが出てインストールできなかったので、wksでルートFSを1GBでなく4GBにしてwicを作り直すとインストールできました。(但し、リモートホストからの転送時間が1GBの時は3分だったのが、4GBになったので12分になりました。)

Dependencies resolved.
===================================================================================================================
 Package                                 Architecture      Version                  Repository                Size
===================================================================================================================
Installing:
 java-11-amazon-corretto-devel           aarch64           1:11.0.21.9-1            AmazonCorretto           183 M

Transaction Summary
===================================================================================================================
Install  1 Package

Total size: 183 M
Installed size: 309 M
Downloading Packages:
[SKIPPED] java-11-amazon-corretto-devel-11.0.21.9-1.aarch64.rpm: Already downloaded
Running transaction check
Transaction check succeeded.
Running transaction test
The downloaded packages were saved in cache until the next successful transaction.
You can remove cached packages by executing 'dnf clean packages'.
Error: Transaction test error:
  installing package java-11-amazon-corretto-devel-1:11.0.21.9-1.aarch64 needs 128MB more space on the / filesystem

Error Summary
-------------
Disk Requirements:
   At least 128MB more space needed on the / filesystem.

peta:~$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root               980396    708104    203480  78% /
devtmpfs                503228         4    503224   0% /dev
tmpfs                   504316         0    504316   0% /dev/shm
tmpfs                   201728     10572    191156   5% /run
tmpfs                     4096         0      4096   0% /sys/fs/cgroup
tmpfs                   504320         0    504320   0% /tmp
tmpfs                   504316       112    504204   0% /var/volatile
/dev/mmcblk1p1          523244     28520    494724   5% /boot
/dev/mmcblk0p1          389880     33204    356676   9% /run/media/mmcblk0p1
/dev/mmcblk0p2          722320    131472    538208  20% /run/media/mmcblk0p2
/dev/mmcblk0p3          722320    126848    542832  19% /run/media/mmcblk0p3
tmpfs                   100860         0    100860   0% /run/user/1000

/etc/environment, /etc/profile, ~/.bashrc にPATH等を追記

JavaへのPATHやその他のPATH等を3つのファイルに書き足しておきます。

  • JavaへのGreengrassが使用するPATH
  • Greengrassが使用するJAVA_HOME環境変数設定
  • Greengrassが使用するAccess keyの登録
  • ルートユーザー時のPATH
  • 一般ユーザーでawsやgreengrass-cli使用時のjavaへのPATH

/etc/environmentには以下を書き足しておく。 JAVA_HOMEは別のファイルで使用されています。(何故か、export PATH=JAVA_HOME/binとしても登録されませんでした。

/etc/environment
export JAVA_HOME=/usr/lib/jvm/java-11-amazon-corretto
export PATH=/usr/lib/jvm/java-11-amazon-corretto/bin

export AWS_SECRET_ACCESS_KEY=iQ12344fN4YKmsDwVSlwSTkUbOz6j1LB/
export AWS_ACCESS_KEY_ID=AKIAZ4JNOENGS48MVM54DX

更に/etc/profileのPATHの部分を以下の様に変更します。 元のコードが[ “$HOME” != “/home/root” ] || PATH=$PATH:…となっていたので、PATHが設定されませんでした。 更に『$PATH:』を付け足す。 これが無いと、/etc/environmentで設定したJavaのPATHが上書きされます。 実行される順番は、ログイン前に/etc/environmentが実行され、シェルにログインする時、全てのユーザーで/etc/profileが読み込まれて、ログイン後~/.bashrcが読み込まれます。 rootユーザーに切り替えたとき、petalinuxではlsやviやcatなどのコマンドが使えなくなったので追記しておきます。 ついでに、プロンプトの色も出力するようにしておきます。

/etc/profile
if [ "$HOME" != "/home/root" ]; then
        PATH=$PATH:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
fi
PS1='\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
export PATH PS1

一般ユーザーでシェルを開いて、awsコマンドやgreengrass-cliコマンドを実行する時用にPATHを設定しておきます。 /etc/environmentでは、greengrassサービスが使う時はjavaを認識しますが、一般ユーザーでシェルを開くと/etc/environmentは反映されないのでjava(corretto)にPATHが通らずエラーとなったのでPATHを追加しておきます。(echoは確認用)

~/.bashrc
PATH=$PATH:~/.local/bin:/greengrass/v2/bin:~/.local/lib/aws/bin:/bin:/sbin:/usr/bin
if [[ $PATH == *"java-11-amazon-corretto"* ]];  then
        PATH=$PATH
        echo ****same PATH from ~/.bashrc*********
else
        PATH=$PATH:/usr/lib/jvm/java-11-amazon-corretto/bin
        echo *****corretto added, ichiri from ~/.bashrc*****
fi

PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
export PATH PS1
alias ll='ls -la --color=auto'

greengrass を起動したら自動的にgreengrass-cliコンポーネントが起動します。 しかしgreengrass-cliはggc_userようなのでsudoで起動します。 そのsudoのPATHにgreengrass-cliのPATHを記述しておきます。 これは/etc/sudoersファイルのsecure_pathの文字列の最後に:/greengrass/v2/binを追加します。 

/etc/sudoers
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/greengrass/v2/bin"

Greengrassのインストーラーのダウンロード・格納

NucleusはGreengrassのコア部分でGreengrassをUpdateしたりする場合にNucleusを使います。 このGreengrassのUpdate用のNecleusをダウンロードして格納しておきます。 

  • curlでダウンロード
  • jarsingerで署名(これをしないとインストールできない)
  • unzipしてGreengrassInstallerディレクトリに解凍
  • Greengrass.jarのjavaファイルが実行できるか確認(これが出来ない時は、java-11へのPATHが通っているか確認)
$ cd ~
$ curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip > greengrass-nucleus-latest.zip
$ jarsigner -verify -certs -verbose greengrass-nucleus-latest.zip
jar verified.   //<--これで成功
//Greengrass nucleus の zip ファイルに署名されず失敗した時はjar is unsigned.と表示される

$ unzip greengrass-nucleus-latest.zip -d GreengrassInstaller

$ java -jar ./GreengrassInstaller/lib/Greengrass.jar --version
AWS Greengrass v2.12.1  //<---表示されたので

Greengrassのインストール

$ sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE \
  -jar ./GreengrassInstaller/lib/Greengrass.jar \
  --aws-region ap-northeast-1\
  --thing-name GG-gm1-00\
  --thing-policy-name 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

これで接続できたはずです。 

  • IoT CoreのConsoleに移動して
  • 『Manage』~『Greengrass devices』~『Core devices』を選択してHealthyと表示されていたら成功です。

aws cli v1->v2

  • aws cliはデバイスのコンソールからAWSのサービスを操作するコマンドです。 AWSのコンソールでも同じ事が出来ます。
  • 基本的な使い方はaws <resource_name> リソース毎の文法。
  • aws cliはデバイスのコンソールからAWSのサービスを操作するコマンドです。 AWSのコンソールでも同じ事が出来ます。
  • ここのページで使用するのはIoT向けのaws iot。デバイスのコンソールからaws iot … とする事でデバイスからAWS IoTへの操作が出来ます。
  • また、aws cliではなく、greengrass-cliコマンドもありますが、これはデバイス内のgreengrassの操作をするために使います。 例えば、デバイス内で動作中のコンポーネントの停止や再起動など。
  • sudo apt install awscliでインストールするとv1がインストールされてしまうので、その場合はv1を削除してからv2を再度インストールします。  v2のインストールはzipファイルをcurlでダウンロードしてインストーラーを起動します。
  • aws v2にすると必要なawsのcliコマンドを使用できるようになります。
$ sudo dnf remove awscli  //Petalinux時のv1削除方法。 debian系ではapt。

$cd ~
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip" //Petalinuxの場合
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"   //uBuntuの場合
$ unzip awscliv2.zip
$ sudo ./aws/install

$ export PATH=~/.local/lib/aws/bin:$PATH
// ちゃんとインストールされているか確認
$ aws --version

aws configure

  • v2インストール後、aws configureをしてaws cliコマンドで遠隔のAWSの操作を実行できます。
$ aws configure
AWS Access Key ID [None]: ここに作成したアクセスキーを入力
AWS Secret Access Key [None]: ここに作成したシークレットアクセスキーを入力
Default region name [None]: ap-northeast-1    //<---東京の場合(IoT CoreはOsakaには無い)
Default output format [None]:    //<----分からないので何も入力せずEnter

Greengrassにアクセス権限設定

GreengrassにAWSとの通信でトークンを交換して通信するのですが、その権限を付け足さないといけません。 その方法がややこしいのですが、以下の手順で行います。

  1. GreengrassV2IoTThingPolicyはThing作成時にCertificateに追加されています。(AWS IoT Greengrassと通信するためのPolicy(権限))
  2. Greengrassのインストーラー(Greengrass.jar)がGreengrassV2TokenExchangeRole(役割)を作成するので
  3. そのRoleに別名を付ける。(RoleAliasという。ポインタのようなもの。)
  4. RoleAliasを使いPolicy(権限)を作成。
  5. 作成したPolicyをGreengrassのThingのCertificateにAttachする。
    • メリットは、Greengrass Core deviceが1000台など複数になった場合、Roleに今後いろいろな権限を追加、削除しても、一つのRoleを変更するだけで1000台のPolicyが自動的に変更となります。
    • どうしてRoleをAliasに変更しないといけないのかはわかりません。 しかしAliasは単なりLinkと思います。

PolicyをRoleに追加

  • AWS(Web)のIAM画面に行き左メニューのRolesをクリックしてGreengrassV2TokenExchangeRoleが作成されているのでクリックします。
    • なかった場合は、GreengrassV2TokenExchangeRoleを作成します。
  • Permissionsの『Add permissions』~『Attach policies』GreengrassV2TokenExchangeRoleAccessポリシーをGreengrassV2TokenExchangeRoleにAddしました。
  • Addする前は以下の警告がでました。
No managed IAM policy found, looking for user defined policy...
IAM policy named "GreengrassV2TokenExchangeRoleAccess" already exists. Please attach it to the IAM role if not already

Role Alias作成

  • IoT Coreで使用できるようにRole Aliasを作ります
  • awsコマンドを使ってAliasを作ります。
$ aws iot create-role-alias --role-alias GGCTokenExchangeRoleAlias --role-arn arn:aws:iam::<account_id>:role/GreengrassV2TokenExchangeRole

{
    "roleAlias": "GGCTokenExchangeRoleAlias",
    "roleAliasArn": "arn:aws:iot:ap-northeast-1:<account_id>:rolealias/GGCTokenExchangeRoleAlias"
}

Role Aliasを使いPolicyを作成

  • Policyに変換する為の準備のjsonファイルを作ります。
  • 証明書を使用してRoleを受け入れる権限を指定しています。 これでRoleに別名をRole Aliasを受付けます。
greengrass-v2-iot-role-alias-policy.json
{
  "Version":"2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:AssumeRoleWithCertificate",
      "Resource": "arn:aws:iot:ap-northeast-1:<account_id>:rolealias/GGCTokenExchangeRoleAlias"
    }
  ]
}
  • 作成するPolicy名と上記で作ったjsonファイルを指定して、awsコマンドでPolicyを作成します。
  • このPolicyはIAMでなくIoTに作成されます。

$ aws iot create-policy --policy-name GreengrassCoreTokenExchangeRoleAliasPolicy --policy-document file://greengrass-v2-iot-role-alias-policy.json

{
    "policyName": "GreengrassCoreTokenExchangeRoleAliasPolicy",
    "policyArn": "arn:aws:iot:ap-northeast-1:<account_id>:policy/GreengrassCoreTokenExchangeRoleAliasPolicy",
    "policyDocument": "{\n    \"Version\":\"2012-10-17\",\n    \"Statement\": [\n      {\n        \"Effect\": \"Allow\",\n        \"Action\": \"i
ot:AssumeRoleWithCertificate\",\n        \"Resource\": \"arn:aws:iot:ap-northeast-1:<account_id>:rolealias/GGCTokenExchangeRoleAlias\"\n      }\n
    ]\n  }",
    "policyVersionId": "1"
}
  • 作成したPolicyをIoTのThingのCertificateにattachします。
  • Certificateは『IoT』に移動して~『Manage』~『All devices』~『Things』~対象のThingをクリック~『Certificates』をクリック~最新のCertificateをクリック~『Attach policy』で作成したPolicyをCertificateに追加します。
  • awsコマンド使用する場合は、Certificateをクリックしてarnをコピーして下の様に実行します。
$ aws iot attach-policy --policy-name GreengrassCoreTokenExchangeRoleAliasPolicy --target arn:aws:iot:ap-northeast-1:<account_id>:cert/f9d64d0c480a940ce1ab8bbc8eefff2df6c60e9512fc19102c6aa10e48a086a9

確認

デバイスを再起動してデバイスのコンソールから

$ systemctl status greengrass

以下の様activeになっていればOKです。

以下も試してみて、greengrass-cliのPATHが通っている事と、Component Name: aws.greengrass.Cli等がstate:RUNNINGとなっていて、state:の部分がIN-PROGRESSやBROKENになっていなければOKです。

$ sudo greengrass-cli component list

ログの確認

//(1) Nucleus立上、Greengrass立上のログを確認できます。 Greengrassが立ち上がらない時のデバッグ用。 
// このログは電源を切ると消えて最初からログが始まるみたい。 
// スペースかPageDnを押すと改ページ出来る。 PageUPで戻れる。 『q』でコンソールに抜ける(exit)。
$ sudo journalctl -u greengrass

//(2) Greengrassが立ち上がってDeploymentやDeployment内のコンポーネント毎のエラー等確認できる。
//各コンポーネント内のエラー(Trace)内容は、各コンポーネントのlogを確認するようになっています。
$ sudo tail -n 20 /greengrass/v2/logs/greengrass.log

//(3) 各コンポーネント用のログ確認方法
//com.example.PublishClassMethodがコンポーネント名
sudo tail -f /greengrass/v2/logs/com.example.PublishClassMethod.log

次(その3)はGreengrassのコンポーネントです。

参考 systemd

uBuntuでは自動的にsystemdで起動できました。 しかしPetalinuxではbusyboxを使っているせいか、自動的N

systemd警告解消方法

Petalinuxの時は自動的にNucleusが起動せず手動で起動していました。 その起動時のメッセージ表示です。 これはsshd、ppp、init.dなどがsystemdで起動されていないという警告です。 なのでこれらをsystemdとして起動するように作成します。

Provisioning AWS IoT resources for the device with IoT Thing Name: [GG-gm1-00]...
Found IoT policy "GreengrassV2IoTThingPolicy", reusing it
Creating keys and certificate...
Attaching policy to certificate...
Creating IoT Thing "GG-gm1-00"...
Attaching certificate to IoT thing...
Successfully provisioned AWS IoT resources for the device with IoT Thing Name: [GG-gm1-00]!
Adding IoT Thing [GG-gm1-00] into Thing Group: [GGgroup-GM1]...
IoT Thing Group "GGgroup-GM1" already existed, reusing it
Successfully added Thing into Thing Group: [GGgroup-GM1]
Setting up resources for aws.greengrass.TokenExchangeService ...
Attaching TES role policy to IoT thing...
No managed IAM policy found, looking for user defined policy...
IAM policy named "GreengrassV2TokenExchangeRoleAccess" already exists. Please attach it to the IAM role if not already
Configuring Nucleus with provisioned resource details...
Downloading Root CA from "https://www.amazontrust.com/repository/AmazonRootCA1.pem"
Created device configuration
Successfully configured Nucleus with provisioned resource details!
[ 5455.612192] systemd-sysv-generator[993]: SysV service '/etc/init.d/sshd' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[ 5455.639846] systemd-sysv-generator[993]: SysV service '/etc/init.d/ppp' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[ 5455.665777] systemd-sysv-generator[993]: SysV service '/etc/init.d/inetd.busybox' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[ 5455.692809] systemd-sysv-generator[993]: SysV service '/etc/init.d/watchdog-init' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[ 5457.537617] systemd-sysv-generator[1006]: SysV service '/etc/init.d/sshd' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[ 5457.564023] systemd-sysv-generator[1006]: SysV service '/etc/init.d/ppp' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[ 5457.591162] systemd-sysv-generator[1006]: SysV service '/etc/init.d/inetd.busybox' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[ 5457.618202] systemd-sysv-generator[1006]: SysV service '/etc/init.d/watchdog-init' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.

[ 5459.580573] systemd-sysv-generator[1034]: SysV service '/etc/init.d/sshd' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[ 5459.607507] systemd-sysv-generator[1034]: SysV service '/etc/init.d/ppp' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[ 5459.634369] systemd-sysv-generator[1034]: SysV service '/etc/init.d/inetd.busybox' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[ 5459.661452] systemd-sysv-generator[1034]: SysV service '/etc/init.d/watchdog-init' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
Successfully set up Nucleus as a system service

これを修正するため以下4つのファイルを/etc/systemd/system/に追加して、systemdとして起動するように修正しました。(sshd含む各プロセスがSysVinitでは駄目でsystemdでないといけない。 cat /proc/1/commで確認できる。)(uBuntuの場合は自動的にsystemdになったので以下は不要)

/etc/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon

[Service]
ExecStart=/usr/sbin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target
/etc/systemd/system/ppp.service
[Unit]
Description=PPP (Point-to-Point Protocol) Daemon

[Service]
ExecStart=/etc/init.d/ppp start
ExecStop=/etc/init.d/ppp stop
ExecReload=/etc/init.d/ppp reload
Type=forking

[Install]
WantedBy=multi-user.target
/etc/systemd/system/inetd.busybox.service
[Unit]
Description=inetd (busybox version) Daemon

[Service]
ExecStart=/etc/init.d/inetd.busybox start
ExecStop=/etc/init.d/inetd.busybox stop
ExecReload=/etc/init.d/inetd.busybox reload
Type=forking

[Install]
WantedBy=multi-user.target
/etc/systemd/system/watchdog-init.service
[Unit]
Description=Watchdog Init Daemon

[Service]
ExecStart=/etc/init.d/watchdog-init start
ExecStop=/etc/init.d/watchdog-init stop
ExecReload=/etc/init.d/watchdog-init reload
Type=forking

[Install]
WantedBy=multi-user.target

これでsystemdとしてgreengrass.serviceが起動しているか確認します。

// AWS IoT データエンドポイントのアドレスを取得する
$ aws iot describe-endpoint --endpoint-type iot:Data-ATS
{
    "endpointAddress": "a3uk6ib3g81akg-ats.iot.ap-northeast-1.amazonaws.com"
}

// AWS IoT 認証情報エンドポイントのアドレスを取得する
$ aws iot describe-endpoint --endpoint-type iot:CredentialProvider
{
    "endpointAddress": "c2ym3xergxm1rx.credentials.iot.ap-northeast-1.amazonaws.com"
}

Nucleus起動方法

PetalinuxではGreengrassが立ち上がらなかったので、まずNucleusの起動を手動でしていました。(uBuntuでは自動で立ち上がりました。)

Necleusを起動するとコンソールはsuccessfully. で止まって操作できなくなるので、別のターミナルでsshを使い接続して操作します。  このloaderはgreengrass.serviceのExecStartで起動されています。 

$ sudo /greengrass/v2/alts/current/distro/bin/loader
Launching Nucleus...
Launched Nucleus successfully.

参考 Petalinuxのビルド前の設定

Cgroup確認

petalinux-config =>DTG =>Kernel Bootargs =>Add extra boot argsに以下を入れる。(Greengrass V2ではCgroup v2をサポートしていない為、CGroupを使うようにする。)

cgroup_enable=memory cgroup_memory=1 systemd.unified_cgroup_hierarchy=0

そして全てをビルド($ petalinux-build)し直すと時間がかかるので、デバイスツリーだけsystem.dtbにビルドして、BOOT.binにpackage化して、SDに入れる。

$ petalinux-build -c device-tree

現在のcgroupバージョンの確認

$ stat -fc %T /sys/fs/cgroup/
tmpfs  // <---cgroup v1が現在のバージョンという確認
$  grep cgroup /proc/filesystems cgroup
/proc/filesystems:nodev cgroup
/proc/filesystems:nodev cgroup2  //<----これも表示されるのでv2もサポートしている。

petalinux-config -c kernel設定

PetalinuxでGreengrassを動作させる為には以下を設定しておく必要がありますが、私の場合既にこの設定になっていたので何も変更せずに済みました。

// デバイスで次の Linux カーネル設定を有効にする必要がありますが、全て=yでした。
$ petalinux-config -c kernel
***Name Space***
CONFIG_IPC_NS=y
CONFIG_UTS_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y

***Cgroups***file:///usr/local/bin/aws
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUPS=y
CONFIG_MEMCG=y

***Others***
CONFIG_POSIX_MQUEUE=y
CONFIG_OVERLAY_FS=y
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
CONFIG_SECCOMP_FILTER=y
CONFIG_KEYS=y
CONFIG_SECCOMP=y
CONFIG_SHMEM=y

コメント