SORACOM ArcとSORACOM Napter でDockerコンテナと通信してみる #SORACOM #docker #IoT

目次

前提

2021年に発表された SORACOM Arc(以下、Arc) を利用すると、SORACOM Air を利用した通信回線を利用していなくてもWi-Fi 経由でもSORACOMプラットフォームに接続できるようになります。

blog.soracom.com

users.soracom.io

これは、SORACOMプラットフォームを利用して開発したことある人はわかると思うのですが、手軽にSORACOMプラットフォームにアクセスできるのはめちゃくちゃありがたいです。

さらに Arc はバーチャル SIM(以下、vSIM) として扱われるため、SORACOM Napter(以下、Napter) を利用してリモートアクセスを行えます。

users.soracom.io

users.soracom.io

例えば、SORACOMプラットフォームとしか通信できない環境でもリモートアクセスできます。 安定のクラスメソッドさんのBlogでも紹介されてますね。

dev.classmethod.jp

というわけで、Arc+Napterはいろいろ試してみたいので、今回はArcをDockerコンテナ側に設定してNapterでアクセスしてみたいと思います。

準備

Docker の準備とSORACOM側の準備が必要です。普段使っている人は読み飛ばしてください。

Docker

Docker コンテナ側はubuntu 20.04 (Tag: focal)を利用しました。

hub.docker.com

インストールしたのは、もちろん必須の WireGuard

www.wireguard.com

www.wireguard.com

あと、接続確認にPythonを利用したので、Pythonが動作する環境を設定しています。 ホスト側はMacで、Rancher DesktopをインストールしてDockerを実行しています。

rancherdesktop.io

SORACOM Arc

SORACOMのサービスはドキュメントがとてもよく書かれているので、ドキュメントに沿って設定を行います

users.soracom.io

vSIM 発行時にWireGuardの設定に必要な情報が確認できますので、メモするなどしておいてください。

試してみる

Docker コンテナを起動して、vSiM発行時にメモした情報をWireGuardの設定ファイル /etc/wireguard/wg0.conf に記載します。 こちらもArc のドキュメントに記載があるので内容を確認してください。

users.soracom.io

あとは、Docker コンテナ側でWireGuardを起動して、SORACOMプラットフォームへの接続を確認します。

$ docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED              STATUS              PORTS     NAMES
c4c4884529f0   dev-garden   "/bin/sh -c 'echo Co…"   About a minute ago   Up About a minute             dev-garden

$ wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.248.37.231/32 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] ip -4 route add 100.127.0.0/16 dev wg0
[#] ip -4 route add 10.128.0.0/9 dev wg0

$ ping pong.soracom.io
PING pong.soracom.io (100.127.100.127) 56(84) bytes of data.
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=1 ttl=64 time=10.9 ms
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=2 ttl=64 time=11.5 ms
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=3 ttl=64 time=10.9 ms
^Z
[1]+  Stopped                 ping pong.soracom.io

今回は接続確認するためにいろいろ設定するのが面倒だったので Dockerコンテナ側で、HTTPサーバーを立ち上げてNapterはこのHTTPサーバにアクセスしてみることにします。 HTTPサーバーも接続確認できるだけでいいので、Pythonのいつものやつで済ませます。

$ python -m http.server 8088
Serving HTTP on 0.0.0.0 port 8088 (http://0.0.0.0:8088/) ...
127.0.0.1 - - [18/Jun/2022 08:07:53] "GET / HTTP/1.1" 200 -

SORACOM Napter

これでローカルからDockerコンテナへの接続が確認できたので、続いてSORACOMユーザーコンソールからNapterの設定を行います。

users.soracom.io

バイスのポートはこのHTTPサーバーのポートを指定してください。今回は8088を使用しました。

払い出されたURLにブラウザでアクセスして、ローカルからアクセスしたものと同じ画面が見えれば成功です。 Dockerコンテナ側のターミナルにもアクセスログが出ているのを確認できるかと思います。

python -m http.server 8088
Serving HTTP on 0.0.0.0 port 8088 (http://0.0.0.0:8088/) ...
127.0.0.1 - - [18/Jun/2022 08:07:53] "GET / HTTP/1.1" 200 -
100.127.10.17 - - [18/Jun/2022 08:08:06] "GET / HTTP/1.1" 200 -
100.127.10.17 - - [18/Jun/2022 08:08:06] code 404, message File not found
100.127.10.17 - - [18/Jun/2022 08:08:06] "GET /favicon.ico HTTP/1.1" 404 -
100.127.10.17 - - [18/Jun/2022 08:08:35] "GET /Dockerfile HTTP/1.1" 200 -
100.127.10.17 - - [18/Jun/2022 08:08:41] "GET /memo.json HTTP/1.1" 200 -
100.127.10.17 - - [18/Jun/2022 08:08:58] "GET /README.md HTTP/1.1" 200 -
^Z
[2]+  Stopped                 python -m http.server 8088

Napter で接続できない時

Napterで接続できない時は、まずはNapter側の設定を再確認してください。 デバイス側ポートアクセス元IPアドレスレンジ など意図したものかどうか。

また、有償となりますが Napter 監査ログ を利用すると、接続の詳細を確認できます。

users.soracom.io

今回ちょっとハマったのが

  • Dockerコンテナ側からSORACOMへのPingは普通に通る
  • SORACOMユーザーコンソールからNapterを設定して、アクセスするとタイムアウトしてアクセスできない
  • なぜかDockerコンテナ側でSORACOMへPingしている間は、Napterでのアクセスも通る
  • 調べてみたらWireGuardの設定が足りなさそう

    www.wireguard.com

  • NAT越しの通信の場合は PersistentKeepalive の設定をしないとダメらしい

  • Arc のドキュメントにも記載がある

    users.soracom.io

  • 毎回書いている気がするが、ドキュメント特に公式のものをよく読んだ方が解決までが早いと思った

  • 同様の症状で悩んでる場合はドキュメントを確認してPersistentKeepalive の設定を追加してみてください

まとめ

  • SORACOM ArcとSORACOM Napter を利用してDockerコンテナにアクセスできた
  • ユースケースを考えると、Dockerで開発している画面を一時的に外部の人に見せるとかでワンチャン!
  • ngrok ほど自由はないけど時間制限やCIDRでの制限はかけられるので使えるかも? ngrok.com
  • Dockerコンテナ側は、WireGuardの設定と起動だけなので /etc/wireguard/wg0.conf をコンテナ作成するタイミングでコピーしても良さそう
  • ArcとNapterの組み合わせはいろいろ試せそうなので、今後も何かあれば試して書き留めようと思った
  • Wi-Fiで普通にSORACOMプラットフォームにアクセスできるのは本当に便利で助かる
  • SORACOMプラットフォームは従量課金なので、利用する前に料金の確認を忘れずに

以上になります。