まずはセットアップするところまで。
せっかく書いたから投稿するけど、Greengrassタグが65個あったのでもっといい記事がありそう..
ラズパイの基本セットアップについて
詳細は下記参照。ラズパイのセットアップ、アップグレード、sshなどを設定。
環境のみ抜粋する。
使用モデル:Raspberry Pi 4 Model B (RAM 4GB)
$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 11 (bullseye)"
NAME="Raspbian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
前準備(AWS側)
IAMロールを作成
インストーラーがリソースをプロビジョニングするための最小限の IAM ポリシーを参考にして、下記ポリシーを持ったロールを作成する。
以下、GreenGrassRoleとする。
{
"Version": "2012-10-17",
"Statement": [
{
"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",
"iam:GetRole",
"iam:CreateRole",
"iam:PassRole",
"iam:CreatePolicy",
"iam:AttachRolePolicy",
"iam:GetPolicy",
"sts:GetCallerIdentity"
],
"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": "*"
}
]
}
ロール作成後、GreenGrassRoleのページの「認証関係」タブを選択し、「認証関係の編集」ボタンを押下。
jsonで下記を設定する。アカウントIDは12桁の数値、ユーザ名は次手順で作成するユーザ名(本資料ではGreengrassUser)に置き換えること。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<アカウントID>:user/<ユーザ名>"
},
"Action": "sts:AssumeRole"
}
]
}
IAMユーザを作成
IAM > ユーザー から「ユーザーを追加」ボタンを押下。
- ユーザー名:
適当な名称(以下、GreengrassUser とする)。 - AWS認証情報タイプを選択:
アクセスキーのみチェック。 - ユーザーにつけるポリシー:
アカウントID、ロール名(本資料ではGreenGrassRole)は置き換えること。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"sts:AssumeRole"
],
"Effect": "Allow",
"Resource": [
"arn:aws:iam::<アカウントID>:role/<ロール名>"
]
}
]
}
作成後、アクセスキー&シークレットアクセスキーを書き留めておく。
前準備(ラズパイ側)
AWS IoT greengrass(AWSマネジメントコンソール)にも手順が記載されているが、前準備も含めて具体的に記載する。
ラズパイにJDK(JAVA)をインストール
$ sudo apt install default-jdk
インストール後のバージョン
$ java --version
openjdk 11.0.13 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-post-Raspbian-1deb11u1)
OpenJDK Server VM (build 11.0.13+8-post-Raspbian-1deb11u1, mixed mode)
AWS CLIをインストール。ラズパイへのインストール方法が以下に詳しく記載されている。
JSON成型用にjqコマンドをインストール
$ sudo apt install jq
AWS CLIをセッティング。
$ aws configure
AWS Access Key ID [None]: ※前手順で書き留めたIAMユーザのアクセスキー
AWS Secret Access Key [None]: ※ 〃 シークレットアクセスキー
Default region name [None]: ※ap-northeast-1 を入力(東京リージョン以外は適宜変更)
Default output format [None]: ※そのままReturnキー押下(jsonとなる)
セッショントークンを取得&環境変数に設定。
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEYはconfigureの設定値を見て欲しいのに、環境変数に入れないとダメっぽい...
$ export STSRES=$(aws sts assume-role --role-arn arn:aws:iam::<アカウントID>:role/GreenGrassRole --role-session-name sts-session --duration-second 3600 --profile default)
#echo $STSRES | jq .
$ export AWS_ACCESS_KEY_ID=$(echo $STSRES | jq -r '.Credentials.AccessKeyId')
$ export AWS_SECRET_ACCESS_KEY=$(echo $STSRES | jq -r '.Credentials.SecretAccessKey')
$ export AWS_SESSION_TOKEN=$(echo $STSRES | jq -r '.Credentials.SessionToken')
$ unset STSRES
Greengrassをラズパイにインストール
マネジメントコンソールからGreengrassのセットアップページへ移動し、「1 つの Core デバイスをセットアップ」ボタンを押下。
以下、入力する。
- ステップ 1: Greengrass コアデバイスを登録する
- コアデバイス名:適当な名称を入力。(本資料ではGreengrass-rsp001とした)
- ステップ 2: モノのグループに追加して継続的なデプロイを適用する
- モノのグループ: 「新しいグループ名を入力」を選択し、適当な名称を入力。(本資料ではGreengrassQuickStartGroupとした)
- ステップ 3: Greengrass コアソフトウェアをインストール
- オペレーティングシステム: 「Linux」を選択
上記まで入力すると、ページの下半分に記載されているコマンド内容が動的に変わる。
以下はマネジメントコンソールにも記載されているが念のため記載しておく。
※設定値によってコマンド引数が変わるため、コピペした方がよい
Greengrassインストーラのダウンロード ※ラズパイで実行
$ cd /tmp
$ curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip > greengrass-nucleus-latest.zip && unzip greengrass-nucleus-latest.zip -d GreengrassCore
Greengrassインストーラの実行 ※ラズパイで実行
$ sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE -jar ./GreengrassCore/lib/Greengrass.jar --aws-region ap-northeast-1 --thing-name Greengrass-rsp001 --thing-group-name GreengrassQuickStartGroup --component-default-user ggc_user:ggc_group --provision true --setup-system-service true --deploy-dev-tools true
失敗する場合は、一時権限を1hで取得しているため、aws sts コマンドでセッショントークンを再取得&再設定するとよい。
コマンド実行後(コマンドはすぐ返ってくるが)AWS側で登録されるまで10~20分かかる。
インストール後の確認
-
AWS IoT > Greengrass > コアデバイスのページにコアデバイスが追加されていることを確認する。
-
AWS IoT > 管理 > モノのページにもデバイスが追加されていることを確認する。
-
AWS IoT > 証明書に証明書が追加されていることを確認する。
どうやら後は証明書による認証でAWSと通信するっぽい。 -
AWS IoT > ポリシーが2つ追加される
コアデバイスのポリシーは以下ポリシーの権限に加え、STSでロールエイリアス(GreengrassV2TokenExchangeRoleAlias)が追加されて使われる様子。- GreengrassV2IoTThingPolicy
- GreengrassTESCertificatePolicyGreengrassV2TokenExchangeRoleAlias
-
[AWS IoT > ロールエイリアス]が1つ追加される
- GreengrassV2TokenExchangeRoleAlias
使いたいサービスがあれば、このロールに追加すればよさそう。
ポリシー:GreengrassV2TokenExchangeRoleAccessが初期権限として付いている。
- GreengrassV2TokenExchangeRoleAlias
後片付け
不要なものを削除しておく。
$ rm -rf ~/.aws # AWS CLI
$ rm -f ~/.bash_history # コマンド履歴
$ rm -f /tmp/greengrass-nucleus-latest.zip # greengrass一時ファイル
$ rm -rf /tmp/GreengrassCore # 同上
セットアップ時に使用したユーザは不要なので停止しておく。
[IAM > ユーザー > <該当ユーザ>]のページの「認証情報」タブを開き、「アクセスキー」のステータスから「無効」を選択。