ラズパイ１にGreengrassのnucleus liteをビルドしてインストール


先月新しく登場したGreengrass nucleus liteですが、現状ARM64デバイス向けのインストーラーのみが用意されており、CPUアーキテクチャが異なる場合は、自前でビルドする必要があります。

2025年も現役バリバリ（？）のラズパイ１で実際にビルドしてインストールしてみました。

## ラズパイ１のスペック

我が家のラズパイ１は`Raspberry Pi Model B`と思われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/aaf8811d-52af-e0d2-1f36-eb9e115c5cb9.png)


Raspberry Pi OSは最新版の「Raspberry Pi OS Lite」を使用しました。

```shell
uname -a
```
```
Linux raspberrypi 6.6.51+rpt-rpi-v6 #1 Raspbian 1:6.6.51-1+rpt3 (2024-10-08) armv6l GNU/Linux
```

`armv6l`というCPUアーキテクチャのようです。



## マネジメントコンソールでコアデバイスを登録

1. 左メニューの「Greengrassデバイス」の「コアデバイス」を選択します
    「コアデバイスをセットアップ」メニューの「１つのCoreデバイスをセットアップ」を選択します

    ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/96fcff64-1ab9-b5be-0537-c63a6415f146.png)

1. コアデバイス名とモノのグループの情報を入力します（とりあえずデフォルトでOK）

    ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/3fd615bd-5174-1df6-5eb0-ab0282d9ef5e.png)

1. 「Nucleus Lite」を選択します
    「独自のカスタムビルドでデバイスをセットアップ」を選択します

    ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/5da6200c-bedd-0497-2d05-395eb6918b69.png)


1. 「モノを作成」ボタンをクリックします
    「接続キットをダウンロード」をクリックし接続キット（{コアデバイス名}-connectionKit.zip）をダウンロードします

    ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/1a0d6cbe-0c89-93e6-b83e-6bb75b1bc829.png)

    ダウンロード後、画面最下部の「コアデバイスを表示」をクリックします
    （ラズパイ１側の設定が完了するまでは一覧にコアデバイスは表示されません）

## ラズパイ１にインストールする

1. ラズパイ１に接続キットを転送します

    ```shell
    scp {コアデバイス名}-connectionKit.zip pi@{ラズパイ１のIPアドレス}:/home/pi
    ```

1. ラズパイ１にSSHで接続します

    ```shell
    ssh pi@{ラズパイ１のIPアドレス}
    ```
1. ビルドに必要な環境をセットアップします

    ```shell
    sudo apt update
    
    sudo apt install -y libssl-dev libcurl4-openssl-dev libsqlite3-dev libyaml-dev \
      libsystemd-dev liburiparser-dev uuid-dev libevent-dev libzip-dev cgroup-tools
    
    sudo apt install -y build-essential pkg-config cmake git curl
    ```

1. Greengrassの動作に必要なユーザーを作成します

    ```shell
    sudo groupadd ggcore
    sudo useradd -Ng ggcore ggcore
    
    sudo groupadd gg_component
    sudo useradd -Ng gg_component gg_component
    ```

1. 接続キットを展開します

    ```shell
    unzip {コアデバイス名}-connectionKit.zip
    ```

    4ファイルほど展開されます。
    
    ```shell:tree /home/pi
    /home/pi
    ├── AmazonRootCA1.pem
    ├── config.yaml
    ├── device.pem.crt
    └── private.pem.key
    ```

1. 証明書を所定の位置に配置します

    ```shell
    sudo mkdir /ggcredentials
    sudo cp AmazonRootCA1.pem device.pem.crt private.pem.key /ggcredentials/
    sudo chown -R ggcore:ggcore /ggcredentials
    ```

