ã¿ãªãããããã«ã¡ã¯ïŒ
* ãã®èšäºã¯ REBRAIN ãš Yandex.Cloud ãªãŒãã³ ã¯ãŒã¯ã·ã§ããã«åºã¥ããŠããŸãããããªãèŠããå Žåã¯ããã®ãªã³ã¯ããèŠã€ããããšãã§ããŸãã
æè¿ãYandex.Cloud ãã©ã€ãã§è©Šãæ©äŒããããŸããã ç§ãã¡ã¯é·ã培åºçã«èª¿æ»ãããã£ãã®ã§ãã¯ã©ãŠã ããŒã¹ã§ã·ã³ãã«ãª Wordpress ããã°ãç«ã¡äžãããšããèãã¯ããŸãã«ãéå±ã ã£ãã®ã§ããã«æŸæ£ããŸããã å°ãèããçµæãã»ãŒãªã¢ã«ã¿ã€ã ã¢ãŒãã§ã€ãã³ããåä¿¡ããŠââåæããããã®å®çšŒåãµãŒãã¹ ã¢ãŒããã¯ãã£ã«äŒŒããã®ããããã€ããããšã«ããŸããã
ç§ã¯ã倧å€æ°ã®ãªã³ã©ã€ã³äŒæ¥ (ãªã³ã©ã€ã³äŒæ¥ã«éãã) ããäœããã®æ¹æ³ã§ãŠãŒã¶ãŒãšãã®è¡åã«é¢ãã倧éã®æ
å ±ãåéããŠãããšç¢ºä¿¡ããŠããŸãã å°ãªããšããããã¯ç¹å®ã®æ±ºå®ãäžãããã«å¿
èŠã§ããããšãã°ããªã³ã©ã€ã³ ã²ãŒã ã管çããŠããå ŽåããŠãŒã¶ãŒãã©ã®ã¬ãã«ã§ã¹ã¿ãã¯ããããšãæãå€ããããã¡ããåé€ããããšããçµ±èšã確èªã§ããŸãã ãŸãã¯ããŠãŒã¶ãŒãäœã賌å
¥ããã«ãµã€ããé¢ããçç± (ããã«ã¡ã¯ãYandex.Metrica)ã
ãšããããšã§ãç§ãã¡ã®ã¹ããŒãªãŒã¯ãã©ã®ããã«ã㊠golang ã§ã¢ããªã±ãŒã·ã§ã³ãäœæããkafkaãrabbitmqãyqs ããã¹ãããClickhouse ã¯ã©ã¹ã¿ãŒã§ããŒã¿ ã¹ããªãŒãã³ã°ãäœæããyandex datalens ã䜿çšããŠããŒã¿ãèŠèŠåãããã§ãã åœç¶ã®ããšãªãããããããã¹ãŠã¯ãdockerãterraformãgitlab ciããããŠãã¡ãã prometheus ã®åœ¢ã§ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã®åã³ã§å³ä»ããããŠããŸãã ããè¡ããïŒ
äžåºŠã«ãã¹ãŠãèšå®ããããšã¯ã§ããªãããšãããã«äºçŽããããšæããŸãããã®ããã«ã¯ãã·ãªãŒãºã®ããã€ãã®èšäºãå¿ èŠã«ãªããŸãã æ§é ã«ã€ããŠå°ã説æããŸãã
ããŒã 1 (ããªãã¯èªãã§ããŸã)ã ãœãªã¥ãŒã·ã§ã³ã®ä»æ§ãšã¢ãŒããã¯ãã£ã決å®ããgolang ã§ã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã
ããŒã2ã ã¢ããªã±ãŒã·ã§ã³ãå®çšŒåç°å¢ã«ãªãªãŒã¹ããã¹ã±ãŒã©ãã«ã«ããŠè² è·ããã¹ãããŸãã
ããŒã 3ã ãªãã¡ãã»ãŒãžããã¡ã€ã«ã§ã¯ãªããããã¡ãŒã«ä¿åããå¿
èŠãããã®ãââãç解ããŠãkafkaãrabbitmqãyandex ãã¥ãŒ ãµãŒãã¹ãæ¯èŒããŠã¿ãŸãããã
ããŒã 4 Clickhouse ã¯ã©ã¹ã¿ãŒããããã€ããããã«ãããããã¡ãŒããããŒã¿ã転éããã¹ããªãŒãã³ã° ãµãŒãã¹ãäœæããdatalens ã§èŠèŠåãã»ããã¢ããããŸãã
ããŒã5 ã€ã³ãã©ã¹ãã©ã¯ãã£å
šäœãé©åãªåœ¢ã«æŽããŸããããgitlab ci ã䜿çšã㊠ci/cd ãã»ããã¢ããããprometheus ãš consul ã䜿çšããŠã¢ãã¿ãªã³ã°ãšãµãŒãã¹æ€åºãæ¥ç¶ããŸãã
TK
ãŸããçµæãšããŠæ£ç¢ºã«äœãååŸãããã®ããšããå§èšæ¡ä»¶ãå®åŒåããŸãããã
- events.kis.im (kis.im ã¯ãã¹ãŠã®èšäºã§äœ¿çšãããã¹ã ãã¡ã€ã³) ã®ãããªãšã³ããã€ã³ããå¿ èŠã§ãHTTPS ã䜿çšããŠã€ãã³ããåä¿¡ããå¿ èŠããããŸãã
- ã€ãã³ãã¯ã{âeventâ: âviewâ, âosâ: âlinuxâ, âbrowserâ: âchromeâ} ã®ãããªåçŽãª json ã§ãã æçµæ®µéã§ã¯ããã«ãã£ãŒã«ããè¿œå ããŸãããããã¯å€§ããªåœ¹å²ãæãããŸããã å¿ èŠã«å¿ããŠãprotobuf ã«åãæ¿ããããšãã§ããŸãã
- ãµãŒãã¹ã¯ 10 ç§ããã 000 件ã®ã€ãã³ããåŠçã§ããå¿ èŠããããŸãã
- æ°ããã€ã³ã¹ã¿ã³ã¹ããœãªã¥ãŒã·ã§ã³ã«è¿œå ããã ãã§ãæ°Žå¹³æ¹åã«æ¡åŒµã§ããã¯ãã§ãã ãŸããã¯ã©ã€ã¢ã³ããªã¯ãšã¹ãã®ã¬ã€ãã³ã·ãççž®ããããã«ãããã³ãéšåãå¥ã®å°ççäœçœ®ã«ç§»åã§ããã°çŽ æŽãããã§ãããã
- ãã©ãŒã«ããã¬ã©ã³ã¹ã ãœãªã¥ãŒã·ã§ã³ã¯ååã«å®å®ããŠãããéšåãèœäžããŠãèããããå¿ èŠããããŸã (ãã¡ãããäžå®æ°ãŸã§)ã
ã¢ãŒããã¯ãã£
äžè¬ã«ããã®ã¿ã€ãã®ã¿ã¹ã¯ã§ã¯ãå¹ççãªã¹ã±ãŒãªã³ã°ãå¯èœã«ããå€å žçãªã¢ãŒããã¯ãã£ãé·ãéçºæãããŠããŸããã å³ã¯ãœãªã¥ãŒã·ã§ã³ã®äžäŸã瀺ããŠããŸãã
ããã§ãç§ãã¡ãæã£ãŠãããã®ã¯æ¬¡ã®ãšããã§ãã
1. å·ŠåŽã«ã¯ããã¬ãŒã€ãŒãã¹ããŒããã©ã³äžã®ããã¡ãã®ã¬ãã«ãå®äºããããéåžžã®ãã©ãŠã¶ãŒãéããŠãªã³ã©ã€ã³ ã¹ãã¢ã§æ³šæãäœæãããããããŸããŸãªã€ãã³ããçæããããã€ã¹ããããŸãã ä»æ§ã§æå®ãããŠããã€ãã³ãã¯ããšã³ããã€ã³ã events.kis.im ã«éä¿¡ãããåçŽãª JSON ã§ãã
2. æåã® XNUMX ã€ã®ãµãŒããŒã¯åçŽãªãã©ã³ãµãŒã§ãããäž»ãªã¿ã¹ã¯ã¯æ¬¡ã®ãšããã§ãã
- åžžã«å©çšã§ããããã«ããŠãã ããã ãããè¡ãã«ã¯ãããšãã°ãåé¡ãçºçããå Žåã«ããŒãéã§ä»®æ³ IP ãåãæ¿ãã keepalived ã䜿çšã§ããŸãã
- TLSãçµäºããŸãã ã¯ãããããã® TLS ãçµäºããŸãã 第äžã«ãåœç€Ÿã®ãœãªã¥ãŒã·ã§ã³ãæè¡ä»æ§ã«æºæ ããããã第äºã«ãããã¯ãšã³ã ãµãŒããŒããæå·åãããæ¥ç¶ã確ç«ããè² æ ã軜æžããããã§ãã
- åä¿¡ãªã¯ãšã¹ãã®ãã©ã³ã¹ãå©çšå¯èœãªããã¯ãšã³ã ãµãŒããŒã«åæ£ããŸãã ããã§ã®ããŒã¯ãŒãã¯ã¢ã¯ã»ã¹å¯èœã§ãã ããã«åºã¥ããŠãããŒã ãã©ã³ãµãŒã¯ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠãµãŒããŒãç£èŠããé害ãçºçããããŒããžã®ãã©ãã£ãã¯ã®åæ£ãåæ¢ã§ããªããã°ãªããªããšããç解ã«éããŸããã
3. ãã©ã³ãµãŒã®åŸã«ã¯ãéåžžã«åçŽãªã¢ããªã±ãŒã·ã§ã³ãå®è¡ããã¢ããªã±ãŒã·ã§ã³ ãµãŒããŒããããŸãã HTTP çµç±ã§åä¿¡ãªã¯ãšã¹ããåãå ¥ããéä¿¡ããã JSON ãæ€èšŒããããŒã¿ããããã¡ãŒã«å ¥ããããšãã§ããå¿ èŠããããŸãã
4. ãã®å³ã§ã¯ããããã¡ãŒãšã㊠kafka ã瀺ããŠããŸããããã¡ãããä»ã®åæ§ã®ãµãŒãã¹ããã®ã¬ãã«ã§äœ¿çšã§ããŸãã 第 XNUMX åã®èšäºã§ã¯ãKafkaãrabbitmqãyqs ãæ¯èŒããŸãã
5. ç§ãã¡ã®ã¢ãŒããã¯ãã£ã®æåŸãã 4 çªç®ã®ãã€ã³ãã¯ãèšå€§ãªéã®ããŒã¿ãä¿åããã³åŠçã§ããååããŒã¿ããŒã¹ã§ãã Clickhouse ã§ãã ãã®ã¬ãã«ã§ã¯ããããã¡ããã¹ãã¬ãŒãž ã·ã¹ãã èªäœã«ããŒã¿ã転éããå¿ èŠããããŸã (ããã«ã€ããŠã¯èšäº XNUMX ã§è©³ãã説æããŸã)ã
ãã®èšèšã«ãããåã¬ã€ã€ãŒãæ°Žå¹³æ¹åã«ç¬ç«ããŠæ¡å€§çž®å°ããããšãã§ããŸãã ããã¯ãšã³ã ãµãŒããŒã¯å¯Ÿå¿ã§ããŸããããã XNUMX ã€ä»ãå ããŠãããŸããçµå±ã®ãšãããããã¯ãšã³ã ãµãŒããŒã¯ã¹ããŒãã¬ã¹ ã¢ããªã±ãŒã·ã§ã³ãªã®ã§ãããã¯èªåçã«è¡ãããšãã§ããŸãã Kafka ã¹ã¿ã€ã«ã®ãããã¡ãŒã¯æ©èœããŸããããµãŒããŒãããã«è¿œå ããŠããããã¯ã®ããŒãã£ã·ã§ã³ã®äžéšããµãŒããŒã«è»¢éããŸãããã Clickhouse ã¯ãããåŠçã§ããŸãã - äžå¯èœã§ã :) å®éããµãŒããŒã«æ¥ç¶ããŠããŒã¿ãã·ã£ãŒãã£ã³ã°ããããšãããŸãã
ã¡ãªã¿ã«ãæè¡ä»æ§ã®ãªãã·ã§ã³éšåãå®è£ ããŠãããŸããŸãªå°çäœçœ®æ å ±ã«æ¡åŒµãããå Žåãããã»ã©ç°¡åãªãã®ã¯ãããŸããã
åå°çäœçœ®æ
å ±ã«ãã¢ããªã±ãŒã·ã§ã³ãš Kafka ãåããããŒã ãã©ã³ãµãŒããããã€ããŸãã äžè¬ã«ã2 ã€ã®ã¢ããªã±ãŒã·ã§ã³ ãµãŒããŒã3 ã€ã® Kafka ããŒããããã³ã¯ã©ãŠã ãã©ã³ãµãŒ (cloudflare ãªã©) ã§ååã§ããã¯ã©ãŠã ãã©ã³ãµãŒã¯ãã¢ããªã±ãŒã·ã§ã³ ããŒãã®å¯çšæ§ããã§ãã¯ããã¯ã©ã€ã¢ã³ãã®ãœãŒã¹ IP ã¢ãã¬ã¹ã«åºã¥ããŠå°çäœçœ®æ
å ±ã«ãã£ãŠãªã¯ãšã¹ãã®ãã©ã³ã¹ããšããŸãã ãããã£ãŠãã¢ã¡ãªã«ã®ã¯ã©ã€ã¢ã³ãããéä¿¡ãããããŒã¿ã¯ã¢ã¡ãªã«ã®ãµãŒããŒã«å°éããŸãã ãããŠã¢ããªã«ã®ããŒã¿ã¯ã¢ããªã«ã«ãããŸãã
ãã®åŸããã¹ãŠãéåžžã«ç°¡åã«ãªããŸããKafka ã»ããã®ãã©ãŒ ããŒã«ã䜿çšãããã¹ãŠã®ããŒã¿ããã¹ãŠã®å Žæãããã·ã¢ã«ããäžå€®ããŒã¿ ã»ã³ã¿ãŒã«ã³ããŒããŸãã å éšçã«ã¯ããŒã¿ã解æãããã®åŸã®èŠèŠåã®ããã« Clickhouse ã«èšé²ããŸãã
ã¢ãŒããã¯ãã£ãæŽçããŸãããYandex.Cloud ãåããå§ããŸãããã
ã¢ããªã±ãŒã·ã§ã³ã®äœæ
ã¯ã©ãŠããç»å Žããåã¯ããŸã å°ãèŸæ±åŒ·ããåä¿¡ã€ãã³ããåŠçããéåžžã«åçŽãªãµãŒãã¹ãäœæããå¿ èŠããããŸãã golang ã¯ãããã¯ãŒã¯ ã¢ããªã±ãŒã·ã§ã³ãäœæããããã®èšèªãšããŠéåžžã«åªããŠããããšã蚌æãããŠãããããããã§ã¯ golang ã䜿çšããŸãã
XNUMX æé (ããããæ°æé) è²»ãããåŸã次ã®ãããªçµæãåŸãããŸãã
ããã§æ³šæãããäž»ãªç¹ã¯æ¬¡ã®ãšããã§ãã
1. ã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«ãXNUMX ã€ã®ãã©ã°ãæå®ã§ããŸãã XNUMX ã€ã¯ãåä¿¡ http ãªã¯ãšã¹ãããªãã¹ã³ããããŒã (-addr) ãæ åœããŸãã XNUMX çªç®ã¯ãã€ãã³ããèšé²ãã kafka ãµãŒããŒã®ã¢ãã¬ã¹çšã§ã (-kafka)ã
addr = flag.String("addr", ":8080", "TCP address to listen to")
kafka = flag.String("kafka", "127.0.0.1:9092", "Kafka endpointsâ)
2. ã¢ããªã±ãŒã·ã§ã³ã¯ãsarama ã©ã€ãã©ãª (
config := sarama.NewConfig()
config.Producer.RequiredAcks = sarama.WaitForLocal
config.Producer.Compression = sarama.CompressionSnappy
config.Producer.Return.Successes = true
3. ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã«ã¯ã次ã®ãããªããŸããŸãªã¡ããªã¯ã¹ãåéããçµã¿èŸŒã¿ã® prometheus ã¯ã©ã€ã¢ã³ãããããŸãã
- ã¢ããªã±ãŒã·ã§ã³ãžã®ãªã¯ãšã¹ãã®æ°ã
- ãªã¯ãšã¹ãå®è¡æã®ãšã©ãŒã®æ° (ãã¹ããªã¯ãšã¹ããèªã¿åãããšãã§ããªããJSON ãå£ãããKafka ã«æžã蟌ãããšãã§ããªã)ã
- Kafka ãžã®ã¡ãã»ãŒãžã®æžã蟌ã¿æéãå«ããã¯ã©ã€ã¢ã³ãããã® XNUMX ã€ã®ãªã¯ãšã¹ãã®åŠçæéã
4. ã¢ããªã±ãŒã·ã§ã³ãåŠçãã XNUMX ã€ã®ãšã³ããã€ã³ã:
- /status - çããŠããããšã瀺ãã«ã¯åã« ok ãè¿ããŸãã ãã ããKafka ã¯ã©ã¹ã¿ãŒã®å¯çšæ§ãªã©ãããã€ãã®ãã§ãã¯ãè¿œå ã§ããŸãã
- /metrics - ãã® URL ã«åŸã£ãŠãprometheus ã¯ã©ã€ã¢ã³ãã¯åéããã¡ããªã¯ã¹ãè¿ããŸãã
- /post ã¯ãå éšã« json ãå«ã POST ãªã¯ãšã¹ããéä¿¡ãããã¡ã€ã³ ãšã³ããã€ã³ãã§ãã ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãjson ã®æå¹æ§ããã§ãã¯ãããã¹ãŠãæ£åžžã§ããã°ãããŒã¿ã Kafka ã¯ã©ã¹ã¿ãŒã«æžã蟌ã¿ãŸãã
ãã®ã³ãŒãã¯å®ç§ã§ã¯ãªãããšãçä¿ããŠãããŸãããå®æãããããšã¯å¯èœã§ã (ãããŠãããã¹ãã§ã!)ã ããšãã°ãçµã¿èŸŒã¿ã® net/http ã®äœ¿çšãåæ¢ããããé«é㪠fasthttp ã«åãæ¿ããããšãã§ããŸãã ãŸãã¯ãjson 劥åœæ§ãã§ãã¯ãåŸã®æ®µé (ããŒã¿ããããã¡ãŒããã¯ãªãã¯ããŠã¹ ã¯ã©ã¹ã¿ãŒã«è»¢éããããšã) ã«ç§»åããããšã§ãåŠçæéãš CPU ãªãœãŒã¹ãç²åŸã§ããŸãã
ãã®åé¡ã®éçºé¢ã«å ããŠãç§ãã¡ã¯ããã«å°æ¥ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã«ã€ããŠæ€èšããDocker çµç±ã§ã¢ããªã±ãŒã·ã§ã³ããããã€ããããšã«ããŸããã ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®æçµç㪠Dockerfile ã¯æ¬¡ã®ãšããã§ãã
ã¯ã©ãŠãã®æåã®ã¹ããã
ãŸãã¯ããã¡ãã«ç»é²ããŠãã ãã
ç»é²åŸãå¥ã®ã¯ã©ãŠããšããã©ã«ãã®ãã£ã¬ã¯ããªãäœæãããããã§ã¯ã©ãŠã ãªãœãŒã¹ã®äœæãéå§ã§ããŸãã äžè¬ã«ãYandex.Cloud ã§ã¯ããªãœãŒã¹ã®é¢ä¿ã¯æ¬¡ã®ããã«ãªããŸãã
XNUMX ã€ã®ã¢ã«ãŠã³ãã«å¯ŸããŠè€æ°ã®ã¯ã©ãŠããäœæã§ããŸãã ãããŠã¯ã©ãŠãå
ã«ã¯ãäŒç€Ÿã®ãããžã§ã¯ãããšã«ç°ãªããã£ã¬ã¯ããªãäœæããŸãã ããã«ã€ããŠè©³ããã¯ãããã¥ã¡ã³ããåç
§ããŠãã ããã
ã¯ã©ãŠãã管çããã«ã¯ãWeb ã€ã³ã¿ãŒãã§ã€ã¹ãšã³ã³ãœãŒã« ãŠãŒãã£ãªã㣠(yc) ã®äž¡æ¹ã䜿çšã§ããŸãã ã€ã³ã¹ããŒã«ã¯ XNUMX ã€ã®ã³ãã³ãã§å®è¡ãããŸã (Linux ããã³ Mac OS ã®å Žå)ã
curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash
瀟å ã®ã»ãã¥ãªãã£å°é家ãã€ã³ã¿ãŒãããããã¹ã¯ãªãããå®è¡ããããšã«æ¿æããŠããå Žåã¯ããŸããã¹ã¯ãªãããéããŠèªãããšãã§ããŸãã次ã«ãã¹ã¯ãªããã root æš©éãªãã§ãŠãŒã¶ãŒã®äžã§å®è¡ããŸãã
Windows çšã®ã¯ã©ã€ã¢ã³ããã€ã³ã¹ããŒã«ããå Žåã¯ã次ã®æé ã䜿çšã§ããŸãã yc init
å®å
šã«ã«ã¹ã¿ãã€ãºããã«ã¯:
vozerov@mba:~ $ yc init
Welcome! This command will take you through the configuration process.
Please go to https://oauth.yandex.ru/authorize?response_type=token&client_id= in order to obtain OAuth token.
Please enter OAuth token:
Please select cloud to use:
[1] cloud-b1gv67ihgfu3bp (id = b1gv67ihgfu3bpt24o0q)
[2] fevlake-cloud (id = b1g6bvup3toribomnh30)
Please enter your numeric choice: 2
Your current cloud has been set to 'fevlake-cloud' (id = b1g6bvup3toribomnh30).
Please choose folder to use:
[1] default (id = b1g5r6h11knotfr8vjp7)
[2] Create a new folder
Please enter your numeric choice: 1
Your current folder has been set to 'default' (id = b1g5r6h11knotfr8vjp7).
Do you want to configure a default Compute zone? [Y/n]
Which zone do you want to use as a profile default?
[1] ru-central1-a
[2] ru-central1-b
[3] ru-central1-c
[4] Don't set default zone
Please enter your numeric choice: 1
Your profile default Compute zone has been set to 'ru-central1-a'.
vozerov@mba:~ $
ååãšããŠãããã»ã¹ã¯ç°¡åã§ãããŸããã¯ã©ãŠãã管çããããã® OAuth ããŒã¯ã³ãååŸãã䜿çšããã¯ã©ãŠããšãã©ã«ããŒãéžæããå¿ èŠããããŸãã
åãã¯ã©ãŠãå ã«è€æ°ã®ã¢ã«ãŠã³ããŸãã¯ãã©ã«ããŒãããå Žåã¯ãyc config profile create ã䜿çšããŠåå¥ã®èšå®ã§è¿œå ã®ãããã¡ã€ã«ãäœæããããããåãæ¿ããããšãã§ããŸãã
äžèšã®ã¡ãœããã«å ããŠãYandex.Cloud ããŒã ã¯éåžžã«åªããã¡ãœãããæžããŸããã
vozerov@mba:~ $ git clone https://github.com/rebrainme/yandex-cloud-events/ events
Cloning into 'events'...
remote: Enumerating objects: 100, done.
remote: Counting objects: 100% (100/100), done.
remote: Compressing objects: 100% (68/68), done.
remote: Total 100 (delta 37), reused 89 (delta 26), pack-reused 0
Receiving objects: 100% (100/100), 25.65 KiB | 168.00 KiB/s, done.
Resolving deltas: 100% (37/37), done.
vozerov@mba:~ $ cd events/terraform/
terraform ã§äœ¿çšããããã¹ãŠã®äž»ãªå€æ°ã¯ãmain.tf ãã¡ã€ã«ã«æžã蟌ãŸããŸãã ãŸãã次ã®å 容ãå«ã private.auto.tfvars ãã¡ã€ã«ã terraform ãã©ã«ããŒã«äœæããŸãã
# Yandex Cloud Oauth token
yc_token = ""
# Yandex Cloud ID
yc_cloud_id = ""
# Yandex Cloud folder ID
yc_folder_id = ""
# Default Yandex Cloud Region
yc_region = "ru-central1-a"
# Cloudflare email
cf_email = ""
# Cloudflare token
cf_token = ""
# Cloudflare zone id
cf_zone_id = ""
ã³ã³ãœãŒã« ãŠãŒãã£ãªãã£ã¯ãã§ã«èšå®ãããŠããããããã¹ãŠã®å€æ°ã¯ yc config ãªã¹ãããååŸã§ããŸãã ãã©ã€ããŒã ããŒã¿ã誀ã£ãŠå ¬éããªãããã«ãçŽã¡ã« private.auto.tfvars ã .gitignore ã«è¿œå ããããšããå§ãããŸãã
private.auto.tfvars ã§ã¯ãDNS ã¬ã³ãŒããäœæããã¡ã€ã³ ãã¡ã€ã³ events.kis.im ããµãŒããŒã«ãããã·ããããã«ãCloudflare ããã®ããŒã¿ãæå®ããŸããã Cloudflare ã䜿çšããããªãå Žåã¯ãmain.tf å ã® Cloudflare ãããã€ããŒã®åæåãšãå¿ èŠãª DNS ã¬ã³ãŒãã®äœæãæ åœãã dns.tf ãã¡ã€ã«ãåé€ããŸãã
ç§ãã¡ã®äœæ¥ã§ã¯ãWeb ã€ã³ã¿ãŒãã§ã€ã¹ãã³ã³ãœãŒã« ãŠãŒãã£ãªãã£ãTerraform ã® XNUMX ã€ã®ã¡ãœããããã¹ãŠçµã¿åãããŸãã
ä»®æ³ãããã¯ãŒã¯
æ£çŽã«èšããšãæ°ããã¯ã©ãŠããäœæãããšãèªåçã«å¥ã®ãããã¯ãŒã¯ãš 3 ã€ã®ãµãããã (ã¢ãã€ã©ããªã㣠ãŸãŒã³ããšã« XNUMX ã€) ãäœæãããããããã®æé ãã¹ãããããããšãã§ããŸãã ããããããã§ããç¬èªã®ã¢ãã¬ã¹æå®ãæã€ãããžã§ã¯ãçšã«å¥ã®ãããã¯ãŒã¯ãäœæããããšèããŠããŸãã Yandex.Cloud ã§ãããã¯ãŒã¯ãã©ã®ããã«æ©èœãããã瀺ãäžè¬çãªå³ã以äžã®å³ã«ç€ºããŸã (æ£çŽã«åŒçšãããã®ã§ã)
ãããã£ãŠããªãœãŒã¹ãçžäºã«éä¿¡ã§ããå
±éã®ãããã¯ãŒã¯ãäœæããŸãã ã¢ãã€ã©ããªã㣠ãŸãŒã³ããšã«ãç¬èªã®ã¢ãã¬ã¹æå®ã䜿çšããŠãµãããããäœæãããäžè¬çãªãããã¯ãŒã¯ã«æ¥ç¶ãããŸãã ãã®çµæãç°ãªãå¯çšæ§ãŸãŒã³ã«ããå Žåã§ãããã®äžã®ãã¹ãŠã®ã¯ã©ãŠã ãªãœãŒã¹ãéä¿¡ã§ããŸãã ç°ãªãã¯ã©ãŠã ãããã¯ãŒã¯ã«æ¥ç¶ãããŠãããªãœãŒã¹ã¯ãå€éšã¢ãã¬ã¹ãä»ããŠã®ã¿çžäºã«èªèã§ããŸãã ãšããã§ããã®éæ³ã¯äžã§ã©ããã£ãŠåããŠããã®ããšãããšã
ãããã¯ãŒã¯ã®äœæã¯ããªããžããªã® network.tf ãã¡ã€ã«ã«èšè¿°ãããŠããŸãã ããã§ãå éšã®å ±éãã©ã€ããŒã ãããã¯ãŒã¯ã 172.16.1.0 ã€äœæããç°ãªãã¢ãã€ã©ããªã㣠ãŸãŒã³ã§ 24 ã€ã®ãµãããããããã«æ¥ç¶ããŸã - å éš-a (172.16.2.0/24)ãå éš-b (172.16.3.0/24)ãå éš-c (XNUMX/XNUMX) ïŒã
Terraform ãåæåãããããã¯ãŒã¯ãäœæããŸãã
vozerov@mba:~/events/terraform (master) $ terraform init
... skipped ..
vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_vpc_subnet.internal-a -target yandex_vpc_subnet.internal-b -target yandex_vpc_subnet.internal-c
... skipped ...
Plan: 4 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
yandex_vpc_network.internal: Creating...
yandex_vpc_network.internal: Creation complete after 3s [id=enp2g2rhile7gbqlbrkr]
yandex_vpc_subnet.internal-a: Creating...
yandex_vpc_subnet.internal-b: Creating...
yandex_vpc_subnet.internal-c: Creating...
yandex_vpc_subnet.internal-a: Creation complete after 6s [id=e9b1dad6mgoj2v4funog]
yandex_vpc_subnet.internal-b: Creation complete after 7s [id=e2liv5i4amu52p64ac9p]
yandex_vpc_subnet.internal-c: Still creating... [10s elapsed]
yandex_vpc_subnet.internal-c: Creation complete after 10s [id=b0c2qhsj2vranoc9vhcq]
Apply complete! Resources: 4 added, 0 changed, 0 destroyed.
çŽ æŽãããïŒ ãããã¯ãŒã¯ãäœæããã®ã§ãå éšãµãŒãã¹ãäœæããæºåãæŽããŸããã
ä»®æ³ãã·ã³ã®äœæ
ã¢ããªã±ãŒã·ã§ã³ããã¹ãããã«ã¯ãXNUMX ã€ã®ä»®æ³ãã·ã³ãäœæããã ãã§æžã¿ãŸããæåã®ä»®æ³ãã·ã³ã¯ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠå®è¡ããããã«å¿ èŠã§ãããXNUMX çªç®ã®ä»®æ³ãã·ã³ã¯åä¿¡ã¡ãã»ãŒãžãä¿åããããã«äœ¿çšãã kafka ãå®è¡ããããã«å¿ èŠã§ãã ãããŠãã¢ããªã±ãŒã·ã§ã³ãç£èŠããããã« prometheus ãæ§æããå¥ã®ãã·ã³ãäœæããŸãã
ä»®æ³ãã·ã³ã¯ ansible ã䜿çšããŠæ§æããããããterraform ãéå§ããåã«ãææ°ããŒãžã§ã³ã® ansible ã®ãããããããããšã確èªããŠãã ããã ãããŠãansible galaxy ã§å¿ èŠãªããŒã«ãã€ã³ã¹ããŒã«ããŸãã
vozerov@mba:~/events/terraform (master) $ cd ../ansible/
vozerov@mba:~/events/ansible (master) $ ansible-galaxy install -r requirements.yml
- cloudalchemy-prometheus (master) is already installed, skipping.
- cloudalchemy-grafana (master) is already installed, skipping.
- sansible.kafka (master) is already installed, skipping.
- sansible.zookeeper (master) is already installed, skipping.
- geerlingguy.docker (master) is already installed, skipping.
vozerov@mba:~/events/ansible (master) $
ansible ãã©ã«ããŒå ã«ã¯ãç§ã䜿çšãã .ansible.cfg æ§æãã¡ã€ã«ã®äŸããããŸãã 圹ã«ç«ã€ãããããŸããã
ä»®æ³ãã·ã³ãäœæããåã«ãssh-agent ãå®è¡ãããŠãããssh ããŒãè¿œå ãããŠããããšã確èªããŠãã ãããããã§ãªãå Žåãterraform ã¯äœæããããã·ã³ã«æ¥ç¶ã§ããŸããã ãã¡ãããOS X ã®ãã°ã«ééããŸããã
vozerov@mba:~/events/terraform (master) $ export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
terraform ã®ãããã©ã«ããŒã«å¿ èŠãªãªãœãŒã¹ãäœæããŸãã
vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_compute_instance.build -target yandex_compute_instance.monitoring -target yandex_compute_instance.kafka
yandex_vpc_network.internal: Refreshing state... [id=enp2g2rhile7gbqlbrkr]
data.yandex_compute_image.ubuntu_image: Refreshing state...
yandex_vpc_subnet.internal-a: Refreshing state... [id=e9b1dad6mgoj2v4funog]
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
... skipped ...
Plan: 3 to add, 0 to change, 0 to destroy.
... skipped ...
ãã¹ãŠãæ£åžžã«çµäºããå Žå (æ£åžžã«çµäºããã¯ãã§ã)ã次㮠XNUMX ã€ã®ä»®æ³ãã·ã³ãäœæãããŸãã
- build - ã¢ããªã±ãŒã·ã§ã³ããã¹ãããã³æ§ç¯ããããã®ãã·ã³ã Docker 㯠Ansible ã«ãã£ãŠèªåçã«ã€ã³ã¹ããŒã«ãããŸããã
- ç£èŠ - ç£èŠãã·ã³ - prometheus ãš grafana ãã€ã³ã¹ããŒã«ãããŠããŸãã ãã°ã€ã³/ãã¹ã¯ãŒãæšæº: admin/admin
- kafka ã¯ãkafka ãã€ã³ã¹ããŒã«ãããå°ããªãã·ã³ã§ãããŒã 9092 ã§ã¢ã¯ã»ã¹ã§ããŸãã
ãããããã¹ãŠé©åã«é 眮ãããŠããããšã確èªããŸãããã
vozerov@mba:~/events (master) $ yc compute instance list
+----------------------+------------+---------------+---------+---------------+-------------+
| ID | NAME | ZONE ID | STATUS | EXTERNAL IP | INTERNAL IP |
+----------------------+------------+---------------+---------+---------------+-------------+
| fhm081u8bkbqf1pa5kgj | monitoring | ru-central1-a | RUNNING | 84.201.159.71 | 172.16.1.35 |
| fhmf37k03oobgu9jmd7p | kafka | ru-central1-a | RUNNING | 84.201.173.41 | 172.16.1.31 |
| fhmt9pl1i8sf7ga6flgp | build | ru-central1-a | RUNNING | 84.201.132.3 | 172.16.1.26 |
+----------------------+------------+---------------+---------+---------------+-------------+
ãªãœãŒã¹ãé
眮ãããŠããã®ã§ããããã IP ã¢ãã¬ã¹ãååŸã§ããŸãã 以äžã§ã¯ãIP ã¢ãã¬ã¹ã䜿çšã㊠ssh çµç±ã§æ¥ç¶ããã¢ããªã±ãŒã·ã§ã³ããã¹ãããŸãã terraform ã«æ¥ç¶ããã Cloudflare ã¢ã«ãŠã³ãããæã¡ã®å Žåã¯ãæ°ããäœæãã DNS åãèªç±ã«äœ¿çšããŠãã ããã
ã¡ãªã¿ã«ãä»®æ³ãã·ã³ã®äœææã«å
éš IP ãšå
éš DNS åãæå®ãããããããããã¯ãŒã¯å
ã®ãµãŒããŒã«ååã§ã¢ã¯ã»ã¹ã§ããŸãã
ubuntu@build:~$ ping kafka.ru-central1.internal
PING kafka.ru-central1.internal (172.16.1.31) 56(84) bytes of data.
64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=1 ttl=63 time=1.23 ms
64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=2 ttl=63 time=0.625 ms
^C
--- kafka.ru-central1.internal ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.625/0.931/1.238/0.308 ms
ããã¯ãkafk ã§ãšã³ããã€ã³ããã¢ããªã±ãŒã·ã§ã³ã«ç€ºãã®ã«åœ¹ç«ã¡ãŸãã
ã¢ããªã±ãŒã·ã§ã³ã®çµã¿ç«ãŠ
çŽ æŽãããã§ãããµãŒããŒãšã¢ããªã±ãŒã·ã§ã³ããããŸããããšã¯ãããçµã¿ç«ãŠãŠå ¬éããã ãã§ãã ãã«ãã«ã¯éåžžã® Docker ãã«ãã䜿çšããŸãããã€ã¡ãŒãž ã¹ãã¬ãŒãžãšã㊠Yandex ã®ãµãŒãã¹ã§ããã³ã³ãã㌠ã¬ãžã¹ããªã䜿çšããŸãã ãããããŸãæåã«ã
ã¢ããªã±ãŒã·ã§ã³ããã«ã ãã·ã³ã«ã³ããŒããssh çµç±ã§ãã°ã€ã³ããã€ã¡ãŒãžãã¢ã»ã³ãã«ããŸãã
vozerov@mba:~/events/terraform (master) $ cd ..
vozerov@mba:~/events (master) $ rsync -av app/ [email protected]:app/
... skipped ...
sent 3849 bytes received 70 bytes 7838.00 bytes/sec
total size is 3644 speedup is 0.93
vozerov@mba:~/events (master) $ ssh 84.201.132.3 -l ubuntu
ubuntu@build:~$ cd app
ubuntu@build:~/app$ sudo docker build -t app .
Sending build context to Docker daemon 6.144kB
Step 1/9 : FROM golang:latest AS build
... skipped ...
Successfully built 9760afd8ef65
Successfully tagged app:latest
æŠãã®ååã¯çµãããŸãããããã§ãã¢ããªã±ãŒã·ã§ã³ãèµ·åã㊠kafka ã«éä¿¡ããŠãã¢ããªã±ãŒã·ã§ã³ã®æ©èœããã§ãã¯ã§ããŸãã
ubuntu@build:~/app$ sudo docker run --name app -d -p 8080:8080 app /app/app -kafka=kafka.ru-central1.internal:9092</code>
С лПкалÑМПй ЌаÑОМкО ЌПжМП ПÑпÑавОÑÑ ÑеÑÑПвÑй event О пПÑЌПÑÑеÑÑ ÐœÐ° ПÑвеÑ:
<code>vozerov@mba:~/events (master) $ curl -D - -s -X POST -d '{"key1":"data1"}' http://84.201.132.3:8080/post
HTTP/1.1 200 OK
Content-Type: application/json
Date: Mon, 13 Apr 2020 13:53:54 GMT
Content-Length: 41
{"status":"ok","partition":0,"Offset":0}
vozerov@mba:~/events (master) $
ã¢ããªã±ãŒã·ã§ã³ã¯ãèšé²ã®æåãšãã¡ãã»ãŒãžãå«ãŸããŠããããŒãã£ã·ã§ã³ã® ID ããã³ãªãã»ããã瀺ãå¿çãè¿ããŸããã ããšã¯ãYandex.Cloud ã§ã¬ãžã¹ããªãäœæããããã«ã€ã¡ãŒãžãã¢ããããŒãããã ãã§ã (XNUMX è¡ã䜿çšããŠãããè¡ãæ¹æ³ã¯ãregistry.tf ãã¡ã€ã«ã§èª¬æãããŠããŸã)ã ã¹ãã¬ãŒãžãäœæããŸãã
vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_container_registry.events
... skipped ...
Plan: 1 to add, 0 to change, 0 to destroy.
... skipped ...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
ã³ã³ãã㌠ã¬ãžã¹ããªã§ã®èªèšŒã«ã¯ãoauth ããŒã¯ã³ãiam ããŒã¯ã³ããµãŒãã¹ ã¢ã«ãŠã³ã ããŒã䜿çšãããªã©ãããã€ãã®æ¹æ³ããããŸãã ãããã®ã¡ãœããã®è©³çŽ°ã«ã€ããŠã¯ãããã¥ã¡ã³ããåç
§ããŠãã ããã
vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_iam_service_account.docker -target yandex_resourcemanager_folder_iam_binding.puller -target yandex_resourcemanager_folder_iam_binding.pusher
... skipped ...
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
ããšã¯ããã®ããŒãäœæããã ãã§ãã
vozerov@mba:~/events/terraform (master) $ yc iam key create --service-account-name docker -o key.json
id: ajej8a06kdfbehbrh91p
service_account_id: ajep6d38k895srp9osij
created_at: "2020-04-13T14:00:30Z"
key_algorithm: RSA_2048
ã¹ãã¬ãŒãžã® ID ã«é¢ããæ å ±ãåãåããããŒã転éããŠãã°ã€ã³ããŸãã
vozerov@mba:~/events/terraform (master) $ scp key.json [email protected]:
key.json 100% 2392 215.1KB/s 00:00
vozerov@mba:~/events/terraform (master) $ ssh 84.201.132.3 -l ubuntu
ubuntu@build:~$ cat key.json | sudo docker login --username json_key --password-stdin cr.yandex
WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
ubuntu@build:~$
ã€ã¡ãŒãžãã¬ãžã¹ããªã«ã¢ããããŒãããã«ã¯ãã³ã³ãã㌠ã¬ãžã¹ã㪠ID ãå¿ èŠã§ããyc ãŠãŒãã£ãªãã£ããååŸããŸãã
vozerov@mba:~ $ yc container registry get events
id: crpdgj6c9umdhgaqjfmm
folder_id:
name: events
status: ACTIVE
created_at: "2020-04-13T13:56:41.914Z"
ãã®åŸãç»åã«æ°ããååãã¿ã°ä»ãããŠã¢ããããŒãããŸãã
ubuntu@build:~$ sudo docker tag app cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
ubuntu@build:~$ sudo docker push cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
The push refers to repository [cr.yandex/crpdgj6c9umdhgaqjfmm/events]
8c286e154c6e: Pushed
477c318b05cb: Pushed
beee9f30bc1f: Pushed
v1: digest: sha256:1dd5aaa9dbdde2f60d833be0bed1c352724be3ea3158bcac3cdee41d47c5e380 size: 946
ã€ã¡ãŒãžãæ£åžžã«ããŒããããããšã確èªã§ããŸãã
vozerov@mba:~/events/terraform (master) $ yc container repository list
+----------------------+-----------------------------+
| ID | NAME |
+----------------------+-----------------------------+
| crpe8mqtrgmuq07accvn | crpdgj6c9umdhgaqjfmm/events |
+----------------------+-----------------------------+
ã¡ãªã¿ã«ãLinux ãã·ã³ã« yc ãŠãŒãã£ãªãã£ãã€ã³ã¹ããŒã«ãããšã次ã®ã³ãã³ãã䜿çšã§ããŸãã
yc container registry configure-docker
ããã«ãŒãèšå®ããŸãã
ãŸãšã
ç§ãã¡ã¯å€å€§ãªåŽåãè²»ããããã®çµæ:
- ç§ãã¡ã¯å°æ¥ã®ãµãŒãã¹ã®ã¢ãŒããã¯ãã£ãèãåºããŸããã
- ããžãã¹ ããžãã¯ãå®è£ ããã¢ããªã±ãŒã·ã§ã³ã golang ã§äœæããŸããã
- ç§ãã¡ã¯ãããåéãããã©ã€ããŒãã³ã³ãããŒã¬ãžã¹ããªã«æ³šããŸããã
次ã®ããŒãã§ã¯ãèå³æ·±ãå 容ã«é²ã¿ãŸããã¢ããªã±ãŒã·ã§ã³ãå®çšŒåç°å¢ã«ãªãªãŒã¹ããæåŸã«ã¢ããªã±ãŒã·ã§ã³ãžã®ããŒããéå§ããŸãã åãæ¿ããªãã§ãã ããïŒ
ãã®è³æã¯ããªãŒãã³ ã¯ãŒã¯ã·ã§ãã REBRAIN ãš Yandex.Cloud ã®ãããªé²ç»ã«å«ãŸããŠããŸã: Yandex Cloud ã§ã¯ 10 ç§ããã 000 件ã®ãªã¯ãšã¹ããåãå
¥ããŸã -
ãã®ãããªã€ãã³ãã«ãªã³ã©ã€ã³ã§åå ãããªã¢ã«ã¿ã€ã ã§è³ªåããããšã«èå³ãããå Žåã¯ãã«æ¥ç¶ããŠãã ããã
ãã®ãããªã€ãã³ããäž»å¬ããæ©äŒãäžããŠãã ãã£ã Yandex.Cloud ã«ç¹å¥ã«æè¬ããããŸãã ããããžã®ãªã³ã¯ -
ã¯ã©ãŠãã«ç§»è¡ããå¿
èŠãããå ŽåããŸãã¯ã€ã³ãã©ã¹ãã©ã¯ãã£ã«ã€ããŠè³ªåãããå Žåã¯ã
PS ã§ã¯æã« 2 åã®ç¡æç£æ»ãè¡ã£ãŠãããããããããªãã®ãããžã§ã¯ãããã®ãã¡ã® XNUMX ã€ãšãªãã§ãããã
åºæïŒ habr.com