AWSDeepRacer Vehicle をハイブリッドインスタンスにしてリモートから~遊~操作してみた

AWS Systems Manager を経由して、AWSDeepRacer Vehicle をハイブリッドインスタンスにしてリモートから操作してみました
2022.06.13

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

AWSDeepRacer 車両 って単体だとカメラが付いた賢いラジコンです。 (※なんとなく、AWSDeepRacer Vehicle の方がかっこいいんですが、AWSDeepRacer 車両 または車両で呼称します。)

ローカルのWifiネットワークに接続するように設定して、HTTPSでブラウザから車両に接続して、操作します。

AWSDeepRacer 車両のOSはUbuntuです。

ん?

感のいい人はお気づきだと思いますがAWSにはオンプレミスのインスタンスをハイブリッドインスタンスとして管理できるサービス AWS Systems Manager があります。

AWS Systems Manager

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-managedinstances.html

ということで、AWS Systems Manager の機能(ポートフォワード)を使用して、DeepRacer車両の操作コンソールにアクセスしてみます!

図にすると以下のようになります

構成図

やってみた

AWS DeepRacer 車両設定

Wifi 接続設定

まずは、ローカルのWifiに接続します。

公式ドキュメントでは車両とPCをUSB-C ケーブルで接続するような案内があるのですが、ケーブル無しでWifiをセットアップできます。(以前はこの方法が基本だったと思うのですが更新されたようです)

公式ドキュメントに沿う場合は以下をご参考ください

https://docs.aws.amazon.com/ja_jp/deepracer/latest/developerguide/deepracer-set-up-vehicle.html

USBメモリーを準備して、以下のwifi-creds.txtファイルをドライブ直下に保存します。

ファイル名:wifi-creds.txt

ssid: ローカルのWifiのSSIDを入力します。必要に応じて(空白などが含まれる場合)シングルクォーテーションで囲んでください

password: Wifi パスワードを入力します。

###################################################################################
#                                   AWS DeepRacer                                 # 
# File name: wifi-creds.txt                                                       #
#                                                                                 #  
# ...                                                                             #
###################################################################################

# Provide your SSID and password below
ssid: local-wifi-hoge
password: hogefuga

USBを AWSDeepRacer 車両 に挿入して、電源をいれます

車両の LED インジケータ(右側)が オフブルー点滅 → ブルー点灯

となればWifi 接続は完了です。

参考 AWS DeepRacer 車両の LED インジケータ
https://docs.aws.amazon.com/ja_jp/deepracer/latest/developerguide/deepracer-vehicle-led-indicators.html#deepracer-vehicle-led-indicators-system

USBメモリーを車両から外して、USBメモリーを確認するとdevice-status.txtができていますので

中身を確認してください。

Hostname: amss-xxxx
Timestamp: 06/11/22 01:38:02
Connected to WiFi network: local-wifi-hoge
Active connections:
  usb0: 10.0.0.1
  usb1: 10.0.1.1
  mlan0: 192.168.XXX.XXX

Hostname : 車両のIDです。車両底面に書かれているものと同じです

usb0, usb1: USB経由でアクセスする際のアドレスです。

mlan0: Wifiで取得したIPになります

IPアドレス(mlan0の値)が記載されているのでそちらの同じWifiネットワークよりブラウザからIPアドレスにアクセスしてみてください。

https://IPアドレス

パスワードは車両の底面に記載されています

パスワードを入力しログインします。

AWS DeepRacer 車両のSSHの有効化

車両のコンソールにログインしたあと左のメニューからSettingsを選択します

Device SSH の項目から Editを選択します

Enabledを選択します

続いて接続する際のパスワードの設定を実施してください。

SSH接続

以下の設定でSSH接続を行います。

IPアドレス: Wifi 接続設定で取得したIP

username : deepracer

password: 車両のSSHの有効化で設定したパスワード

正常にSSHでログインできると以下のようなログが表示されるかと思います。

Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 4.15.0-1005-deeplens x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

 * Introducing self-healing high availability clusters in MicroK8s.
   Simple, hardened, Kubernetes for production, from RaspberryPi to DC.

     https://microk8s.io/high-availability

294 updates can be installed immediately.
121 of these updates are security updates.
To see these additional updates run: apt list --upgradable

Your Hardware Enablement Stack (HWE) is supported until April 2025.

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

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

deepracer@amss-xxxx:~$

ここまでくれば、あとは通常のUbuntu インスタンスと同じ手順となるます。

AWS Systems Manager でハイブリットインスタンスに設定する

AWSコンソールにログインします。

