
電子工作/IoT連載 の4本目です
はじめに
こんにちは、TIG所属の宮永です。
ASUSが販売しているシングルボードコンピュータTinekr Board2SにAWS Greengrassの環境を構築したので記事にまとめました。
シングルボードコンピュータと聞くと真っ先に思い浮かべるのはRaspberryPiでしょうか。私も初めて触ったシングルボードコンピュータはRaspberryPiでした。
マザーボードなどで有名なASUSが販売しているシングルボードコンピュータの性能はとても気になります。
ネット上でもTinker Board2Sの記事はRaspberryPiに比べると非常に少ないため、本記事の構成も前半はTinker Boardの初期セットアップ、後半をAWS Greengrassの環境構築との章立てとしています。
本記事がTinker Board2S購入検討をしている方の役にたてば幸いです。
Tinker Board2Sとは
ASUSが販売するArmベースのシングルボードコンピュータです。
商品についての公式ページはこちらです。
まずは外観から観察します。
外観
一際目を惹くのはでっかいヒートシンクですね。😳
このヒートシンクは付属品です。
手前にピンヘッダーが40個確認できます。着色してあるため非常に便利です。
RaspberryPiだと上から1つずつ数えていかなければ行けないのでこの仕様はとてもありがたいですね。
外部インタフェースを見ていきます。
3.2USB Gen1 Type-Aが3つ、3.2USB Gen1 Type-Cが1つ付属しています。有線LANも接続できるようになっています。
最後に前面(背面? )です。
手前に見えている端子はMIPI CSI(Mobile Industry Processor Interfa Camera Serial Interface)です。こちらの端子はカメラモジュールを取り付ける際に使用します。
その右側には小さいですがLEDが3つついています。
左から電源用LEDランプ、ディスクアクティビティLEDランプ、プログラマブルLEDです。
外観の観察もほどほどにOSのインストールをします。
OSインストール
Tinker Boardは専用のOSが公式ページで配布されています。
まずはOSをデスクトップPCにダウンロードします。
筆者のデスクトップ環境はUbuntu22.04ですのでセットアップもそれに準じたものとなっています。
以下Ubuntu22.04がインストールされた母艦PCをデスクトップPCと呼称しています。
デバイスをUSB経由でPCに接続しデスクトップPCでの正常に認識されているかを確認します。lsusb
で接続デバイスを確認できます。
Tinker Board接続前
❯❯❯ lsusb |
Tinker Board接続後
❯❯❯ lsusb |
デバイスが1つ増えていますね。
書き込みはEthcerを使用します。
デバイスを認識した状態でOSイメージをTinkerOSで選択します
私の場合はこのタイミングで書き込み先も自動的にTinkerBoardが登録されました。

書き込まれるのを待つだけです。

イメージの書き込みが完了したら再度電源を入れます。
起動するとリブートが始まり、以下の画面が立ち上がります。
有線LANを接続した状態で引き続きセットアップを行います。
SSH接続します。
ログイン名linaroとなっているので
ssh linaro@<IPaddress> |
で接続ができます。Passwordを要求されるのでlinaroと入力すると接続ができます。
AWS Greengrassの環境構築はssh接続できれば問題ありませんので、Tinker Boardの初期セットアップは以上で完了とします。
AWS Greengrassのインストール
AWS Greengrassは2022年4月現在v1とv2の2つあります。
今回はCPU ARM64 【AArch64】環境でdockerを使用したかったためv1の環境構築を行います。
v2では ARM64 【AArch64】のdocker環境はサポートされていないようです。
なお、以下の環境構築ではTinker Board上にdocker及び、docker-composeがインストールされていることを想定しています。
環境構築は以下の公式の開発者ガイドに沿って行います。
https://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/what-is-gg.html
Greengrassのグループ作成
まずはAWS Greengrassのグループを作成します。
デフォルトの設定でグループを作成します。
AWS IoTコンソール画面左のタブから「クラシック>グループ」を選択します.
画面遷移後「グループを作成」を選択すると下図のようになるので「デフォルト作成を使用」を選択します。




グループの作成が完了すると証明書が発行されます。
この証明書は後ほど使用するためデスクトップPCにダウンロードしておきます。

