メインコンテンツまでスキップ

「RaspberryPi」タグの記事が26件件あります

全てのタグを見る

· 約7分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

re:InventでGreengassのバージョンアップが発表されました〜!!!

AWS IoT Greengrass 2.0 を発表 — オープンソースエッジランタイムと新しい開発者向け機能

ちょっと試してみたのですが、1.0とは別物です(笑)

環境

ハード:Raspberry Pi 4 OS:Raspberry Pi OS(32bit)

OSは新規インストール、SSH接続ができる状態でスタートしました。

インストール

Cgroupsを有効化

いつものcgroup_enable=memory cgroup_memory=1を末尾に足します。 ※いつもの過ぎて公式ドキュメントに載ってなさそう

/boot/cmdline.txt
- console=serial0,115200 console=tty1 root=PARTUUID=a1849cf9-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
+ console=serial0,115200 console=tty1 root=PARTUUID=a1849cf9-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles cgroup_enable=memory cgroup_memory=1

Javaのインストール

Greengrass 2.0はなんとJavaでできております。Open JDKをインストールします。

RaspberryPi4
sudo apt install openjdk-8-jdk

AWS認証情報の取得

Greengrassの動作にはAWS CLIやAWSの認証情報は不要ですが、インストール作業には必要です。 (インストール時にモノの登録とかIAMロール、ポリシーの作成を行うからです)

インストール時だけ必要な認証情報なので、最近提供されたばかりの AWS CloudShellを使ってみます

  • IAMロール、ポリシーの作成
CloudShell
ACCOUNT_ID=`aws sts get-caller-identity | jq -r '.Account'`

cat << EOF > GreengrassV2InstallAssumeRolePolicy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::${ACCOUNT_ID}:root"
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}
EOF

cat << EOF > GreengrassV2InstallPolicy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"greengrass:CreateDeployment",
"iot:AddThingToThingGroup",
"iot:AttachPolicy",
"iot:AttachThingPrincipal",
"iot:CreateJob",
"iot:CreateKeysAndCertificate",
"iot:CreatePolicy",
"iot:CreateRoleAlias",
"iot:CreateThing",
"iot:CreateThingGroup",
"iot:DescribeEndpoint",
"iot:DescribeRoleAlias",
"iot:DescribeThingGroup",
"iot:GetPolicy",
"iam:GetRole",
"iam:GetPolicy",
"iam:CreateRole",
"iam:PassRole",
"iam:CreatePolicy",
"iam:AttachRolePolicy"
],
"Resource": "*"
}
]
}
EOF

aws iam create-policy --policy-name GreengrassV2InstallPolicy --policy-document file://GreengrassV2InstallPolicy.json
aws iam create-role --role-name GreengrassV2InstallRole --assume-role-policy-document file://GreengrassV2InstallAssumeRolePolicy.json
aws iam attach-role-policy --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/GreengrassV2InstallPolicy --role-name GreengrassV2InstallRole

  • 認証情報の生成
CloudShell
aws sts assume-role --role-arn arn:aws:iam::${ACCOUNT_ID}:role/GreengrassV2InstallRole --role-session-name session1

こんな感じで出力されます

{
"Credentials": {
"AccessKeyId": "XXXXXXXXXX",
"SecretAccessKey": "XXXXXXXXXX",
"SessionToken": "XXXXXXXXXX",
"Expiration": "XXXX-XX-XXTXX:XX:XX+XX:XX"
},
"AssumedRoleUser": {
"AssumedRoleId": "XXXXXXXXXX",
"Arn": "XXXXXXXXXX"
}
}

インストール

  • Greengrassモジュールのダウンロードと展開
RaspberryPi4
cd ~
curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip > greengrass-nucleus-latest.zip
unzip greengrass-nucleus-latest.zip -d GreengrassCore
  • 認証情報の設定

先程取得した認証情報を環境変数にセットします。

RaspberryPi4
export AWS_ACCESS_KEY_ID=XXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXX
export AWS_SESSION_TOKEN=XXXXXXXXXX
  • インストール
RaspberryPi4
sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE \
-jar ./GreengrassCore/lib/Greengrass.jar \
--aws-region ap-northeast-1 \
--thing-name GreengrassCore-1767ad88a82 \
--thing-group-name GreengrassGroup \
--component-default-user ggc_user:ggc_group \
--provision true \
--setup-system-service true \
--deploy-dev-tools true

