ポートの設定
.ironflock/ディレクトリにport-template.ymlファイルを作成して、アプリがリモートアクセス用に公開するサービスを定義します。
基本的な例
ports:
- name: Web Interface
port: 5000
main: true
protocol: httpsこれによりポート5000がリモートアクセス可能になります。本番デバイスにアプリをインストールするとそのトンネルがオンになり、ネットワーク権限を持つユーザーはデバイス上のアプリ設定からトンネルをオフにしたり、再びオンにしたりできます。
完全な例
ports:
- name: Web Interface
port: 1100
main: true
protocol: http
- name: Video Stream
port: 1200
protocol: http
- name: Remote Desktop
port: 5900
protocol: tcp
- name: LoRaWAN Gateway
port: 1700
protocol: udpフィールドリファレンス
| フィールド | 必須 | 説明 |
|---|---|---|
name | はい | デバイスのアプリ設定に表示されるラベル |
port | はい | サービスがリッスンするローカルポート番号 |
main | いいえ | trueの場合、デバイスのアプリ一覧のクイックアクセスアイコンにこのポートが使用されます |
protocol | いいえ | http(デフォルト)、https、tcp、またはudp |
remote_port_environment | いいえ | TCPとUDPのみ:REMOTE_PORT_FOR_<port>に加えて、デバイスエージェントがトンネルのリモートポートを通知する追加の変数名。0.19.8より前のデバイスエージェントは、この名前でのみ通知します |
注入される環境変数
宣言した各ポートに対して、プラットフォームはアプリのコンテナに環境変数を注入します。これにより、アドレスをハードコーディングすることなく、サービスが実際に到達可能な場所をコードから検出できます:
| 変数 | 説明 |
|---|---|
DEVICE_LAN_IP | ローカルネットワーク上でのデバイスのIPアドレス |
DEVICE_PORT_FOR_<port> | 宣言したポートがローカルネットワークに公開されるデバイス上のポート |
REMOTE_PORT_FOR_<port> | トンネルがアクティブな間にトンネルサーバーによって割り当てられるパブリックポート(TCPとUDP。デバイスエージェント0.19.8以降)。0はまだ割り当てられていないことを意味します |
REMOTE_PORT_FOR_<port>_CLOUD | クラウド経由でトンネルを転送するIronFlockインスタンス上でデバイスが稼働している場合の、インターネット側のポート(TCPとUDP) |
TUNNEL_DOMAIN | デバイスのトンネルURLの組み立てに使われるドメイン:クラウドではapp.ironflock.com、オンプレミスアプライアンスではアプライアンスのドメイン、ドメインなしでインストールされたアプライアンス(プレーンモード)のエッジデバイスではlocalhost |
INSTANCE_KEY | オンプレミスアプライアンス(インスタンス)に属するデバイスでのみ設定されます:そのデバイスのクラウド経由で転送されるトンネルURLに含まれるキー |
<port>はport-template.ymlで宣言したポート番号です。上記のリモートデスクトップの例では、アプリはDEVICE_PORT_FOR_5900を受け取り、トンネルがアクティブな間はREMOTE_PORT_FOR_5900も受け取ります。IronFlock SDKは、getRemoteAccessUrlForPortでこれらの変数からポートのリモートアクセスURLを組み立てます。プラットフォームはCLOUD_TUNNEL_DOMAINを設定しません:アプリがこの変数を自ら設定しない限り、クラウド経由で転送されるURLはapp.ironflock.comを使用します。
トンネルは本番インストールにのみ存在します。開発(DEV)コンテナには、独自のトンネルもリモートポートもありません — 代わりにデバイスのローカルネットワーク上でアクセスしてください(DEVICE_LAN_IP、DEVICE_PORT_FOR_<port>)。
複数のアプリが同じデバイス上で同時に実行される可能性があるため、宣言されたポートは自動的にデバイス上の空きポートにマッピングされます。宣言したポート番号をそのまま前提とせず、必ず注入された値からローカルネットワークのアドレスを組み立ててください:
import os
lan_ip = os.environ.get("DEVICE_LAN_IP")
lan_port = os.environ.get("DEVICE_PORT_FOR_5900")
# サービスはローカルネットワーク上の {lan_ip}:{lan_port} で到達可能ですこれらの変数はコンテナの起動時に設定されます。トンネルポートはアプリの実行中に変わることがあるため(例えばトンネルが再接続した場合)、トンネルポートの変数(REMOTE_PORT_FOR_<port>、それに対応する_CLOUD変数、およびカスタムのremote_port_environment名)は、/data/env/<VARIABLE_NAME>.txtのファイルとしても常に最新の状態に保たれます。IronFlock SDKはこれらのファイルを自動的に読み取ります。その他の変数が変わるのは、コンテナの再起動時だけです。
クラウドポートがなくなると(クラウド転送がオフになった場合)、デバイスエージェントは_CLOUDファイルを削除します。したがって、エージェントのファイルが存在する間は、_CLOUDファイルが存在しないか空であることはクラウドポートがないことを意味し、SDKはコンテナの起動時の古い値にフォールバックしません。
エージェントは/data/envをrootだけが読み取れるようにしています。別のユーザーとして実行されるコンテナはこれらのファイルを読み取れません:参照できるのは起動時の値だけで、その後に変わったトンネルポートは反映されず、SDKは警告を1回ログに記録します。
プロトコルの動作
HTTP / HTTPS
Webベースのサービス向けです。IronFlockはデバイスのローカルポートにトラフィックをプロキシする、トンネルドメイン上のURLを作成します。ユーザーはブラウザでURLを開きます。このURLはプライベートで、ポートをPublicに切り替えない限り、IronFlockにサインインしていてデバイスへのアクセス権を持つユーザーだけが開けます。
TCP
VNC(リモートデスクトップ)やダイレクトソケット接続などのプロトコル向けです。IronFlockはトンネルサーバー上にリモートポートを割り当て、REMOTE_PORT_FOR_<port>としてアプリに公開します。サービスにはtcp://<TUNNEL_DOMAIN>:<remote port>で到達できます。
UDP
LoRaWAN通信やVPNトンネルなどのプロトコル向けです。TCPと同様に、リモートポートが割り当てられ、REMOTE_PORT_FOR_<port>として公開されます。
ボードへの埋め込み
埋め込みウィジェットを使用して、デバイスのリモートアクセストンネルをボードに直接埋め込むことができます。これにより、ユーザーはシームレスな体験を得られます:
- すべてのデバイスからのグローバルデータを監視
- 埋め込まれたWeb UIを通じて個々のデバイスと対話
すべてを同じダッシュボード内で行えます。
本番デバイスにアプリをインストールすると、その
port-template.ymlにあるすべてのポートのトンネルがオンになります。HTTPとHTTPSのトンネルはプライベートのままで、ポートをPublicに切り替えない限り、IronFlockにサインインしていてデバイスへのアクセス権を持つユーザーだけが開けます。TCPとUDPのトンネルはトンネルサーバー上のポートをそのまま公開するもので、前段にログインがないため、アプリ自身がクライアントを認証する必要があります。デバイスに対するネットワーク権限を持つユーザーは、トンネルをオフにしたり、再びオンにしたりできます。トンネルの管理を参照してください。