
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çš®é¡ãããŸãã
å¶åŸ¡ã®æµãã«ã€ããŠã§ãã
ç §æãã€ãããªã©ã®å¶åŸ¡ãè¡ãéã¯ãiPad ãã Cloud Run åŽ (smarthome-app-api) ã« VPN ãå©çšããŠãªã¯ãšã¹ããæããŸãã
ãã®ãªã¯ãšã¹ãã«å¿ããŠãããã€ã¹ãç¹å®ããŠãæ ç¹ã® KNX ã²ãŒããŠã§ã€ãµãŒããŒã«ãªã¯ãšã¹ããæããŸãã
KNX ãã¬ã°ã©ã (KNX ã®äŒéæ å ±) ã«å€æããŠãç©ç KNX ã±ãŒãã«çã®åªäœãéããŠãåããã€ã¹ãåäœããŸãã
ç¶æ ç£èŠã®æµãã«ã€ããŠã§ãã
ã¡ãŒã¿ãŒã®åããã€ã¹ãåªäœãä»ããŠãç¶æ ãå€ãããš KNX ãã¬ã°ã©ã ãçºç«ãããŠãæ ç¹ã® KNX ã²ãŒããŠã§ã€ãµãŒããŒãåãåããŸãã
KNX ã²ãŒããŠã§ã€ãµãŒããŒã¯ãå€å€åãããªã¬ãŒã« VPN ãå©çšããŠå€åããç¶æ ã Cloud Run (smarthome-receiver-apigw) ã«äŒããŸãã
çµæãå å·¥ã㊠Cloud Firestore ãžæ ŒçŽããŸãã
ããŒã ã³ã³ãããŒã©ãŒ 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 ã貌ããã¿ãŒã³ã®ç¬¬äžåœ¢æ
ãèããŠããŸãïŒãããã·ãã¿ãŒã³ïŒã
ããã¯ããŸãå®éã«æ§ç¯ããŠãã¯ãŒã¯ããŠæåäºäŸãšãªã£ãã第äžåœ¢æ
ã®ã話ãããšããŸãããã

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 ãå®è¡ã§ããæ©èœããããå©çšããŠããŸãã
æé ãšããŠã¯ä»¥äžã®ãããªæµãã§ãã
Subnet ã®éå®å ¬éã® Google ã¢ã¯ã»ã¹ããªã³ã«å€æŽ
Private Service Connect ã察象㮠VPC ãæå®ããŠäœæ
Private DNS ã®èšå®ãã*.googleapis.com ãš *.run.app ã§äœæ (ãã¡ã€ã³ãªãã·ã§ã³)
Cloud DNS ã®ããªã·ãŒã察象㮠VPC ãæå®ããŠãInbound query forwarding ã On ã§äœæ
Cloud Router ã® Advertised routes ã® Custom Ranges èšå®ã§ãPrivate Service Connect ã® IP ã¢ãã¬ã¹ã远å ãã
ãªã³ãã¬ã® 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 çµç±ã§ã®çŸå°ã®æ©åšãå®éã«åäœç¢ºèªããéã«åœ¹ã«ç«ã¡ãŸããã

ãã¬ãã®ããã€ã¹å¶åŸ¡ã§ã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 ããã§ãã¯ããŠã¿ãŠãã ããã