Raspberry PiとAWSを繋いでみる ~はじめの一歩~

あなたの家にもRaspberry Pi眠っていませんか?
2023.03.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。CX事業本部のKyoです。

前回デバイスなしでAWS IoT Coreに入門したので、今回はIoTデバイスの王道であるRaspberry Pi(以下ラズパイ)を触ってみました。前回↓

概要

ラズパイとAWSを繋ぎます。具体的にはAWS IoT Coreのチュートリアルをベースに、AWS CLIからAWS IoTへの疎通確認を行うまでです。

AWS IoT Device Client 用のデバイスの準備

なお、家にあったラズパイ(チュートリアルとして動作確認していない機種)を使っていたり、手癖でやや違う手順を行っている箇所があります。その分チュートリアルにない情報も含めているので体験記として見ていただければ幸いです。

環境

  • MacBook Air (M1, 2020) Monterey 12.5.1
  • Raspberry Pi 3 Model B
  • microSD 16 GB
  • SDカードリーダー
  • LANケーブル
  • (オプション)HDMIディスプレイ
  • (オプション)USBキーボード

ステップ 1: デバイスのオペレーティングシステムをインストールおよび更新する

デバイスのオペレーティングシステムを microSD カードにロードする

まずはOSの準備から始めます。ドキュメント通り公式サイトからイメージファイルをダウンロードしてもよいのですが、Raspberry Pi Imagerというツールが便利そうだったので使ってみました。公式ですしね。詳しくは以下のエントリをご覧ください。

このような感じでGUIからポチポチするだけでmicroSDにイメージを書き込めます。

新しいオペレーティングシステムで IoT デバイスを起動する

ラズパイを有線LANでネットワークに接続します。

最初はなるべくシンプルに、とモニター・キーボードなしの以下の方法を試しました。

Raspberry Pi が接続されているルーターにアクセスできる場合は、ルーターの admin インターフェイスでそのアドレスを確認できます。

しかし、(おそらく環境要因から)ルーターの画面上ではどのIPがラズパイのものなのかを判別することができませんでした。

改めてモニターとキーボードを繋ぐことでラズパイにログイン、hostnameコマンドでプライベートIPを取得できました。(手順ではログインしなくてもIPが表示される、とのことでしたが間違えてログインしてしまった)。

hostname -I

何はともあれ、これでMacからラズパイに接続する準備ができました。

ローカルホストコンピュータをデバイスに接続する

先ほど得たプライベートIPを使ってMacからラズパイに接続していきます。一応手順でMacの場合はTerminalを使ってね、ということでしたが、いつもの癖でiTerm2を使いました(特に問題はなし)。

そういえば秘密鍵なしでのSSHは初めてだった気がします。

ssh [pi@](mailto:pi@192.168.10.114)<先ほど取得したプライベートIP>

ステップ 2: デバイスに必要なソフトウェアをインストールして確認する

オペレーティングシステムソフトウェアを更新する

apt-getでソフトウェアを更新し、ロケール、タイムゾーンを設定していきます。ここはEC2のセットアップとあまり変わりませんね。

ただ、SSH越しに画面が表示されるのはちょっと新鮮でした。

必要なアプリケーションおよびライブラリをインストールする

apt-getで以下を導入しました。ここも特に変わったところはないですね。

pi@raspberrypi:~ $ gcc --version
cmake --version
openssl version
git --version
gcc (Raspbian 10.2.1-6+rpi1) 10.2.1 20210110
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

cmake version 3.18.4

CMake suite maintained and supported by Kitware (kitware.com/cmake).
OpenSSL 1.1.1n  15 Mar 2022
git version 2.30.2

microSD カードイメージを保存する

必須の手順ではないですが、バックアップもやってみました。

手順では適当なSD カードイメージングツールを使ってね、ということでしたが、Macでは特別なツールをインストールすることなく、コマンドラインからイメージのバックアップが可能です。 以下のQitaの方法を参考ににさせていただきました。

MacにSDカードを接続した状態でdiskutil listコマンドを実行し、その中から、該当するディスク名を確認します。今回は/dev/disk4でした。

$ diskutil list
/dev/disk0 (internal):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                         251.0 GB   disk0
   1:             Apple_APFS_ISC                         524.3 MB   disk0s1
   2:                 Apple_APFS Container disk3         245.1 GB   disk0s2
   3:        Apple_APFS_Recovery                         5.4 GB     disk0s3

/dev/disk3 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +245.1 GB   disk3
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD            23.4 GB    disk3s1
   2:              APFS Snapshot com.apple.os.update-... 23.4 GB    disk3s1s1
   3:                APFS Volume Preboot                 859.6 MB   disk3s2
   4:                APFS Volume Recovery                1.6 GB     disk3s3
   5:                APFS Volume Data                    168.7 GB   disk3s5
   6:                APFS Volume VM                      20.5 KB    disk3s6

/dev/disk4 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.9 GB    disk4
   1:             Windows_FAT_32 bootfs                  268.4 MB   disk4s1
   2:                      Linux                         15.7 GB    disk4s2

続いてアンマウントします。

diskutil unmountDisk /dev/disk4s1

ddコマンドでバックアップを実行します。16GBのmicroSDで10分ほどかかりました。

sudo dd if=/dev/rdisk4 of=<任意の名前>.img bs=1m

ステップ 3: デバイスをテストし、Amazon CA 証明書を保存する

AWS Command Line Interface をインストールする

AWS CLIをインストールします。curlでzipを落としてくる方式ではなくGitHubから取得してインストールする方法でした。

以下の注意がありましたが、記載されている手順通りやれば最新版をインストールすることになるので特に問題ないと思います。

AWS CLI のバージョンは 2.2 以降でなければなりません。

$ aws --version
aws-cli/2.11.4 Python/3.9.2 Linux/6.1.19-v7+ source/armv7l.raspbian.11 prompt/off

AWS アカウント 認証情報を設定する

AWSのマネジメントコンソールからIAMユーザーを作り、アクセスキー、シークレットキーを発行します。また、IAMポリシーも付与します。

このチュートリアルではDescribeEndpointできればいいだけだったので、以下のように設定しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "iot:DescribeEndpoint",
            "Resource": "*"
        }
    ]
}

なお、 ポリシーとアクションの関係はここにまとまっています。

aws configureして先ほど発行したアクセスキー、シークレットキーを設定します。

その後、以下のコマンドでAWS IoT Coreと疎通確認を行います。

$ aws iot describe-endpoint --endpoint-type iot:Data-ATS
{
    "endpointAddress": "xxxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com"
}

無事に正常なレスポンスを得られ、デバイスがAWSアカウントおよびAWS IoT Coreエンドポイントにアクセスできることを確認できました。

以上で「Raspberry PiとAWSを繋いでみる」を達成できました!

Amazon ルート CA 証明書をダウンロードする

本エントリでやりたかったことは終わりですが、チュートリアルとしては後続のため、もう1手順残っているので一応対応しておきました。といっても、ディレクトリを作成して証明書をダウンロード、アクセス権を変更するだけす。

おわりに

今回はラズパイからAWSへの接続を行いました。

やや大変だったポイントとしては、自宅のLANに接続したデバイスのプライベートIPをスムーズに見つけられなかったことです。 ただそれ以外については(勝手にハードルを感じていた)物理デバイスといえど、EC2のセットアップとそんなに変わらないとも感じました。

今後、IoT Coreらしい機能も使っていければと思います。