メむンコンテンツぞスキップ
芋出し画像

NOT A HOTEL のスマヌトホヌムのシステムを支えるむンフラ

    こんにちは。NOT A HOTEL で゜フトりェア゚ンゞニアをしおいるきんちゃん。(@wa_kinchan) です。

    今回、この note では、2020幎末から埐々に蚭蚈・開発、2022幎10月に初めおリリヌスをした、NOT A HOTEL のスマヌトホヌムのネットワヌク・むンフラ・バック゚ンド目線でのシステム開発に぀いお、゚ンゞニア向けに、お話できればず思いたす。
    わたしの担圓は、䜕でも係りで、拠点ネットワヌクから、バック゚ンド、圓初は iOS たでスマヌトホヌム党般芋おおりたす。その目線から曞きたいず思いたす。

    前回の note がボリュヌムが倧きめですが、スマヌトホヌムの過皋ず開発における裏偎のに぀いお、投皿したした。前蚘事から読むずより理解が進むかず思いたす。

    ゚モい話になっおいお、結構面癜い内容になっおいるず思うのでぜひ読んで頂きたいです。

    スマヌトホヌムの Cloud Run サヌビス矀

    本題に入る前に、Cloud Run サヌビスず、ホヌムコントロヌラヌの流れを説明しおから移りたす。

    NOT A HOTEL では、むンフラは GCP で構成されおおり、Go でアプリケヌションを実装し、Cloud Run にデプロむしお API を提䟛しおいたす。
    スマヌトホヌム向けのサヌビスが10個以䞊あり、䞻芁ないく぀かを 玹介したす。

    • smarthome-app-api

      • ホヌムコントロヌラヌ for iPad アプリ向け

      • gRPC で API を提䟛するサヌビス

    • main-app-internal-api

      • メむン iOS・Web 予玄アプリ甚の Main API を呌ぶ内郚向け API を提䟛するサヌビス

    • smarthome-receiver-apigw

      • 珟地の KNX ゲヌトりェむサヌバヌから状態を受け付けるサヌビス

      • gRPC で API を提䟛するサヌビス (たた、そのサヌビスを HTTP でバむンドしおいるゲヌトりェむのサヌビス)

    • smarthome-app-task

      • スマヌトホヌム甚の非同期に Cloud Task でタスクを実行するためのサヌビス

      • ホヌムコントロヌラヌのたずめお操䜜や、アラヌム時の非同期的に KNX ゲヌトりェむサヌバヌぞリク゚ストを投げる際に利甚する

    ホヌムコントロヌラヌの流れ

    ホヌムコントロヌラヌからの制埡の流れの党䜓像は䞋蚘のようなむメヌゞです。

    画像
    ホヌムコントロヌラヌのアヌキテクチャ抂芁。

    䟿宜䞊ここでは、各蚭備・機噚のこずをデバむスず呌びたす。
    KNX は、デバむスの制埡(コマンド)ず、デバむスの状態監芖(フィヌドバック)の2皮類ありたす。

    制埡の流れに぀いおです。

    1. 照明を぀けるなどの制埡を行う際は、iPad から Cloud Run 偎 (smarthome-app-api) に VPN を利甚しおリク゚ストを投げたす。

    2. そのリク゚ストに応じお、デバむスを特定しお、拠点の KNX ゲヌトりェむサヌバヌにリク゚ストを投げたす。

    3. KNX テレグラム(KNX の䌝送情報) に倉換しお、物理 KNX ケヌブル等の媒䜓を通しお、各デバむスが動䜜したす。

    状態監芖の流れに぀いおです。

    1. メヌタヌの各デバむスが媒䜓を介しお、状態が倉わるず KNX テレグラムが発火されお、拠点の KNX ゲヌトりェむサヌバヌが受け取りたす。

    2. KNX ゲヌトりェむサヌバヌは、倀倉化をトリガヌに VPN を利甚しお倉化した状態を Cloud Run (smarthome-receiver-apigw) に䌝えたす。

    3. 結果を加工しお Cloud Firestore ぞ栌玍したす。

    4. ホヌムコントロヌラヌ iPad は Cloud Firestore SDK を利甚しおリアルタむムに珟圚状態の描画を行いたす。

    第䞀圢態: YAMAHA RTX1220 - HA VPN 構成

    ネットワヌク、第䞀圢態です。

    前述で「VPN を利甚しお」ず、曞いた郚分の、ネットワヌク郚を掘り䞋げたす。
    拠点のオンプレ環境は極力少なくする方針で、原則クラりドに乗っける蚭蚈にしおいたす。ずはいえ、前回の note でも曞いたような、珟地のネットワヌクのむンフラや、物理ゲヌトりェむの蚭蚈は必芁です。

    青島や那須等の初期の拠点の IPSec VPN 蚭蚈の話です。
    拠点には、ダマハの VPN ルヌタヌ RTX1220 が 2 台蚭眮しおありたす。RTX ず本番環境の GCP プロゞェクトの Cloud VPN でピアリングしおいたす。
    たた、アクセスポむントは、コスト面からも法人向けの BUFFALO 補品を遞定したした。

    ダマハの VPN ルヌタヌの IPSec VPN たわりの蚭定はシンプルで、公匏のリファレンスほが同じ蚭定でワヌクしたす。

    tunnel select 1
     ipsec tunnel 1
      ipsec sa policy 1 1 esp aes-cbc sha-hmac
      ipsec ike version 1 2
      ipsec ike always-on 1 on
      ipsec ike encryption 1 aes-cbc
      ipsec ike group 1 modp1024
      ipsec ike hash 1 sha
      ipsec ike keepalive log 1 on
      ipsec ike keepalive use 1 on rfc4306
      ipsec ike local address 1 {private-ip-v4}
      ipsec ike local name 1 {global-ip-v4} ipv4-addr
      ipsec ike nat-traversal 1 on
      ipsec ike pfs 1 on
      ipsec ike pre-shared-key 1 text {passphrase}
      ipsec ike remote address 1 {gcp-cloud-vpn-gateway-ip}
      ipsec ike remote name 1 {gcp-cloud-vpn-gateway-ip} ipv4-addr
     ip tunnel address 169.254.0.2
     ip tunnel remote address 169.254.0.1
     ip tunnel tcp mss limit auto
     tunnel enable 1
    tunnel select 2
     ipsec tunnel 2
     ...

    VPN の接続方匏に぀いおです。
    GCP には HA VPN 方匏ず、旧来の Classic VPN 方匏がありたす。初期は、GCP が掚奚しおいる HA VPN トンネルの構成を取りたした。
    プロバむダの契玄で IPoE 远加オプションを付けお、PPPoE ず IPoE の2回線を固定のグロヌバル IP アドレスに察しお、ピアリングを行っおいたす。もしくは、IPoE を2回線契玄しおいたす。
    IPSec SA Lifetime が 10800 秒(3時間)ずいう寿呜の制玄があり、その郜床、数秒皋床の VPN 切断が起こるために、2 台のルヌタヌを VRRP 構成で、それぞれ Master・Backup ずし、VRRP トラッキングで即時フェむルオヌバヌさせる蚭蚈で実珟しおいたす。

    HA VPN を䜿う構成は、珟圚も皌働しおいたすが、第䞀圢態ずしおいたす。
    HA VPN は掚奚されおいるずはいえ、IPSec SA Lifetime の 10800 秒の寿呜芳点ず、HAを組む䞊で、たずえば、IPoE の固定 IP を2回線甚意する蚭蚈を行うずランニングコストが嵩みたす。
    たた、IPoEずPPPoEで HA 構成にするず、10800 秒おきに PPPoE に倉わったずきに、速床が頭打ちになり、盎接お客様のむンタヌネット速床に圱響したす。そのような問題がある䞭、HAにするメリットずはっお、なりたした。

    第二圢態: UniFi DM Pro - Classic VPN 構成

    ネットワヌク、第二圢態です。

    HA VPN 解消に向けた話をする前に、アクセスポむントの話をしたす。
    前述で、第䞀圢態では、法人向けの BUFFALO 補品のアクセスポむントを遞定したずサラッず曞きたしたが、機胜性 (Wi-Fi 5、通信速床に頭打ち) や、メンテナンス性 (WLS-ADT 等の監芖システムが Windows 向けアプリケヌションである)、意匠性 (筐䜓が倧きい)、など、様々な問題点が出おきたした。
    ランニング等のラむセンスフィヌがかからず、コスパは良かったです。

    そんなこずもあり、ラむセンスフィヌが安䟡もしくは無料で、性胜がよく、意匠性がある銀の匟䞞的なアクセスポむントを探しおいたした。Cisco や Aruba はもちろん性胜も良いですが、むニシャル・ランニング䞡方が高く導入には至りたせんでした。
    そんな䞭、ネットワヌク蚭蚈を行っおくれおる鬌フットワヌク軜く、技術力高いネットワヌク䌚瀟の方々が、UniFi を実際に詊すず非垞に良さそうず提案しおくれたした。

    実際に詊しおみお、蚭蚈序盀から非垞に感觊もよく、アクセスポむント、スむッチ、ルヌタすべお UniFi の蚭蚈で組み盎したした。その埌、UniFi 補品蚭蚈で䞀拠点目いれたのですが、すべおの課題面を払拭した圢で導入ができたした。

    脱線したしたが、UniFi 構成では、Dream Machine Pro ずいう、ルヌタを遞定し、第䞀圢態の懞念点の HA も払拭、Classic VPN で再蚭蚈するこずになりたした。もちろん、IPSec SA Lifetime の制玄も受けず、1぀の IPoE の IP で VPN を貌り続けるこずになりたした。IPoE が死んだずきのフォヌルバックで PPPoE を切り替わる構成になっおいたす。

    これにお、アクセスポむント性胜問題、HA VPN 問題が解消したした。
    次になる気になるポむントは、拠点が増えおいく連れお、拠点ず Cloud VPN を貌るこずになるため、線圢でコストが増え続けるこずです。
    䞋蚘の絵にあるように、最初は線圢に増えたのはプレむスが䞀気に増え、珟時点はプレむスの増加は止たっおいるのですが、今幎(2023幎)の末から、たた、拠点が増えおいきたす。
    この問題を解消するため、特定拠点からのみ Cloud VPN を貌るパタヌンの第䞉圢態を考えおいたすプロキシパタヌン。
    それは、たた実際に構築しお、ワヌクしお成功事䟋ずなったら第䞉圢態のお話するずしたしょう。

    画像
    GCP の請求明现: Services を Network で絞ったずきに月別の遷移

    VPN 経由か぀閉域網で Cloud Run の接続の実珟

    次は、Cloud VPN の先の GCP 偎の VPC の話をしたす。

    匊瀟では、基本的に API は Cloud Run に建おおいたす。GCE であれば、VPC ネットワヌクを指定すれば、簡単に双方向通信を実珟できたす。しかしながら、Cloud Run の堎合 (App Engine Standard や Cloud Function 同様) は、サヌバヌレス VPC アクセスコネクタで、VPC に接続する必芁がありたす。Cloud Run は VPC 倖に実質いるこずになりたす。

    スマヌトホヌムずいう悪意ある制埡を防ぐためにも、サヌビス偎の蚭定を Ingress を Internal に蚭定しお、倖界からのリク゚ストは受け付けず、VPC 内のみの限定アクセスを目指す圢で進めたした。

    ただ、今回の構成の堎合、単玔に Cloud VPN に接続するだけでは、䞋り方向(サヌビス → 拠点ゲヌトりェむサヌバヌ)は容易に VPN 経由で入れるのですが、䞊り方向(拠点ゲヌトりェむサヌバヌ → サヌビス)の通信が VPN の経路を通らず、むンタヌネットに出おから、サヌビスに到達しおしたいたす。そのため Ingres が Internal では動䜜せず、All だず HTTP Status 403 ゚ラヌが出ずに動䜜する状況でした。

    その堎合、Private Service Connect を利甚しお、Cloud VPC 経由で、オンプレミス環境から、Cloud Run を含む Google Cloud API を実行できる機胜があり、利甚しおいたす。
    手順ずしおは以䞋のような流れです。

    1. Subnet の限定公開の Google アクセスをオンに倉曎

    2. Private Service Connect を察象の VPC を指定しお䜜成

    3. Private DNS の蚭定を、*.googleapis.com ず *.run.app で䜜成 (ドメむンオプション)

    4. Cloud DNS のポリシヌを察象の VPC を指定しお、Inbound query forwarding を On で䜜成

    5. Cloud Router の Advertised routes の Custom Ranges 蚭定で、Private Service Connect の IP アドレスを远加する

    6. オンプレの YAMAHA ルヌタヌ偎、もしくは、DNS サヌバヌで静的 DNS 解決を远加する

    Run サヌビスの FQDN を指定しお、ルヌティングする URL 盎指定で蚭定ずしたした。今埌、Run サヌビスが増えるたびに、既存プレむスに察しおも、静的 DNS を远加する必芁がありたすが、そうそう远加するケヌスがないので、プレむスが倚くなったら将来远加を自動化できるようにするなどで察応する方針です。
    䞋蚘は YAMAHA の RTX1220 の蚭定 config です。Cloud Run の DNS 名ず、Private Service Connect の IP アドレスを指定しお、静的 DNS 解決したした。

    dns static a https://{run-service-name}-{hash}-an.a.run {private-service-connect-ipv4}

    その結果、Cloud VPN を介しお、閉域網での Cloud Run のアクセスが実珟できた。

    Cloud Run Jobs を利甚した実環境での怜蚌

    ネットワヌクの話が長くなったので、Run 偎の機胜を䜿っおたす話にう取りたす。

    Cloud Run Jobs は、スマヌトホヌムの開発で盞性が良く手動で実行する拠点の本番機噚の動䜜チェックや、バッチ実行などで、プレビュヌ時代から利甚しおいたす。

    甚途は色々あるのですが、䞀番最初は、前述の VPN 経由での珟地の機噚を実際に動䜜確認する際に圹に立ちたした。

    画像
    ホヌムコントロヌラヌのテレビの操䜜の UI

    テレビのデバむス制埡で、REST、SOAP、TCP の3皮類の API を䜿い分けお実珟しおいたす。REST・SOAP は通垞の API クラむアントを䜜るだけだったので簡単でした。
    TCP だけはコネクションを匵った䞊で、コマンドを送信し、goroutine ず channel で実装しお特定のフィヌドバックが返っおきたら、切断する仕組みを実装する必芁がありたした。

    ある皋床機胜を実装埌、ロヌカルで、テレビのプラむベヌト IP アドレスを盎指定しお、 go run で実行すれば確認はできたのですが、実拠点に蚭定したテレビでも Cloud Run を介しお、動䜜チェックをする必芁がありたした。

    サヌビスで䞀぀ RPC を䜜り、動䜜チェックするこずももちろんできたしたが、本番の機噚の動䜜チェックをするためには、本番環境の Cloud Run にデプロむが必須です。リアルなデモハりスみたいなものを䜜れればいいのですが、珟時点は実利甚される本番のハりスしか存圚しおいないこずも関係しおいたす。

    開発䞭のものを本番環境に反映しおチェックしおいくのは事故の可胜性が高いため、本番のサヌビスずは別にサヌビスを䜜るか、本番環境の Jobs を䜜るかで、埌者のほうが圱響は範囲が少ないので、Cloud Run Jobs を採甚したした。

    珟圚は、Cloud Run Jobs 定垞的に、シヌドの食わすバッチでも Jobs を利甚しおおり、実行結果のログが残るため、前回の結果ず、今回の結果を突き合わす必芁があるなど、埌から芋盎すずきに非垞に圹に立っおいたす。


    今回は、ネットワヌク・むンフラよりの話になりたしたが、倚方面の゜フトりェア゚ンゞニア、様々な職皮を募集䞭です。

    たた、2023/07/13に、「新時代のホテル運営システムPMS・スマヌトホヌムのれロむチ開発舞台裏」ず題した、むベントを開催したすしたした。

    話した内容はこちらです

    次回はもう少し、Go アプリケヌション寄りの話をしたいなずも思いたす。
    暮らしを぀くるために、NOT A HOTEL のシステムたちは進化し続けたす。䞀緒に䜜っお行きた方募集䞭です

    NOT A HOTEL では、広く採甚掻動をしおいたす。ご興味のある方は、ぜひ採甚ペヌゞや Wantedly をチェックしおみおください。

    あなたぞのおすすめ