次に先程発行した証明書を使用してGreengrassコンテナを起動します。
必要なDockerfileなどはこちらからダウンロードできます。
私はバージョン1.10を使用しました。
ダウンロードした圧縮ファイルはデスクトップPCからTinker Boardに転送します。
以下のコマンドTinker Boardのhomeに転送できます。
scp -r aws-greengrass-docker-1.11.0.tar.gz linaro@<IPaddress>:~/ |
先程ダウンロードした証明書も転送してしまいましょう。
scp -r xxxxxx-setup.tar.gz linaro@<IPaddress>:~/ |
それではsshでTinker Boardに接続してコンテナを起動します。
sshで接続します。
ssh linaro@<IPaddress> |
ディレクトリ構成ですが私はhome直下にgreengrassというディレクトリを作成し、そこに先程の2つのファイルを格納しました。
下記のような構成です。
linaro@linaro-alip:~/greengrass$ tree |
まずはaws-greengrass-docker-1.11.0.tar.gzを同一ディレクトリに解凍します。
tar -zxvf aws-greengrass-docker-1.11.0.tar.gz |
次に証明書の圧縮ファイルを解凍したフォルダの中に解凍します。
tar -xzvf xxxxxxx-setup.tar.gz -C aws-greengrass-docker-1.11.0/ |
この状態でディレクトリ構成は以下のようになります。
certsとconfigは証明書の圧縮ファイルを解凍して生成されたものです。
本記事で解説している方法は解凍ファイル中のREADME.mdに全て記載されています。
RaspberryPiを使用される方はarmv7l についての環境構築方法も記載されているため、ぜひご覧になってください。
linaro@linaro-alip:~/greengrass/aws-greengrass-docker-1.11.0$ ls |
コンテナの起動
開発ガイドにはLinuxをコアデバイスとするときに以下のコマンドを入力するように記載されていますので、それに従います。
echo 1 > /proc/sys/fs/protected_hardlinks |
また、/etc/sysctl.conf
に以下の記載をした後にsudo sysctl -p
を端末に入力します。
net.ipv4.ip_forward = 1 |
それでは用意されているdocekr-composeからイメージをビルドします。
docker-compose.ymlはCPUアーキテクチャ毎に用意されているので使用するプラットフォームに合わせてファイルを指定します。
sudo docker-compose -f docker-compose.alpine-aarch64.yml build |
ビルドが終了したら、コンテナを起動します。
コンテナの起動の前にルート証明書が必要なのでcertsディレクトに移動して以下のコマンドを入力します。
sudo wget -O root.ca.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem |
certs配下にroot.ca.pemがダウンロードされていることを確認してください。
linaro@linaro-alip:~/greengrass/aws-greengrass-docker-1.11.0/certs$ tree |
ここまでできたらコンテナを起動します。
sudo docker-compose -f docker-compose.alpine-aarch64.yml up |
起動しました🎉

Lambda関数の準備
次にマネジメントコンソールからLambda関数をコンテナに向けてデプロイします。
Lambda関数を作成するのに必要なGreengrassのPython SDKはここからダウンロードできます。
開発者ガイドに記載の通り
Helloフォルダにgreengrasssdkをコピーしてzipファイルに圧縮します。
ここからダウンロードしたファイルのexamplesにHelloフォルダがあるので以下の構成で
圧縮ファイルを作成します。
~/Downloads/aws-greengrass-core-sdk-python-master/examples/HelloWorld |
圧縮コマンドは以下の通りです。
zip -r hello_world_python_lambda.zip greengrasssdk greengrassHelloWorld.py |
それでは、AWSクラウド上にLambdda関数をデプロイします。
マネジメントコンソールで適当な名前をつけてLambda関数を作成します。

先程のzipファイルを直接アップロードしてハンドラの名前を編集します。

開発者ガイドに沿ってバージョンとエイリアスも設定します。

クラウド上へのLambda関数のデプロイが完了したらコンテナに向けてコードの更新を行います。
Greengrassのグループから「Lambdaの追加」を選択します。

すでにLambda関数はデプロイしていますので「既存のLambdaの使用」を選択します。

関数を追加したらLambdaの設定画面に移動して
「タイムアウト」とLambdaの「ライフサイクル」を下記のように設定します。
他の設定はデフォルトのままで「更新」を選択します。

グループの設定画面に戻り「最初のサブスクリプションの追加」を選択します。

「サブスクリプションの作成」画面ではメッセージの送信元(ソース)と受信先(ターゲット)を選択します。
AWS IoTではMQTTをPub/Subできます。
以前RaspberryPiとAWS IoT CoreでPub/Subした記事をいかにまとめていますのでよろしければご覧になってください。
GoでMQTT!! ~温湿度マイスターbotの作成~(前編)
GoでMQTT!! ~温湿度マイスターbotの作成~(後編)
トピックのフィルターに「hello/world」と入力して「次へ」を選択します。

それではコアデバイスにLambda関数をデプロイします。
作成したHelloWorldグループ画面で「アクション>デプロイ」を選択します。
デプロイする前にコアデバイスでGreengrassが起動していることを再度確認しましょう。

「自動検出」を選択するとデプロイが開始します。

デプロイが正常に終了するとステータスが緑色になります。

動作確認
AWS IoTのマネジメントコンソールの「テスト>MQTTテストクライアント」からトピックをサブスクライブします。

トピックのフィルターはhello/worldとして、各種設定を以下のようにします。

サブスクライブを選択すると、MQTTの受信が始まります。
コアデバイスが正常に動作していると下図のようにコアデバイスから設定したメッセージが届きます🎉

コアデバイスのLambda関数はクラウド上から関数を更新、グループの設定から再デプロイを行うことでいつでも更新できます。とても便利ですね。
今回はTinker BoardにGreengrassの環境を構築して終わりましたが、次回はエッジデバイスでの加工処理なども行いたいと思います。
最後までお付き合いいただきありがとうございました。