Greengrass(V1)をクイックスタートでインストールしてみる

#はじめに
Greengrass(V1)をクイックスタート手順でインストールしてみたので、その手順をまとめます。
以下の手順を参考にしました。
参考：[AWS IoT Greengrass > 開発者ガイド、バージョン 1 > クイックスタート: Greengrass デバイスのセットアップ](https://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/quick-start.html)

なお、今回Greengrass CoreをインストールするデバイスはJetson nanoのDevelopers kitです。
作業はWindowsで行い、Jetson nanoに対する作業は主にTeraTermで接続して行っています。
#1　Greengrassのインストール
今回、下記手順の実行時にエラーが発生しましたが実施時通りの流れで記載します。
成功した手順は1-4からです
##1-1　インストール事前準備
1.インストールに利用するため、AWS CLIで一時認証情報を取得

```
aws sts get-session-token
#結果は以下の通り返ってくる
{
    "Credentials": {
        "AccessKeyId": "[アクセスキーID]",
        "SecretAccessKey": "[シークレットアクセスキー]",
        "SessionToken": "[セッショントークン]",
        "Expiration": "[有効期限]"
    }
}
```

2.クレデンシャル情報を環境変数に設定する

```
#環境変数の設定
export AWS_ACCESS_KEY_ID=[アクセスキー]
export AWS_SECRET_ACCESS_KEY=[シークレットアクセスキー]
export AWS_SESSION_TOKEN=[セッショントークン]

#設定されていることを確認
echo $AWS_ACCESS_KEY_ID
echo $AWS_SECRET_ACCESS_KEY
echo $AWS_SESSION_TOKEN
```

##1-2　インストール用スクリプトの起動（エラー発生）
1.以下のコマンドでスクリプトのダウンロードと実行を行う
※手順にはwgetとcurlの両コマンドが用意されている

```
wget -q -O ./gg-device-setup-latest.sh https://d1onfpft10uf5o.cloudfront.net/greengrass-device-setup/downloads/gg-device-setup-latest.sh && chmod +x ./gg-device-setup-latest.sh && sudo -E ./gg-device-setup-latest.sh bootstrap-greengrass-interactive
```

##1-3　エラーの調査と試行したこと（未解決）
スクリプトの最後で以下のエラーが発生しました。

```
Unexpected error: An error occurred (InvalidClientTokenId) when calling the CreateRole operation: The security token included in the request is invalid
```
1.スクリプト実行時のログを確認

```
#ログを確認
view GreengrassDeviceSetup-20210308-140514.log

#ログの末尾を抜粋
2021-03-08 14:05:17,234 - __main__ - DEBUG - There is no Greengrass Service Role attached to this AWS account. Attaching a service role to the account...
2021-03-08 14:05:17,300 - __main__ - DEBUG - Creating a Greengrass service role for the account.
```
Greengrassサービスのロールがアタッチされていないとのこと。

2.IoT Coreのマネジメントコンソールで設定をクリックし、最下部のGreengrassサービスロールで「ロールをアタッチ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/5041988d-1932-05ed-e4d3-f7a332950a6a.png)
3.「Greengrass_ServiceRole」を選択して「保存」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/cc7e2444-a824-a60f-76f2-20b422d6b874.png)

3.スクリプトを再試行
※既にスクリプトは取得済かつ権限付与済なので、実行コマンドのみ

```
sudo -E ./gg-device-setup-latest.sh bootstrap-greengrass-interactive
```
同様のエラーが出てしまったので、今回は別の方法を試すことにしました。

##1-4　IAMユーザのアクセスキーとセキュリティキーで再試行（成功）
1.環境変数にIAMユーザのアクセスキーとセキュリティキーを設定

```
#環境変数の設定
export AWS_ACCESS_KEY_ID=[アクセスキー]
export AWS_SECRET_ACCESS_KEY=[シークレットアクセスキー]
#セッションキーは使わなくなる
export AWS_SESSION_TOKEN=

#設定されていることを確認
echo $AWS_ACCESS_KEY_ID
echo $AWS_SECRET_ACCESS_KEY
echo $AWS_SESSION_TOKEN
```
2.スクリプトを再試行
※「1-2　インストール用スクリプトの起動（エラー発生）」で既にスクリプトを取得・権限付与もしているため、実施コマンドのみ

```
sudo -E ./gg-device-setup-latest.sh bootstrap-greengrass-interactive
```
3.CLI上で入力が求められるので以下の通り対応
※ちなみに今までの実行でも入力は求められており、最後にエラーメッセージが表示されていた