CloudFormationを使ってSystems Managerのアクティベーションを一撃で準備をしてしまいましょう

詳しくはこちらのエントリーをご参考ください

オンプレミスのUbuntuをCloudFomation一撃でAWS Systems Managerに登録してみた

Systems Manager のアクティベーションコード、またアクティベーションIDが取得できたらDeepRacer 車両に接続し以下のコマンドを実行します。

Ubuntu でSnapを使用してSSMエージェントをインストールする手順になります

sudo snap install amazon-ssm-agent --classic
sudo systemctl stop snap.amazon-ssm-agent.amazon-ssm-agent.service
sudo /snap/amazon-ssm-agent/current/amazon-ssm-agent -register -code "activation-code" -id "activation-id" -region "region" 
sudo systemctl start snap.amazon-ssm-agent.amazon-ssm-agent.service

実行履歴

$ sudo snap install amazon-ssm-agent --classic
$ amazon-ssm-agent 3.1.1188.0 from Amazon Web Services (aws✓) installed
$ sudo /snap/amazon-ssm-agent/current/amazon-ssm-agent -register -code "hoge" -id "fuga" -region "ap-northeast-1" 
Error occurred fetching the seelog config file path:  open /etc/amazon/ssm/seelog.xml: no such file or directory
Initializing new seelog logger
New Seelog Logger Creation Complete
2022-06-12 03:11:46 WARN Error adding the directory '/etc/amazon/ssm' to watcher: no such file or directory
2022-06-12 03:11:47 WARN Could not read InstanceFingerprint file: InstanceFingerprint does not exist.
2022-06-12 03:11:47 INFO No initial fingerprint detected, generating fingerprint file...
2022-06-12 03:11:47 INFO Successfully registered the instance with AWS SSM using Managed instance-id: mi-xxxxxxxx

フリートマネージャーのコンソールでマネージドインスタンスとして登録されているか確認してください

この段階でSSMのセッションマネージャーからセッション接続ができますので、車両側のSSHは無効にしても問題ありません

フリートマネージャー 経由で接続する

フリートマネージャー経由で、DeepRacer 車両のコンソールに接続してみます

高度なインスタンス枠に設定する

HTTPSの転送を行うにはセッションマネージャーを使用する必要があります。

また、ハイブリッドインスタンスを操作するにはスタンダード枠から、高度なインスタンス枠に変更をする必要があります。

フリートマネージャーの設定よりアカウント設定の変更をクリックします

高度なインスタンスに変更します。

※高度なインスタンス枠を使用する場合は、使用時間毎に従量課金がかかりますので、ご注意ください。

高度なインスタンス枠を使用するようにできたら、いちどDeepRacer 車両のコンソールにアクセスしてみます。

対象のインスタンスを選択し、ノードアクションよりターミナルセッションを開始するを選択してください。

セッションに接続できれば、設定登録、ネットワーク環境のセットアップなどは正常に行えているかと思います。

AWS Systems Manager フリートマネージャー でポートフォワードを行う

車両のHTTPS(443)をローカルのマシンの10443にポートフォワードします。

targetのmi-xxxxxxxx の部分を実際のハイブリッドインスタンスのIDに変更してください

Linux等

aws ssm start-session --target mi-xxxxxxxx \
  --document-name AWS-StartPortForwardingSession \
  --parameters '{"portNumber":["443"],"localPortNumber":["10443"]}'

Windows コマンドプロンプト

aws ssm start-session --target mi-xxxxxxx \
  --document-name AWS-StartPortForwardingSession \
  --parameters "{\"portNumber\":[\"443\"],\"localPortNumber\":[\"10443\"]}"

実行結果

Starting session with SessionId: botocore-session-xxxx-xxxx
Port 10443 opened for sessionId botocore-session-xxxx-xxxx.
Waiting for connections...

正常に実施できていれば、ブラウザ等でローカルポートに接続します

https://localhost:10443/

にアクセスしログインの画面が表示されると成功です!!!

まとめ

AWSのネットワークを経由して、AWSDeepRacer 車両のコンソールにアクセスするとができました。

正直実際に遊ぶ 操作するにはネットワーク経路など直接アクセスに比べるとレスポンスが悪いところがあります。

とはいえ、コースを用意する、車両を用意するのは場所の問題もあり結構大変なんですが、受け入れ側の準備ができてしまえば、基本的にはIAMの権限を払い出すだけでDeepRacer 車両でリモートで遊べちゃう未来が見えた気がします。

参考

https://dev.classmethod.jp/articles/ssm-session-manage-port-forwarding/