Raspberry PiとAWSを繋いでみる ~はじめの一歩~
こんにちは。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:[email protected])<先ほど取得したプライベート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らしい機能も使っていければと思います。