```
#以降でGreengrassグループ名などを対話形式で設定
[GreengrassDeviceSetup] Forwarding command-line parameters: bootstrap-greengrass-interactive

#環境変数を指定しているので、ここから3つはEnterで次へ
Enter your AWS access key ID, or press 'Enter' to read it from your environment variables.

Enter your AWS secret access key, or press 'Enter' to read it from your environment variables.

Enter your AWS session token, which is required only when you are using temporary security credentials. Press 'Enter' to read it from your environment variables or if the session token is not required.

#東京リージョンを使うため、ap-northeast-1と入力
Enter the AWS Region where you want to create a Greengrass group, or press 'Enter' to use 'us-west-2'.
ap-northeast-1

#Greengrassグループ名とGreengrass Core名は指定した
Enter a name for the Greengrass group, or press 'Enter' to use 'GreengrassDeviceSetup_Group_1b07fde8-fbe6-4c78-a2d6-048ea082319c'.
[Greengrassグループ名]

Enter a name for the Greengrass core, or press 'Enter' to use 'GreengrassDeviceSetup_Core_fdd7444e-64df-4450-b888-defe360031fa'.
[Greengrass Core名]

Enter the installation path for the Greengrass core software, or press 'Enter' to use '/'.

#Hello World Lambda関数はデプロイした
Do you want to include a Hello World Lambda function and deploy the Greengrass group? Enter 'yes' or 'no'.
yes
Enter a deployment timeout (in seconds), or press 'Enter' to use '180'.

Enter the path for the Greengrass environment setup log file, or press 'Enter' to use './'.
```
4.以下の表示が出てインストール完了

```
You can now use the AWS IoT Console to subscribe
to the 'hello/world' topic to receive messages published from your
Greengrass core.
```
#2　Greengrass Coreのデプロイ
マネジメントコンソールでIot Coreに移動し、Greengrass Coreをデプロイする

##2-1　Greengrass Coreのデプロイ
1.IoT Coreマネジメントコンソールの左のメニューから Greengrass > クラシック(V1) > グループ の順にクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/572959aa-e0d9-7348-9f2a-9a69e7127b6e.png)
2.作成されたGreengrass Coreをクリックし、コアをクリック
3.アクション > デプロイ の順にクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/e37d141f-17dd-19f1-6046-061fcf3f095e.png)

##2-2　Lambda実行と疎通の確認
1.IoT Coreマネジメントコンソールでの左のメニューから テスト をクリック
2.トピックのフィルターを「hello/world」、追加設定のMQTTペイロード表示を「ペイロードを文字列として表示(より正確)」として「サブスクライブ」をクリック
※デプロイしたHelloWorld関数が hello/world 宛てにパブリッシュし続けることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/2c2e1b90-adc2-8c98-167d-25063a21c497.png)
3.以下のようなメッセージが表示される

```
Hello world! Sent from the Lambda function - Greengrass_HelloWorld_S2kUw running on platform: Linux-4.9.201-tegra-aarch64-with-Ubuntu-18.04-bionic
```
※左のメニューからGreengrass > クラシック(v1) > グループ > 作成したグループ > サブスクリプション と移動すると、ローカルのLambdaからIoT Cloudをターゲットとして、hello/world へのMQTTメッセージのルーティングが定義されていることが分かる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/f8f992e3-c266-90ed-ec67-63cdb2aab336.png)

##2-3　Greengrassの起動と終了を確認
「2-2　Lambda実行と疎通の確認」で実施したサブスクライブはそのままとして、Greengrassの起動/終了でメッセージが止まるかどうか確認しました。

1.Greengrassを以下のコマンドで終了する

```
#停止コマンド
sudo /greengrass/ggc/core/greengrassd stop

#成功すると以下の通り返ってくる
Waiting..........
Stopped greengrass daemon, exiting with success
```
2.IoT Coreのマネジメントコンソールで「hello/world」にメッセージが届かなくなったことを確認する
3.Greengrassを以下のコマンドで再度開始する

```
#開始コマンド
sudo /greengrass/ggc/core/greengrassd start

#成功すると以下の通り返ってくる
Setting up greengrass daemon
Validating hardlink/softlink protection
Waiting for up to 1m10s for Daemon to start

Greengrass successfully started with PID: 29183
```
4.再びIoT Coreのマネジメントコンソールで「hello/world」にメッセージが届くことを確認する

#3　おわりに
以下の通り設定時に環境変数に設定するAWSアカウントの認証情報は一時的なセキュリティ認証情報が推奨とのことですが、今回は上手くいかなかったため、IAMユーザの認証情報を利用しました。

再度、試行して上手くいった際には原因と解消法をまとめます。

参考：[Greengrass デバイスセットアップ設定オプション](https://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/quick-start.html#gg-device-setup-options)

#4　参考文献（文中で登場していないもの）

* [AWS IOT GREENGRASS(V1)入門ハンズオン](https://aws-iot-greengrass-for-beginners.workshop.aws/)
* [AWS IAMユーザーに対して一時的な認証情報をリクエストする(STS:GetSessionToken)](https://dev.classmethod.jp/articles/temp-credentials-request-against-iam-user/)