次は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の構成
- Nucleus:
- Greengrass Coreを実行する最小限の必須コンポーネント。
- NucleusはGreengrass Core等をインストールしたりカスタマイズして更新(OTA)できます。
- Device Client:
- Greengrass Coreとは別に、エッジデバイス上で動作し、デバイスとGreengrass Coreとの通信をハンドリングします。
- Greengrass Core:
- Greengrassの中心的な要素で、エッジデバイス上で実行されます。ローカルでのデバイス間通信やデバイスとクラウド間の通信の仲介役として機能します。
- Lambdaランタイム:
- AWS LambdaのランタイムがGreengrass上で提供され、Lambda関数がエッジデバイス上で実行される際に利用されます。
- ローカルデバイスディスカバリ:
- Greengrassがデバイスを検出し、デバイス間通信を可能にするための機能。
- シャドウサービス:
- デバイスのシャドウ(デバイスの最後の既知の状態)を管理し、デバイスの状態同期を提供するサービス。
- セキュリティサービス:
- Greengrass Coreがエッジデバイス上で実行されるため、セキュリティが非常に重要です。セキュリティサービスは、認証、暗号化、署名付きのメッセージの交換などのセキュリティ機能を提供します。
- ローカルガレージ:
- エッジデバイス上でデータを一時的に保存するためのローカルガレージが含まれます。
- デバイスシャドウシンク:
- ローカルデバイスディスカバリ、ローカルガレージ、シャドウサービスなどのコンポーネントを組み合わせて、デバイスの状態やデータを管理します。
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コマンドでもできる。
- コンポーネントを起動するにはいろいろな工程がありそれらの工程を全て行ってくれるのがDeploy。 工程は、工程表みたいな物があり、各工程の指示はrecipe.jsonに記述する。 工程は以下がある(もっとあるかもしれません)。
- Nucleus
- Greengrass Coreを実行する為の必須コンポーネント。
- Nucleusのバージョンが変更されたり、設定パラメーターが変更されたらGreengrass Coreが自動的に更新されて再起動がかかってしまう。 予期せぬ再起動を防ぐにはデプロイする際優先するNecleusコンポーネントのバージョンを指定しておく事。
IAM権限関連用語
IAM(Identity and Access Management)はAWSのアクセス管理サービス。 それぞれのAWSへのアクセス権限を設定できます。
- Users
- IAMユーザーを作成できます
- 初期設定のrootユーザーは全ての権限を持っている為、誤操作で全てを消す危険性があるため、通常必要権限だけ持たせてユーザーを作成します。
- Windowsの管理者とログインユーザーのようなもの。
- User groups
- 研究所や営業所やテニスサークル等のように所属できるグループの事。
- 各グループに幾つかの特定の権限を付与しておくと、そのグループに所属するユーザーはそのグループに付与された権限が与えられる。
- Roles
- 弁護士や警察や会社員や会社でも役員、部長、課長のような役割の事。
- Roleにも権限を付与できる。
- Entity
- 上記の3つをIAMでのEntity(実体、実在物)と呼ぶ
- 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にファイルを保存できません。
- AWSで言うResource(資源)とは、以下のようなAWSが提供するサービス
- Policies
- アクセス権限を記載するところ
- Policyに複数の権限を記載できる
- PolicyはEntity(Users, User groups, Role)にAttach出来る。
- Policyに異なるPolicyをAttachする事も出来る。
- 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としても登録されませんでした。
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などのコマンドが使えなくなったので追記しておきます。 ついでに、プロンプトの色も出力するようにしておきます。
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は確認用)
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を追加します。
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と表示されていたら成功です。
![](https://ichiri.biz/tech/wp-content/uploads/2024/05/image-1024x382.png)
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との通信でトークンを交換して通信するのですが、その権限を付け足さないといけません。 その方法がややこしいのですが、以下の手順で行います。
- GreengrassV2IoTThingPolicyはThing作成時にCertificateに追加されています。(AWS IoT Greengrassと通信するためのPolicy(権限))
- Greengrassのインストーラー(Greengrass.jar)がGreengrassV2TokenExchangeRole(役割)を作成するので
- そのRoleに別名を付ける。(RoleAliasという。ポインタのようなもの。)
- RoleAliasを使いPolicy(権限)を作成。
- 作成した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を受付けます。
{ "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です。
![](https://ichiri.biz/tech/wp-content/uploads/2024/05/image-1-1024x164.png)
以下も試してみて、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になったので以下は不要)
[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
[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
[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
[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
コメント