かんたん!!! サービス登録もされており、起動もしてます。

RaspberryPi4
sudo systemctl status greengrass
● greengrass.service - Greengrass Core
Loaded: loaded (/etc/systemd/system/greengrass.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2020-12-19 13:21:07 GMT; 4s ago
Main PID: 9148 (sh)
Tasks: 12 (limit: 4915)
Memory: 33.4M
CGroup: /system.slice/greengrass.service
├─9148 /bin/sh /greengrass/v2/alts/current/distro/bin/loader
└─9152 java -Dlog.store=FILE -Droot=/greengrass/v2 -jar /greengrass/v2/alts/current/distro/lib/Greengrass.jar --setup-syst

Dec 19 13:21:07 raspberrypi systemd[1]: Started Greengrass Core.
Dec 19 13:21:07 raspberrypi sh[9148]: Greengrass root: /greengrass/v2
Dec 19 13:21:07 raspberrypi sh[9148]: JVM options: -Droot=/greengrass/v2
Dec 19 13:21:07 raspberrypi sh[9148]: Nucleus options: --setup-system-service false
Dec 19 13:21:11 raspberrypi sh[9148]: Added ggc_user to ggc_group

使ってみた

Greengrass 2.0は、「レシピでコンポーネントを作ってデプロイする」という考え方になっているようです。

image.png

Greengrass 1.0は「Lambdaをエッジで」という感じでしたが、Greengrass 2.0はLambdaにとらわれず、「クラウドから任意のプログラムをデプロイできる仕組み」にバージョンアップしたイメージです。 サンプルがこんな感じなので、その気になれば何でもOK的な感じですよね。もちろんLambdaもデプロイできます。

image.png

Lambdaをデプロイしてみた

超簡単なLambdaをデプロイしてみました。

lambda_function.py
import json

def lambda_handler(event, context):
# TODO implement
print (json.dumps(event))
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}

print (json.dumps('start lambda'))

コンポーネントの作成

イベントソースを設定したり、タイムアウト、ロングライブ設定など、表現は変わってますが、旧バージョンと大体同じことができそうです。

image.png

ボリュームやデバイスの設定も、Lambdaに対して行うので、旧バージョンよりわかりやすい感じになりました。

image.png

デプロイ

まずはデプロイ対象を指定します。モノのグループを選ぶと、グループに追加になったコアに対しても自動で適用されるようです。

image.png

次に、デプロイするコンポーネントを選択します。自分で作ったコンポーネントの他に、AWSが提供するコンポーネントも沢山あります。もともとコネクタで提供されていた機能もここに統合されているような気がします。

image.png

コンポーネントごとの個別設定を行います。

image.png

これがNucleus(Greengrassコアのことと思います)の個別設定です。MQTTの接続ポートを替えたりできそうです。jvmOptionsまで変えれます。

image.png

最後にデプロイの設定です。タイムアウトや失敗時のロールバック設定ができます。

image.png

これでデプロイが実行されます。

動作確認

マネジメントコンソールのテストで、hello/worldトピックにメッセージを投げて、ログが出力されることを確認。

RaspberryPi(piユーザーでは権限がなくログが見れないのでrootで確認)
root@raspberrypi:~# tail /greengrass/v2/logs/gg_sample.log -n 1
2020-12-19T13:53:36.759Z [INFO] (pool-2-thread-22) gg_sample: lambda_function.py:5,{"message": "Hello from AWS IoT console"}. {serviceInstance=0, serviceName=gg_sample, currentState=RUNNING}
root@raspberrypi:~#

Lambda間の通信や、IoT CoreへのPublishはこちらの方法を使うようです。勉強中です

Interprocess communication https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html

· 約5分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

Re:Invent 2020でAmazon EKS Distro (EKS-D)が発表されましたね。

公式ブログはこちら なぜか日本語の方にはEKS-Dの表記がないですね

Amazon EKS Distro: Amazon EKS で使用される Kubernetes ディストリビューション https://aws.amazon.com/jp/blogs/news/amazon-eks-distro-the-kubernetes-distribution-used-by-amazon-eks/

Introducing Amazon EKS Distro (EKS-D) https://aws.amazon.com/jp/blogs/opensource/introducing-amazon-eks-distro/

早速手持ちのRaspberry Pi 4でやってみました。

先にまとめ

環境

Raspberry Pi 4 (メモリ8GB) microSDカード 32GB ※EKS-Dのビルドを行う際に10GBほど必要です

