Greengrass(V1)のOTAアップデートを実施する

#はじめに
今回はGreengrassのOTAアップデートを実施しました。
手順は以下を参考にしています。
参考：[AWS IoT Greengrass Core ソフトウェアの OTA 更新](https://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/core-ota-update.html)

なお、デバイスは以前GreengrassをインストールしたJetson nanoを利用しています。
参考：[Greengrass(V1)をクイックスタートでインストールしてみる](https://qiita.com/kt-yt/items/e2db8520c207861f2f5f)

#1　IAMの設定
OTAアップデートを実施するロールを作成します。
このロールには、アップデート用のソフトウェアをS3から取得するためのポリシーもアタッチします。
##1-1　IAMロールの作成
1.IAMのマネジメントコンソールで左のメニューから ロール をクリック
2.「ロールの作成」をクリック
3.「AWSサービス」内のIoT > IoT を選択して「次のステップ：アクセス権限」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/40b5b37d-b747-8e40-73b8-002789205e89.png)
4.次の画面はそのままで「次のステップ：タグ」をクリック
5.次の画面もそのままで「次のステップ：確認」をクリック
6.ロール名に任意の名前を入力して「ロールの作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/37ca1074-ccd4-f9a2-daae-9f01c6175971.png)
##1-2　IAMポリシーのアタッチ
1.IAMのマネジメントコンソールで左のメニューから ロール をクリック
2.先ほど作成したロールをクリック
3.「ポリシーをアタッチします」をクリック
4.「GreengrassOTAUpdateArtifactAccess」をチェックして「ポリシーのアタッチ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/fbaf20f5-c77e-ded8-9134-95aa0471106d.png)
5.ポリシーがアタッチされていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/125e328c-5da6-46a4-99ac-312b800880c6.png)
##1-3　備考：信頼ポリシーについて
AWSの公式ドキュメントには以下の記載があります。
>ロールにアタッチされた信頼ポリシーは、sts:AssumeRole アクションを許可し、iot.amazonaws.com をプリンシパルとして定義する必要があります。
出典：[Requirements > OTA更新のIAMアクセス許可](https://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/core-ota-update.html#ota-update-requirements)

今回作成したポリシーについては、作成した段階で公式ドキュメントに記載のポリシーが存在したため、追加の作業はしていません。
作成したIAMロールの 信頼関係タブ > 「信頼関係の編集」をクリック で確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/0a31203e-177b-ad41-fef3-f8a50d2e56a9.png)
クリックすると以下の通り信頼ポリシーの編集画面に遷移する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/be83b91f-8d12-a319-acea-b3ba71bbd936.png)
※なお、信頼ポリシーの確認については以下の記事が参考になりました。
　ポリシーを追加しようとしてエラーが出てしまい、同じくハマりかけました…
　参考：[lambda@edgeを使おうとしたらroleにハマった](https://qiita.com/coinlockerbaby/items/ce228975d6b13b103517)

##1-4　備考：実行ユーザのポリシーについて
AWSの公式ドキュメントには以下の記載があります。
>さらに、OTA 更新を開始するユーザーには、greengrass:CreateSoftwareUpdateJob および iot:CreateJob を使用するアクセス許可と、iam:PassRole を使用して署名者ロールのアクセス許可を渡すアクセス許可が必要です。
出典：[Requirements > OTA更新のIAMアクセス許可](https://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/core-ota-update.html#ota-update-requirements)

今回の以降の手順を実施するにあたっては上記操作は実施せずに完遂しています。
私が利用していたIAMユーザが「AdministratorAccess」ポリシーをアタッチされたグループに所属していることに起因するかと思いますので、そうでない場合は公式ドキュメントの通りの権限付与が必要になるかと思います。
#2　OTAアップデートを実施する
GreengrassのOTAアップデートは以下2種類があるので、どちらも実施しました。

* Greengrass Core ソフトウェア
* Greengrass Core OTA エージェントを更新する

##2-1　OTAエージェントの起動
更新対象のエッジデバイスでOTAエージェントを先に実行します。
なお、OTAエージェントが複数起動していると競合してエラーになることがあるようです。
> 競合の原因となる可能性があるため、コア上で OTA 更新エージェント の複数のインスタンスを起動しないでください。
出典：[OTA 更新の作成](https://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/core-ota-update.html#create-ota-update)

1.更新対象のデバイス（今回はJetson nano）で以下のコマンドを実施

```
cd /greengrass/ota/ota_agent
sudo ./ggc-ota
```
2.エージェントが1つのみ起動していることを確認する

```
ps aux | grep -E "greengrass.*ota"
root      1647  0.0  0.1  79080  4476 ?        Ssl  17:52   0:00 /greengrass/ota/ota_agent_v1.0.0_0/ggc-ota -p 2534
root     14225  0.0  0.0   6696  2280 pts/2    S+   18:00   0:00 grep --color=auto -E greengrass.ota
```
##2-2　OTAエージェントのアップデート
1.IoT Coreのマネジメントコンソールで左のメニューから 管理 > ジョブ の順にクリック
2.「ジョブを作成する」をクリック
3.「Core更新ジョブの作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/426d0468-43c9-e1e6-5137-778850bd6352.png)
4.以下の通り設定して「作成」をクリック
※クリックと同時にジョブが実行されるので注意

* 更新するデバイスの選択：※任意のモノ・モノのグループ（複数選択可）
* S3URL署名者ロール：※作成したIAMロール
* エージェントのログレベルを更新する：※任意のログレベル
* アーキテクチャタイプ：ubuntu/aarch64　※対象のデバイスのアーキテクチャにあわせる
* 更新するコンポーネント：Greengrass Core OTAエージェントを更新する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/95a739cc-c3cb-cbc4-ce6f-7e419038e5b2.png)
5.一覧に作成したジョブが表示されるのでクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/7091981c-b650-b4dc-8c2a-7a026a8b2e82.png)
6.進行状況と成否を確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/93812d78-a673-b276-b886-b6a8fc78aed1.png)
##2-3　Greengrass Coreのアップデート
先ほどの「2-2　OTAエージェントのアップデート」と同様の手順です。

