トンネルのオープン

セキュアトンネリングを利用して EC2 インスタンスに SSH で接続します。 送信元デバイスでは、2333 ポートを SSH 接続に利用します。

AWS IoT のコンソールで cmd/sectunnel/# にサブスクライブしておきます。

Cloud9 のターミナルで、セキュアトンネリングのための一式が用意されているディレクトリへ移動します。

cd ~/secure-tunneling

以下のコマンドを実行して、トンネルを作成し、listener agent のシャドウに対してトークンをパブリッシュします。

./tunnel-manager.py -e localhost:22 -p 2333 \
	--local-proxy ./localproxy_amzn_x86_64 \
	--region-iot $REGION \
	--region-tun $REGION \
	-t '$aws/things/tunneling-listener-agent/shadow/update' -l 60

コマンドの各パラメータは以下のような意味です。`

  • -e localhost:22 送信先デバイスでトンネルから接続するエンドポイント。この例ではローカルホストのSSHポート。
  • -p 2333 送信元デバイスでトンネルにアクセスする際のポート。
  • --local-proxy ./localproxy_amzn_x86_64 利用する local proxy。tunnel-manager は異なるシステムアーキテクチャやOS上で動作するようPythonで書かれているため。
  • --region-iot $REGION listener agent が接続する AWS リージョン
  • --region-tun $REGION トンネルを作成する AWS リージョン。tunnel-manager では listener agent が接続しているリージョンとは別のリージョンのトンネルを利用することができます。
  • -t '$aws/things/tunneling-listener-agent/shadow/update' tunnel-manager がトークンとエンドポイントを listener agent に対してパブリッシュするトピック
  • -l 60 トンネルの有効期限(分)

“error opening tunnel: An error occurred (ForbiddenException) when calling the Publish operation: The security token included in the request is invalid” のようなエラーが発生した場合、AWS Cloud9 環境で AWS managed temporary credentials を無効化していないのが原因の可能性があります。

When the tunnel manager starts it produces several logging statements. From the loggings you can find the id of the tunnel that has been created. You should find a statement that looks similar to:

tunnel-manager が開始するとログがいくつか表示されます。ログから、作成されたトンネルの ID がわかります。以下のようなログです。

...INFO: tunnel-manager.py:126 - <module>: calling open_tunnel
response: {'tunnelId': '4acbbbce-565e-45e2-8b5e-9841e0ab07a3',...

先ほどのターミナルはそのままにしておき、 別のターミナルから以下のコマンドを実行し、トンネルが作成されたことを確認します。

aws iotsecuretunneling list-tunnels

コマンドの結果を見ると、先ほどの tunnel-manager のログに表示されていたトンネルの ID と同一の ID が見つかるはずです。

{
    "tunnelSummaries": [
        {
            "tunnelId": "4acbbbce-565e-45e2-8b5e-9841e0ab07a3",...

以下のコマンドで tunnel-listener-agent のシャドウを見てみましょう。

aws iot-data get-thing-shadow --thing-name tunneling-listener-agent tunneling-listener-agent-shadow.json

jq '' tunneling-listener-agent-shadow.json

シャドウの Reported に "tunnel start initiated" というステータスが入っているのを確認できます。

また、cmd/sectunnel/# にパブリッシュされたメッセージを見てみましょう。以下のように、送信先デバイスでのトンネルの状態などを確認することができます。

{
  "state": {
    "reported": {
      "tunnels": [
        {
          "pid": 3021,
          "remaining_minutes": 56.166666666666664,
          "status": "running"
        }
      ]
    }
  }
}