OSはUbuntu 20.04(64bit)です。

前準備

sudo apt update && sudo apt upgrade -y
  • snapcraftのインストール
sudo snap install snapcraft --classic
  • /boot/firmware/cmdline.txtcgroup_enable=memory cgroup_memory=1を追加(1行目の末尾)
- net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline rootwait fixrtc
+ net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline rootwait fixrtc cgroup_enable=memory cgroup_memory=1
  • LXDの初期化

ビルド時にLXDを使ってみました。初期化します。ディスクスペースが5GBでは不足するので10GBにしました。それ以外はデフォルト設定です。

sudo lxd init
Would you like to use LXD clustering? (yes/no) [default=no]: 
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Name of the storage backend to use (btrfs, dir, lvm, zfs, ceph) [default=zfs]:
Create a new ZFS pool? (yes/no) [default=yes]:
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]:
Size in GB of the new loop device (1GB minimum) [default=5GB]: 10GB ←ここだけ!
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]:
What should the new bridge be called? [default=lxdbr0]:
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
Would you like LXD to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:

EKS-Dのsnapパッケージのビルド

cd /tmp/
git clone https://github.com/canonical/eks-snap.git
cd eks-snap/
snapcraft --use-lxd

45分ほど待つと、eks_v1.18.9_arm64.snapが出来上がります 私のビルド成果物はこちらに格納しました。 https://github.com/moritalous/eks-snap/releases/tag/eks_v1.18.9_arm64

EKS-Dのインストール

sudo snap install eks_v1.18.9_arm64.snap --classic --dangerous

EKS-Dの起動

sudo eks.start

ステータス確認

ubuntu@ubuntu:~$ sudo eks status
eks is running
high-availability: no
datastore master nodes: 127.0.0.1:19001
datastore standby nodes: none
ubuntu@ubuntu:~$

ubuntuユーザーで動作するように設定

mkdir ~/.kube
cd ~/.kube
sudo eks.config > config
chmod 600 config
sudo usermod -a -G eks ubuntu
sudo chown -f -R ubuntu ~/.kube

一度ログアウトして再ログインすると、eks.kubectlコマンドが使えると思います。

色々確認

eksに含まれるコマンドの確認

ubuntu@ubuntu:~$ eks help
Available subcommands are:
add-node
config
ctr
dashboard-proxy
dbctl
join
kubectl
leave
refresh-certs
remove-node
reset
start
status
stop
inspect
ubuntu@ubuntu:~$

kube-systemで起動しているPodの確認

ubuntu@ubuntueks kubectl get pods -n kube-system 
NAME READY STATUS RESTARTS AGE
calico-node-7js69 1/1 Running 1 83m
metrics-server-f59887c58-5wxdp 1/1 Running 0 83m
calico-kube-controllers-555fc8cc5c-6v286 1/1 Running 0 83m
coredns-6788f546c9-vtbq5 1/1 Running 0 83m
hostpath-provisioner-c77bfc987-vnbzk 1/1 Running 0 83m
ubuntu@ubuntu:~$

Serviceの確認

ubuntu@ubuntu:~$ eks kubectl get svc --all-namespaces 
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 87m
kube-system kube-dns ClusterIP 10.152.183.10 <none> 53/UDP,53/TCP,9153/TCP 87m
kube-system metrics-server ClusterIP 10.152.183.182 <none> 443/TCP 87m
ubuntu@ubuntu:~$

イマイチどのあたりがEKSなのか、わかりませんでした。。。

· 約5分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

ポートの開放することなく、Respberry Piに外からアクセスするポートの開放することなく、Respberry Piに外からアクセスする(2020年 AWS編) に続く第3段です。

今回はOpenVPNのクラウドサービス「OpenVPN Cloud」を使います。

OpenVPN Cloud | The Next-Generation Cloud VPN Solution https://openvpn.net/cloud-vpn/

公式サイトから引用すると

A managed service that provides secure networking, over the Internet, between an enterprise’s private networks and remote users in the form of a “VPN in the Cloud”.

DeepLによる翻訳

企業のプライベートネットワークとリモートユーザーの間で、インターネットを介して安全なネットワークを提供するマネージドサービスです。

とのことです。

OpenVPNのサーバー機能をサービス提供してくれますので、Raspberry Piはサーバーではなくクライアントとしてセットアップします。そのため、ポートの開放は不要です。