1.IoT Coreのマネジメントコンソールで左のメニューから 管理 > ジョブ の順にクリック
2.「作成」をクリック
3.「Core更新ジョブの作成」をクリック
4.以下の通り設定して「作成」をクリック
※クリックと同時にジョブが実行されるので注意

* 更新するデバイスの選択：※任意のモノ・モノのグループ（複数選択可）
* S3URL署名者ロール：※作成したIAMロール
* エージェントのログレベルを更新する：※任意のログレベル
* アーキテクチャタイプ：ubuntu/aarch64　※対象のデバイスのアーキテクチャにあわせる
* 更新するコンポーネント：Greengrass Coreソフトウェア

5.一覧に作成したジョブが表示されるのでクリック
6.進行状況と成否を確認する
※詳細 をクリックすることで実行内容の詳細を確認することができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/d6a4853a-aadb-8049-5028-93a2440936bf.png)

#3　備忘録
##3-1　アップデートされたことの確認
更新対象のデバイスでプロセスを確認するとバージョン箇所の数字が+1されていることが分かります。

```
#Greengrass Coreの確認（***/packages/1.11.0_x となっている）
ps aux | grep -E "greengrass.*daemon"
root     28748  0.1  0.5 1083884 22420 ?       Sl   18:08   0:00 /greengrass/ggc/packages/1.11.0_1/bin/daemon -core-dir /greengrass/ggc/packages/1.11.0_2 -greengrassdPid 28743
root     29048  0.0  0.0   6696   620 pts/2    S+   18:13   0:00 grep --color=auto -E greengrass.*daemon

#OTAエージェントの確認（***/ota_agent_1.0.0_x となっている）
ps aux | grep -E "greengrass.*ota"
root      1647  0.0  0.1  79080  4476 ?        Ssl  17:52   0:00 /greengrass/ota/ota_agent_v1.0.0_1/ggc-ota -p 2534
root     14225  0.0  0.0   6696  2280 pts/2    S+   18:00   0:00 grep --color=auto -E greengrass.ota
```
##3-2　アップデート中のLambdaの挙動
OTAアップデートに際してはGreengrass Coreはシャットダウンされ、Core上で実行されているLambdaも終了されます。
その他、アップデートに際しての注意事項は公式ドキュメントを確認した方がいいでしょう。
参考：[Considerations](https://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/core-ota-update.html#ota-updates-considerations)
##3-3　アップデート後の不具合と解消
今回、「Greengrass Coreソフトウェア」アップデート後にLambdaが実行できなくなりました。
また、デプロイも以下の通り失敗しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001693/3c9a7b99-470f-4901-41aa-967f6378317c.png)
なお、以下の通りGreengrass Coreを再起動することでLambda、デプロイともに正常に実行できるようになりました。

```
#greengrassの終了
sudo /greengrass/ggc/core/greengrassd stop

#greengrassの起動
sudo /greengrass/ggc/core/greengrassd start
```
#4　おわりに
マネジメントコンソールから簡単にOTAアップデートを実施することが出来ました。
グループ化してまとめて実行できるのは便利だと思います。

ただ、「3-3　アップデート後の不具合と解消」のようにGreengrassの再起動が必要になるのは手間でした。
解消法があれば教えていただけるとありがたいです。