AWS IoT Greengrass V2の初期セットアップまとめ
はじめに
AWS IoT Greengrassを触れる機会があり、初期セットアップがめちゃくちゃめんどくさかったため、セットアップ方法をまとめます。
対象読者
- AWSに基礎的な知識がある方
手順
前提条件
下記のパッケージをインストールしていることを前提とします。
- AWS CLI
- AWS CLIを利用するためのIAMユーザーのクレデンシャル情報
1. インストールに利用するIAMロール・ポリシーの作成
Greengrassをインストールする際に利用するIAMロール・ポリシーを作成する。
まず、IAMポリシーを作成する。このポリシー名は適当でよい。
重要なのは下記の内容である。
-
GreengrassV2TokenExchangeRoleとGreengrassV2TokenExchangeRoleAccessの箇所は、この後で実行するインストーラの引数で指定したものと同じ値をセットする必要がある。 - ここで指定している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ユーザーで作業する。
ここでの作業の流れは以下の通り。
- 作成したIAMロールの内容で一時クレデンシャルを取得する
- 取得したクレデンシャルをインストーラを実行するデバイスの環境変数にセットする
まず、作成した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