2020/11時点で3接続までは無料です。10台接続の場合は、$7.50/接続のようです。 https://openvpn.net/cloud-vpn/pricing/

OpenVPN Cloudの作成と設定

https://cloud.openvpn.net/ にアクセスし、アカウントを作成しましょう。アカウント作成までに必要なものはメールアドレスのみで、クレジットカードなどは必要ありませんでした。

image.png

アカウントが作成されたら、管理画面が表示されます。

image.png

メニューの「Users」を選択しましょう。

image.png

初期状態では、Userは1つ(OpenVPN Cloudアカウントと同じもの)だけですが、プラスボタンでUserが追加できます。 Groupの設定はとりあえず「Default」でも良さそうです。

アカウントが作成できたら、「User Portal URL」に記載のあるURLにアクセスします。(OpenVPN Cloudアカウント作成時に指定したドメインです)

image.png

ここに、先程自分で作成したUserでログインします。

ログイン後、クライアントアプリのインストール方法が表示されいます。 WindowsやMac、iOS、AndroidをOpenVPNに接続する方法はこの内容に従ってインストールしましょう。

image.png

Linux向けのクライアント設定方法もリンクがあるのですが、armアーキテクチャには対応してなかったので、以下の方法でRaspberry Piの設定をしましょう

Raspberry PiのOpenVPN Client設定

もう少しブラウザでの設定が続きます。

ブラウザ上部の「MY DEVICES」を選択します。

image.png

作成したデバイスの「Download profile」ボタン(ダウンロードっぽいやつ)を押し、.ovpnファイルをダウンロードします。リージョンはお好きなところを選択してください。

さて、いよいよRaspberry Pi上での設定です。

OpenVPNのインストール OpenVPNのクライアントだけのインストール方法はわからなかったので、サーバーも一緒にインストールしちゃいます。

sudo apt install openvpn -y

OpenVPNのサーバーが起動する設定なので止めます。

sudo systemctl disable openvpn.service

先程ブラウザで入手した.ovpnファイルを/etc/openvpn/client.confとして保存します。 拡張子も変えてしまいます。

OpenVPNのクライアントだけサービス起動するように設定し、起動します。

sudo systemctl enable [email protected]
sudo systemctl start [email protected]

トンネルインターフェイスが作成されます

pi@raspberrypi:~ $ ip addr show tun0
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet 100.96.1.4/28 brd 100.96.1.15 scope global tun0
valid_lft forever preferred_lft forever
inet6 fd:0:0:8100::4/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::a644:7126:6232:c17b/64 scope link stable-privacy
valid_lft forever preferred_lft forever
pi@raspberrypi:~ $

これで、もう一つOpenVPNのクライアントをインストールした環境から接続ができるようになります。

· 約7分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

外出時に自宅のラズパイが気になることありませんか? ブラウザさえあれば、Azure Cloud Shellからアクセスできますので、紹介します。

仕組み

IoT Hub デバイス ストリームの機能を使います。2020/11/1現在プレビュー状態ですが、誰でも試すことが可能です。

Azure IoT Hub デバイス ストリームによって、さまざまな cloud-to-device 通信シナリオのセキュリティで保護された双方向 TCP トンネルの作成が容易になります。 デバイス ストリームは、デバイスとサービス エンドポイント間のプロキシとして機能する、IoT Hub ストリーミング エンドポイントによって仲介されます。

device-stream-proxy-diagram.png

(画像は公式サイトのものです) https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-device-streams-overview

IoT Hubが仲介することで、通常はファイアーウォールに防がれてアクセスできないRaspberry Piに外部からアクセスできるようになります。

環境

デバイス側

Raspberry Pi 3 Raspberry Pi OS (32-bit) Lite 最新版(2020-08-20)

セットアップ

以下の手順で進めます。

  1. Azure IoT Hubの設定
  2. デバイス(Raspberry Pi)側の設定
  3. サービス(Azure Cloud Shell)側の設定

1. Azure IoT Hubの設定

Azure IoT Hubの作成は、Azure Cloud Shellで実行します。

Azure IoT 拡張機能を追加

AzureCloudShell
az extension add --name azure-iot

Azure IoT Hubを作成

無料のSKUで作成します。 デバイスストリームに対応しているリージョンは限られています。

  • 米国中部
  • 米国中部 EUAP
  • 東南アジア
  • 北ヨーロッパ