1. 設定ファイルを一部書き換えます
    
    展開したconfig.yamlは以下のような内容となっています。
    ```yaml
    ---
    system:
      certificateFilePath: "{{config_dir}}/device.pem.crt"
      privateKeyPath: "{{config_dir}}/private.pem.key"
      rootCaPath: "{{config_dir}}/AmazonRootCA1.pem"
      thingName: "GreengrassQuickStartCore-19420944fac"
    services:
      {{nucleus_component}}:
        componentType: "NUCLEUS"
        configuration:
          awsRegion: "us-east-1"
          iotRoleAlias: "GreengrassV2TokenExchangeCoreDeviceRoleAlias"
          iotDataEndpoint: "**********-ats.iot.us-east-1.amazonaws.com"
          iotCredEndpoint: "**********.credentials.iot.us-east-1.amazonaws.com"
    ```

    まずは[こちら](https://github.com/aws-greengrass/aws-greengrass-lite/blob/8fea9e7dae75e20e026b42345a2347dd424371f8/.github/workflows/packaging/install-greengrass-lite.sh#L117)を参考に`{{config_dir}}`と`{{nucleus_component}}`を置換します。

    ```shell
    sed -i -e s:{{config_dir}}:\/ggcredentials:g -e s:{{data_dir}}:\/var\/lib\/greengrass:g -e s:{{nucleus_component}}:aws.greengrass.NucleusLite:g config.yaml
    ```

    `rootCaPath`と`thingName`の間に`rootPath`を追加します
    ```diff_yaml
        system:
          certificateFilePath: "/ggcredentials/device.pem.crt"
          privateKeyPath: "/ggcredentials/private.pem.key"
          rootCaPath: "/ggcredentials/AmazonRootCA1.pem"
    +     rootPath: "/var/lib/greengrass"
          thingName: "GreengrassQuickStartCore-19420944fac"
        services:
    ```
    

1. 設定ファイルを所定の位置に配置します

    ```shell
    sudo mkdir -p /etc/greengrass
    sudo cp config.yaml /etc/greengrass/config.yaml
    sudo chown -R ggcore:ggcore /etc/greengrass
    ```

1. Greengrass nucleus liteを取得します

    ```shell
    git clone https://github.com/aws-greengrass/aws-greengrass-lite.git
    cd aws-greengrass-lite
    ```

1. ビルドします

    ```shell
    cmake -B build -D CMAKE_BUILD_TYPE=MinSizeRel -D GGL_LOG_LEVEL=DEBUG
    make -C build -j$(nproc)
    sudo make -C build install
    ```

    <details><summary>インストールログ（一部抜粋）</summary>
    
    ```
    Install the project...
    -- Install configuration: "MinSizeRel"
    -- Installing: /usr/local/bin/ggl-cli
    -- Installing: /usr/local/lib/systemd/system/ggl.core.ggipcd.service
    -- Installing: /usr/local/lib/systemd/system/ggl.gg-ipc.socket.socket
    -- Installing: /usr/local/lib/systemd/system/ggl.ipc_component.socket
    -- Installing: /usr/local/bin/ggipcd
    -- Installing: /usr/local/lib/systemd/system/ggl.core.ggconfigd.service
    -- Installing: /usr/local/lib/systemd/system/ggl.gg_config.socket
    -- Installing: /usr/local/bin/ggconfigd
    -- Installing: /usr/local/lib/systemd/system/ggl.core.gghealthd.service
    -- Installing: /usr/local/lib/systemd/system/ggl.gg_health.socket
    -- Installing: /usr/local/bin/gghealthd
    -- Installing: /usr/local/lib/systemd/system/ggl.aws_iot_mqtt.socket
    -- Installing: /usr/local/lib/systemd/system/ggl.core.iotcored.service
    -- Installing: /usr/local/bin/iotcored
    -- Installing: /usr/local/lib/systemd/system/ggl.core.ggpubsubd.service
    -- Installing: /usr/local/lib/systemd/system/ggl.gg_pubsub.socket
    -- Installing: /usr/local/bin/ggpubsubd
    -- Installing: /usr/local/lib/systemd/system/ggl.core.ggdeploymentd.service
    -- Installing: /usr/local/lib/systemd/system/ggl.gg_deployment.socket
    -- Installing: /usr/local/bin/ggdeploymentd
    -- Installing: /usr/local/lib/systemd/system/ggl.core.gg-fleet-statusd.service
    -- Installing: /usr/local/lib/systemd/system/ggl.gg_fleet_status.socket
    -- Installing: /usr/local/bin/gg-fleet-statusd
    -- Installing: /usr/local/lib/systemd/system/ggl.aws_iot_tes.socket
    -- Installing: /usr/local/lib/systemd/system/ggl.core.tesd.service
    -- Installing: /usr/local/bin/tesd
    -- Installing: /usr/local/bin/fleet-provisioning
    -- Installing: /usr/local/bin/ggl-config-init
    -- Installing: /usr/local/bin/recipe-runner
    -- Installing: /usr/local/lib/systemd/system/ggl.aws.greengrass.TokenExchangeService.service
    -- Installing: /usr/local/bin/tes-serverd
    -- Installing: /usr/local/lib/systemd/system/greengrass-lite.target
    -- Installing: /usr/local/lib/tmpfiles.d/greengrass_dir.conf
    -- Installing: /usr/local/bin/echo-server
    -- Installing: /usr/local/bin/example-client
    -- Installing: /usr/local/bin/mqtt-client
    -- Installing: /usr/local/bin/deployment-client
    -- Installing: /usr/local/bin/status-monitor-client
    -- Installing: /usr/local/bin/configtest
    -- Installing: /usr/local/bin/s3-get-test
    -- Installing: /usr/local/bin/tesd-test
    -- Installing: /usr/local/bin/recipe2unit-test
    -- Installing: /usr/local/bin/ggconfigd-test
    -- Installing: /usr/local/bin/semver-test
    make: Leaving directory '/home/pi/aws-greengrass-lite/build'
    ```
    
    </details>



    トータルで20分ぐらいで完了します

1. サービスを有効化し、起動します
    （`systemctl enable`と`systemctl start`をするだけなのですが、モジュールごとに有効化する必要があるのでスクリプトで実行すると楽ちんです）

    ```shell
    sudo ./misc/run_nucleus 
    ```

うまく設定ができると、マネジメントコンソール上に表示されます。
（GreengrassQuickStartCore-19420944facが今回追加したコアデバイスです）

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/4d8095c7-f61b-6a13-e848-b0a5705950e9.png)


## 参考

https://github.com/aws-greengrass/aws-greengrass-lite/blob/main/docs/INSTALL.md
https://github.com/aws-greengrass/aws-greengrass-lite/blob/main/docs/SETUP.md
https://qiita.com/sparkgene/items/a6d4710e8d192b87e292