ãã®ããã«ã1ã€ã®APIã䜿çšãããŸããããã¯ãã²ãŒããŠã§ã€APIãä»ããŠããŒãããŒã«çºè¡ããå¿ èŠããããŸãã ãã®åé¡ã解決ããŸããã ãã®èšäºã§ã¯è©³çŽ°ã説æããŸãã
æå®ïŒãŠãŒã¶ãŒã®ç»é²ãæ å ±ã®åä¿¡ãªã©ãè¡ãã€ã³ã¿ãŒãã§ãŒã¹ãåãããšã³ã·ã¹ãã ããã³APIããŒã¿ã« 䟿å©ã§ä¿¡é Œã§ããAPI Gatewayãäœæããå¿ èŠããããŸãã ãã®éçšã§ãæäŸããå¿ èŠããããŸãã
- ç»é²
- APIæ¥ç¶å¶åŸ¡
- ãŠãŒã¶ãŒããšã³ãã·ã¹ãã ã䜿çšããæ¹æ³ãç£èŠãã
- ããžãã¹ææšã®äŒèšã
![](https://habrastorage.org/webt/op/f3/aa/opf3aadequfubwpkiu4gci8j9nm.png)
ãã®èšäºã§ã¯ãGateway APIãäœæããçµéšã«ã€ããŠèª¬æãããã®éã«æ¬¡ã®ã¿ã¹ã¯ã解決ããŸããã
- ãŠãŒã¶ãŒèªèšŒ
- ãŠãŒã¶ãŒèªèšŒ
- å ã®ãªã¯ãšã¹ãã®å€æŽã
- ãããã·ãèŠæ±ãã
- å¿çã®åŸåŠçã
API管çã«ã¯2ã€ã®ã¿ã€ãããããŸãã
1.æšæºã次ã®ããã«æ©èœããŸãã æ¥ç¶ããåã«ããŠãŒã¶ãŒã¯å¯èœæ§ããã¹ãããæ¯æããããŠèªåã®ãµã€ãã«åã蟌ã¿ãŸãã ã»ãšãã©ã®å Žåãäžå°äŒæ¥ã§äœ¿çšãããŸãã
2.倧èŠæš¡ãªB2B API管çã¯ãäŒæ¥ãæåã«æ¥ç¶ã«é¢ããããžãã¹äžã®æ±ºå®ãäžãããšãã«ãå¥çŽäžã®çŸ©åãæã€ããŒãããŒäŒæ¥ã«ãªããAPIã«æ¥ç¶ããŸãã ãããŠããã¹ãŠã®æç¶ããæžãŸããåŸãäŒç€Ÿã¯ãã¹ãã¢ã¯ã»ã¹ãåãåãããã¹ãã«åæ ŒããŠè£œåã«è¡ããŸãã ããããããã¯ç®¡çè ãæ¥ç¶ãããšãã決å®ãªãã«ã¯äžå¯èœã§ãã
![](https://habrastorage.org/webt/go/qv/oi/goqvoiroiq0yknutwbn9hrt7abe.jpeg)
ç§ãã¡ã®æ±ºå®
ãã®ããŒãã§ã¯ãGateway APIã®äœæã«ã€ããŠèª¬æããŸãã
APIãžã®äœæãããã²ãŒããŠã§ã€ã®ãšã³ããŠãŒã¶ãŒã¯ãã客æ§ã®ããŒãããŒã§ãã ããããã«ã€ããŠããã§ã«å¿ èŠãªå¥çŽããããŸãã ã²ãŒããŠã§ã€ãžã®èš±å¯ãããã¢ã¯ã»ã¹ã«æ³šæããŠãæ©èœãæ¡åŒµããã ãã§ãã ãããã£ãŠãå¶åŸ¡ãããæ¥ç¶ããã³å¶åŸ¡ããã»ã¹ãå¿ èŠã§ãã
ãã¡ãããAPI Managementã¿ã¹ã¯ã解決ããç¹ã«API Gatewayãäœæããããã®æ¢è£œã®ãœãªã¥ãŒã·ã§ã³ãå©çšããããšãã§ããŸããã ããšãã°ãããã¯Azure API Managementã«ãªããŸãã ç§ãã¡ã®å ŽåãAPIããŒã¿ã«ãšãã®åšãã«æ§ç¯ããã巚倧ãªãšã³ã·ã¹ãã ããã§ã«ãã£ããããç§ãã¡ã«ã¯é©ããŠããŸããã§ããã ãã¹ãŠã®ãŠãŒã¶ãŒã¯ãã§ã«ç»é²ãããŠãããå¿ èŠãªæ å ±ãååŸã§ããå Žæãšæ¹æ³ããã§ã«ç解ããŠããŸãã å¿ èŠãªã€ã³ã¿ãŒãã§ãŒã¹ã¯APIããŒã¿ã«ã«ãã§ã«ååšããŠãããAPIã²ãŒããŠã§ã€ãå¿ èŠã§ããã å®éãç§ãã¡ã¯ãã®éçºã«åãçµãã§ããŸãã
ã²ãŒããŠã§ã€APIãšåŒã°ãããã®ã¯ãäžçš®ã®ãããã·ã§ãã ããã§ããéžæè¢ããããŸããããããã·ãäœæããããæ¢è£œã®ãã®ãéžæã§ããŸãã ãã®å Žåã2çªç®ã®æ¹æ³ã§nginx + Luaãã³ãã«ãéžæããŸããã ãªãã§ïŒ ã¹ã±ãŒãªã³ã°ããµããŒãããä¿¡é Œã§ãããã¹ãæžã¿ã®ãœãããŠã§ã¢ãå¿ èŠã§ããã å®è£ åŸãããžãã¹ããžãã¯ã®æ£ç¢ºæ§ãšãããã·ã®æ£ç¢ºæ§ã確èªããå¿ èŠã¯ãããŸããã§ããã
WebãµãŒããŒã«ã¯ããªã¯ãšã¹ãåŠçãã€ãã©ã€ã³ããããŸãã nginxã®å Žåã次ã®ããã«ãªããŸãã
![](https://habrastorage.org/webt/7p/bu/9y/7pbu9y7z9ier1gtfhmu5pccawlu.png)
ïŒ GitHub Lua Nginxã®å³ïŒ
ç§ãã¡ã®ç®æšã¯ãå ã®ãªã¯ãšã¹ããå€æŽã§ããç¬éã«ãã®ãã€ãã©ã€ã³ã«çµ±åããããšã§ããã
ééãããã·ãäœæããŠãèŠæ±ãæ©èœããããã«æ©èœããŸãã æçµçãªAPIãžã®ã¢ã¯ã»ã¹ã®ã¿ãå¶åŸ¡ããèŠæ±ãžã®ã¢ã¯ã»ã¹ãæ¯æŽããŸãã ãªã¯ãšã¹ããæ£ãããªãã£ãå ŽåãæçµçãªAPIã«ã¯ãšã©ãŒã衚瀺ãããŸããã衚瀺ãããŸããã ãªã¯ãšã¹ããæåŠã§ããå¯äžã®çç±ã¯ãã¯ã©ã€ã¢ã³ããžã®ã¢ã¯ã»ã¹æš©ããªãããã§ãã
nginxã®å Žåã æ¡åŒµæ©èœã¯Luaã«ãã§ã«ååšããŸã ã Luaã¯ã¹ã¯ãªããèšèªã§ãããéåžžã«è»œéã§ç¿åŸã容æã§ãã ãããã£ãŠãLuaã䜿çšããŠå¿ èŠãªããžãã¯ãå®è£ ããŸããã
ãã¹ãŠã®äœæ¥ãè¡ãããnginxã®èšå®ïŒã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒãã«å¯Ÿããã¢ãããžãŒïŒã¯ç解ã§ããŸãã ããã§æ³šç®ãã¹ãã¯ãæåŸã®ãã£ã¬ã¯ãã£ãpost_actionã§ãã
location /middleware { more_clear_input_headers Accept-Encoding; lua_need_request_body on; rewrite_by_lua_file 'middleware/rewrite.lua'; access_by_lua_file 'middleware/access.lua'; proxy_pass https://someurl.com; body_filter_by_lua_file 'middleware/body_filter.lua'; post_action /process_session; }
ãã®æ§æã§äœãèµ·ããããæ€èšããŠãã ããã
more_clear_input_headers-ãã£ã¬ã¯ãã£ãã®åŸã«æå®ãããããããŒã®å€ãã¯ãªã¢ããŸãã
lua_need_request_body -rewrite / access / access_by_luaãã£ã¬ã¯ãã£ããå®è¡ããåã«å ã®ãªã¯ãšã¹ãæ¬æãèªã¿åããã©ãããå¶åŸ¡ããŸãã ããã©ã«ãã§ã¯ãnginxã¯ã¯ã©ã€ã¢ã³ããªã¯ãšã¹ãã®æ¬æãèªã¿åããŸãããã¢ã¯ã»ã¹ããå¿ èŠãããå Žåã¯ããã®ãã£ã¬ã¯ãã£ããonã«èšå®ããå¿ èŠããããŸãã
rewrite_by_lua_file-ã¹ã¯ãªãããžã®ãã¹ããªã¯ãšã¹ããå€æŽããããã®ããžãã¯ãèšè¿°ããŸã
access_by_lua_file-ã¹ã¯ãªãããžã®ãã¹ããªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ããã§ãã¯ããããžãã¯ãèšè¿°ããŸãã
proxy_pass-ãªã¯ãšã¹ãããããã·ãããURLã
body_filter_by_lua_file-ã¹ã¯ãªãããžã®ãã¹ãã¯ã©ã€ã¢ã³ãã«æ»ãåã«ãªã¯ãšã¹ãããã£ã«ã¿ãªã³ã°ããããžãã¯ãèšè¿°ããŸãã
ãããŠæåŸã«ã post_actionã¯å ¬åŒã«ææžåãããŠããªããã£ã¬ã¯ãã£ãã§ãããã¯ã©ã€ã¢ã³ãã«å¿çãäžããããåŸã«ä»ã®ã¢ã¯ã·ã§ã³ãå®è¡ããããã«äœ¿çšã§ããŸãã
次ã«ãåé¡ãã©ã®ããã«è§£æ±ºããããé çªã«èª¬æããŸãã
æ¿èª/èªèšŒããã³ãªã¯ãšã¹ãã®å€æŽ
ãã°ã€ã³
蚌ææžã¢ã¯ã»ã¹ã䜿çšããŠæ¿èªãšèªèšŒãæ§ç¯ããŸããã ã«ãŒã蚌ææžããããŸãã 顧客ã®åæ°èŠã¯ã©ã€ã¢ã³ãã¯ãAPIã«ã¢ã¯ã»ã¹ã§ããå人蚌ææžãçæããŸãã ãã®èšŒææžã¯ãnginxèšå®ãµãŒããŒã»ã¯ã·ã§ã³ã§æ§æãããŸãã
ssl on; ssl_certificate /usr/local/openresty/nginx/ssl/cert.pem; ssl_certificate_key /usr/local/openresty/nginx/ssl/cert.pem; ssl_client_certificate /usr/local/openresty/nginx/ssl/ca.crt; ssl_verify_client on;
ä¿®æ£
å ¬æ£ãªè³ªåãçºçããå¯èœæ§ããããŸãïŒçªç¶ã¯ã©ã€ã¢ã³ããã·ã¹ãã ããåæãããå ŽåãèªèšŒãããã¯ã©ã€ã¢ã³ããã©ããããïŒ ä»ã®ãã¹ãŠã®ã¯ã©ã€ã¢ã³ãã«å¯ŸããŠèšŒææžãåçºè¡ããªãã§ãã ããã
ããã§ãç§ãã¡ã¯ã¹ã ãŒãºã«æ¬¡ã®ã¿ã¹ã¯ãã€ãŸãå ã®ãªã¯ãšã¹ãã®å€æŽã«åãçµã¿ãŸããã äžè¬çã«èšãã°ãæåã®ã¯ã©ã€ã¢ã³ãèŠæ±ã¯æçµã·ã¹ãã ã§ã¯ç¡å¹ã§ãã ã¿ã¹ã¯ã®1ã€ã¯ãäžè¶³ããŠããéšåããªã¯ãšã¹ãã«è¿œå ããŠæå¹ã«ããããšã§ãã ãã€ã³ãã¯ãäžè¶³ããŠããããŒã¿ãã¯ã©ã€ã¢ã³ãããšã«ç°ãªãããšã§ãã ã¯ã©ã€ã¢ã³ãã¯ãæçŽãååŸããããŒã¿ããŒã¹ããå¿ èŠãªã¯ã©ã€ã¢ã³ãããŒã¿ãæœåºã§ãã蚌ææžãæã£ãŠæ¥ãŠããããšãç¥ã£ãŠããŸãã
ããæç¹ã§ã¯ã©ã€ã¢ã³ãããµãŒãã¹ããåæããå¿ èŠãããå Žåã圌ã®ããŒã¿ã¯ããŒã¿ããŒã¹ããæ¶ãã圌ã¯äœãã§ããªããªããŸãã
顧客ããŒã¿ãæäœãã
ãœãªã¥ãŒã·ã§ã³ã®é«å¯çšæ§ãç¹ã«é¡§å®¢ããŒã¿ã®ååŸæ¹æ³ã確ä¿ããå¿ èŠããããŸããã å°é£ãªã®ã¯ããã®ããŒã¿ã®ãœãŒã¹ããµãŒãããŒãã£ã®ãµãŒãã¹ã§ãããäžæã®ãªãé«éæ§ãä¿èšŒãããŠããªãããšã§ãã
ãããã£ãŠã顧客ããŒã¿ã®é«å¯çšæ§ã確ä¿ããå¿ èŠããããŸããã ããŒã«ãšããŠã HazelcastãéžæããŸããã
- ããŒã¿ãžã®è¿ éãªã¢ã¯ã»ã¹
- ç°ãªãããŒãã«è€è£œãããããŒã¿ã䜿çšããŠãããã€ãã®ããŒãã®ã¯ã©ã¹ã¿ãŒãç·šæããæ©èœã
æãåçŽãªãã£ãã·ã¥é ä¿¡æŠç¥ãéžã³ãŸããã
![](https://habrastorage.org/webt/u6/f6/72/u6f6729km0g71ge4prl5ww1kes8.png)
æçµã·ã¹ãã ã§ã®äœæ¥ã¯ã»ãã·ã§ã³ã®ãã¬ãŒã ã¯ãŒã¯å ã§è¡ãããæ倧æ°ã«ã¯å¶éããããŸãã ã¯ã©ã€ã¢ã³ããã»ãã·ã§ã³ãéããªãã£ãå Žåããããè¡ãå¿ èŠããããŸãã
ãªãŒãã³ã»ãã·ã§ã³ããŒã¿ã¯ã¿ãŒã²ããã·ã¹ãã ããååŸãããæåã¯LuaåŽã§åŠçãããŸãã Hazelcastã䜿çšããŠããã®ããŒã¿ã.NETã©ã€ã¿ãŒã§ä¿åããããšã«ããŸããã ãã®åŸãäžå®ã®ééã§ããªãŒãã³ã»ãã·ã§ã³ã®åç¶æš©ã確èªãããã¡ãŠã«ãã¯ããŒãºããŸãã
Luaãš.NETã®äž¡æ¹ããHazelcastã«ã¢ã¯ã»ã¹
Luaã«ã¯Hazelcastãšé£æºããã¯ã©ã€ã¢ã³ãã¯ãããŸããããHazelcastã«ã¯REST APIãããã䜿çšããããšã«ããŸããã .NETã«ã¯ã.NETåŽã§HazelcastããŒã¿ã«ã¢ã¯ã»ã¹ããããšãèšç»ããã¯ã©ã€ã¢ã³ãããããŸã ã ããããããã«ãããŸããã
![](https://habrastorage.org/webt/qr/xn/ip/qrxnipywarywskcoslishyb8xtm.png)
RESTãä»ããŠããŒã¿ãä¿åãã.NETã¯ã©ã€ã¢ã³ããä»ããŠååŸããå Žåãç°ãªãã·ãªã¢ã©ã€ã¶ãŒ/ãã·ãªã¢ã©ã€ã¶ãŒã䜿çšãããŸãã ãããã£ãŠãRESTãä»ããŠããŒã¿ãéä¿¡ããããšã¯ã§ããŸãããã.NETã¯ã©ã€ã¢ã³ããä»ããŠããŒã¿ãååŸããããšã¯ã§ããŸããã
èå³ãããå Žåã¯ãå¥ã®èšäºã§ãã®åé¡ã«ã€ããŠè©³ãã説æããŸãã ãã¿ãã¬-ã·ã§ã ã«ã®äžã
![](https://habrastorage.org/webt/wh/l8/ra/whl8rayewel52cotktzhfcejmbs.png)
ãã®ã³ã°ãšã¢ãã¿ãªã³ã°
.NETãä»ãããã®ã³ã°ã®äŒæ¥æšæºã¯Serilogã§ããããã¹ãŠã®ãã°ã¯æçµçã«Elasticsearchã«æ ŒçŽãããKibanaãä»ããŠåæããŸãã ãã®å Žåã䌌ããããªããšããããã£ãã®ã§ãã Luaã§Elasticã䜿çšããå¯äžã®ã¯ã©ã€ã¢ã³ãã¯ãæåã®èŠæ±ã§å£ããŸããã ãããŠãFluentdã䜿çšããŸããã
Fluentdã¯ãåäžã®ã¢ããªã±ãŒã·ã§ã³ãã®ã³ã°ã¬ã€ã€ãŒãæäŸããããã®ãªãŒãã³ãœãŒã¹ãœãªã¥ãŒã·ã§ã³ã§ãã ã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªã¬ã€ã€ãŒãããã°ãåéããããããåäžã®ãœãŒã¹ã«å€æã§ããŸãã
Gateway APIã¯K8Sã§æ©èœãããããfluentdã®ã³ã³ãããåããµãã¿ã€ãã«è¿œå ããŠãæ¢åã®ãªãŒãã³tcpããŒãfluentdã«ãã°ãæžã蟌ãããšã«ããŸããã
ãŸããElasticsearchãšã®é¢ä¿ããªãã£ãå Žåã®fluentdã®åäœã«ã€ããŠã調æ»ããŸããã 2æ¥éããªã¯ãšã¹ãã¯ã²ãŒããŠã§ã€ã«ç¶ç¶çã«éä¿¡ããããã°ã¯fluentdã«éä¿¡ãããŸããããIP Elasticã¯fluentdããçŠæ¢ãããŸããã åæ¥ç¶åŸãfluentdã¯Elasticã®ãã¹ãŠã®ãã°ãå®å šã«äžåããŸããã
ãããã«
å®è£ ãžã®éžæãããã¢ãããŒãã«ãããå®éã«æ©èœãã補åãããã2.5ãæã§æŠéç°å¢ã«æäŸããããšãã§ããŸããã
ãã®ãããªããšãããããšãããå Žåã¯ããŸãã解決ããããšããŠããåé¡ãšããã§ã«æã£ãŠãããªãœãŒã¹ãæ確ã«ç解ããããšããå§ãããŸãã æ¢åã®API管çã·ã¹ãã ãšã®çµ±åã®è€éãã«æ³šæããŠãã ããã
æ£ç¢ºã«ããªããéçºããããšããŠãããã®ãç解ããŠãã ãã-ãªã¯ãšã¹ããåŠçããããžãã¹ããžãã¯ããŸãã¯ç§ãã¡ã®å Žåã®ããã«ããããã·å šäœã®ã¿ã èªåã§è¡ãããšã¯ãã¹ãŠãåŸã§åŸ¹åºçã«ãã¹ãããå¿ èŠãããããšãå¿ããªãã§ãã ããã