AzureCloudShell
az iot hub create --name [IoT Hub名] --resource-group [リソースグループ名] --location centralus --sku f1 --partition-count 2

デバイスを作成

Raspberry PiがIoTデバイス扱いとなりますので、IoT Hubにデバイスを作成します。デバイスIDはraspberrypiとしました。

AzureCloudShell
az iot hub device-identity create --hub-name [IoT Hub名] --device-id raspberrypi

接続文字列を取得

接続文字列は2種類必要です。

デバイス(Raspberry Pi)側で使用する接続文字列

AzureCloudShell
az iot hub device-identity connection-string show --hub-name [IoT Hub名] --device-id raspberrypi --output tsv

サービス(Azure Cloud Shell)側で使用する接続文字列

AzureCloudShell
az iot hub connection-string show --policy-name service --hub-name [IoT Hub名] --output tsv

これで、Azure IoT Hubの設定は完了です。

2. デバイス(Raspberry Pi)側の設定

つづけてRaspberry Piの設定です。 OSをインストールした直後の状態から進めたいと思います。

必要なソフトウェアのインストール

RaspberryPi
sudo apt install git cmake libssh-dev libcurl4-openssl-dev uuid-dev -y

デバイス側ソースの取得

パブリックプレビュー用ブランチを使用します。

RaspberryPi
git clone -b public-preview https://github.com/Azure/azure-iot-sdk-c.git
cd azure-iot-sdk-c
git submodule update --init

ソースの修正

azure-iot-sdk-c/iothub_client/samples/iothub_client_c2d_streaming_proxy_sampleにあるiothub_client_c2d_streaming_proxy_sample.cにデバイス側で使用する接続文字列を指定します。(70行目です)

iothub_client_c2d_streaming_proxy_sample.c
static const char* connectionString = "[device connection string]";

makeする

公式ドキュメントではmake -jと書いてありますが、メモリ不足で失敗しますので、-jは外しました。

RaspberryPi
cd ~/azure-iot-sdk-c/
mkdir cmake
cd cmake
cmake ..
make

makeが成功するとazure-iot-sdk-c/cmake/iothub_client/samples/iothub_client_c2d_streaming_proxy_sample/iothub_client_c2d_streaming_proxy_sampleが生成されます

わかり易い場所に移動します。

RaspberryPi
mkdir ~/bin
cp iothub_client/samples/iothub_client_c2d_streaming_proxy_sample/iothub_client_c2d_streaming_proxy_sample ~/bin/

自動起動の設定

serviceファイルを作成します。

iothub_client_c2d_streaming_proxy.service
[Unit]
Description=IoT Hub Client C2D Streaming Proxy
After=network.target

[Service]
ExecStart=/home/pi/bin/iothub_client_c2d_streaming_proxy_sample
WorkingDirectory=/home/pi/bin
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

serviceを有効にして起動します。

RaspberryPi
sudo mv ~/iothub_client_c2d_streaming_proxy.service.service /etc/systemd/system/
sudo systemctl enable iothub_client_c2d_streaming_proxy.service
sudo systemctl start iothub_client_c2d_streaming_proxy.service

デバイス(Raspberry Pi)側の設定は完了です。

3. サービス(Azure Cloud Shell)側の設定

サービス側のサンプルはNode.jsで動作します。Azure Cloud Shellで提供されているNode.jsのバージョンはv8.16.0ですが、v10以上が必要なので、まずはNode.jsをセットアップします。

Node.jsのインストール

AzureCloudShell
wget https://nodejs.org/dist/v10.19.0/node-v10.19.0-linux-x64.tar.gz
mkdir ~/node
tar zxf node-v10.19.0-linux-x64.tar.gz -C ~/node/
cd node
ln -s node-v10.19.0-linux-x64 node
echo 'export PATH=~/node/node/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

サービス側ソースの取得

AzureCloudShell
wget https://github.com/Azure-Samples/azure-iot-samples-node/archive/streams-preview.zip
unzip streams-preview.zip
mv azure-iot-samples-node-streams-preview/iot-hub/Quickstarts ~/

外部ライブラリーの取得

AzureCloudShell
cd ~/Quickstarts/device-streams-service/
npm install azure-iothub@streams-preview
npm install

環境変数の設定

Node.jsのプログラムは環境変数を参照するようですので、必要な情報を環境変数にセットします。 IOTHUB_CONNECTION_STRINGにサービス側で使用する接続文字列をセットします。 ※Azure CLIで取得して設定するように工夫してみました

AzureCloudShell
echo 'export IOTHUB_CONNECTION_STRING="`az iot hub connection-string show --policy-name service --hub-name [IoT Hub名] --output tsv`"'>> ~/.bashrc
echo 'export STREAMING_TARGET_DEVICE=raspberrypi' >> ~/.bashrc
echo 'export PROXY_PORT=2222' >> ~/.bashrc
source ~/.bashrc

これでサービス(Azure Cloud Shell)側の設定は完了です。

接続

準備は整いましたので、実際に接続してみましょう。 デバイス側はもう特に触りませんので、Azure Cloud Shell上で作業します。

AzureCloudShell
cd ~/Quickstarts/device-streams-service/
node proxy.js &
ssh pi@localhost -p 2222

Node.jsのProxyプログラムはフォアグラウンドで動作する仕組みなのでバックグラウンドで動作させます。 localhost(=Azure Cloud Shell)の2222ポートにSSHで接続することで、デバイス側に接続ができます。

Azure Cloud Shellのインスタンスが停止したあとでも、接続の手順を行うとデバイス側に接続できます。

AzureのAndroidアプリからもこの通り。 これでいつでもどこでもRaspberry Piにアクセスできますね。

Screenshot_20201101-205702.png

参考サイト

https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-device-streams-overview https://docs.microsoft.com/ja-jp/azure/iot-hub/quickstart-device-streams-proxy-c https://docs.microsoft.com/ja-jp/azure/iot-hub/quickstart-device-streams-proxy-nodejs

· 約3分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

やってみると意外と簡単。 パスワード入力が不要になるので、やって見る価値はあるかと。

SSHされる側(ホスト側のRaspberry Pi)での設定

SSHサーバーの設定変更

デフォルトでは鍵認証が有効になっていないので、設定を変更します。

RaspberryPi
sudo sed -i 's/#PubkeyAuthentication/PubkeyAuthentication/g' /etc/ssh/sshd_config
sudo sed -i 's/#AuthorizedKeysFile/AuthorizedKeysFile/g' /etc/ssh/sshd_config

sudo systemctl restart sshd.service

SSHで使用する鍵の作成

RaspberryPi
pi@raspberrypi4:~ $ ssh-keygen -t rsa -b 4096 -C "moritalous"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/pi/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/pi/.ssh/id_rsa.
Your public key has been saved in /home/pi/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:xxxxxxxxx
The key's randomart image is:
+---[RSA 4096]----+
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxx|
+----[SHA256]-----+
pi@raspberrypi4:~ $

~/.ssh/にid_rsa(秘密鍵)とid_rsa.pub(公開鍵)が作成されます。

公開鍵の方をauthorized_keysに登録します。

RaspberryPi
cat .ssh/id_rsa.pub >>  ~/.ssh/authorized_keys

SSHする側(クライアント側のmac/Windows)での設定

秘密鍵の配置と権限変更

ホスト側で作成したid_rsa(秘密鍵)を持ってきます。 私は~/.ssh/raspberrypi4/の配下(Windowsの場合は%USERPROFILE%\.ssh\raspberrypi4)に保存しました。

権限変更はmacの場合のみ。Windowsの場合は不要でした。

macのみ
chmod 600 ~/.ssh/raspberrypi4/id_rsa

設定ファイルの作成

macの場合もWindowsの場合も、IdentityFileの指定は同じです。Windowsだからといって%USERPROFILE%と書いたり、エスケープ文字が\(円)になったりしません。

~/.ssh/config
Host raspberrypi4.local
HostName raspberrypi4.local
User pi
IdentityFile ~/.ssh/raspberrypi4/id_rsa

Host raspberrypi3.local
HostName raspberrypi3.local
User pi
IdentityFile ~/.ssh/raspberrypi3/id_rsa

これで、パスワードなしでSSH接続できます。

mac/Windows
$ ssh [email protected]
Linux raspberrypi4 5.4.51-v8+ #1333 SMP PREEMPT Mon Aug 10 16:58:35 BST 2020 aarch64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Sun Oct 18 16:26:01 2020 from 192.168.0.8

pi@raspberrypi4:~ $

VSCodeのSSH接続の拡張機能(Remote - SSH)を使った場合もパスワード無しで、接続されます。 わーい EC2の接続に必要な鍵もこうやって管理すればいいんですね。