Yandex.Cloud ๋ฐ Python์˜ ์„œ๋ฒ„๋ฆฌ์Šค ๊ธฐ๋Šฅ์—์„œ Alice๋ฅผ ์œ„ํ•œ ์ƒํƒœ ์ €์žฅ ๊ธฐ์ˆ  ์ƒ์„ฑ

๋‰ด์Šค๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด์ œ Yandex.Cloud๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ์ปดํ“จํŒ… ์„œ๋น„์Šค ์ถœ์‹œ๋ฅผ ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. Yandex ํด๋ผ์šฐ๋“œ ๊ธฐ๋Šฅ. ์ฆ‰, ์„œ๋น„์Šค(์˜ˆ: ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜๋Š” ์ฑ—๋ด‡)์— ๋Œ€ํ•œ ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•˜๋ฉด ํด๋ผ์šฐ๋“œ ์ž์ฒด๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ƒ์„ฑ ๋ฐ ์œ ์ง€ํ•˜๊ณ  ๋กœ๋“œ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด ์ด๋ฅผ ๋ณต์ œํ•˜๊ธฐ๋„ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ „ํ˜€ ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  ๋งค์šฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง€๋ถˆ์€ ๊ณ„์‚ฐ ์‹œ๊ฐ„์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€๋Š” ์ „ํ˜€ ์ง€๋ถˆํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋“ค์ด์—์š” ์•จ๋ฆฌ์Šค์˜ ์™ธ๋ถ€ ์Šคํ‚ฌ, ์ฆ‰, ์ฑ—๋ด‡์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์„ ์ž‘์„ฑ, ํ˜ธ์ŠคํŒ… ๋ฐ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜ค๋Š˜๋ถ€ํ„ฐ๋Š” ๊ธฐ์ˆ ์„ ํ˜ธ์ŠคํŒ…ํ•  ํ•„์š”์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ํด๋ผ์šฐ๋“œ์— ์—…๋กœ๋“œํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์„œ๋ฒ„๋ฆฌ์Šค ๊ธฐ๋Šฅ.

๊ทธ๋Ÿฌ๋‚˜ ๋ช‡ ๊ฐ€์ง€ ๋‰˜์•™์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ์งธ, ํ”ผํŠธ ์ฝ”๋“œ์—๋Š” ์ผ๋ถ€ ์ข…์†์„ฑ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ํด๋ผ์šฐ๋“œ๋กœ ๋Œ์–ด์˜ค๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ, ์ผ๋ฐ˜ ์ฑ—๋ด‡์€ ๋Œ€ํ™” ์ƒํƒœ๋ฅผ ์–ด๋”˜๊ฐ€์— ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ์ƒํƒœ ์ €์žฅ). ์„œ๋ฒ„๋ฆฌ์Šค ๊ธฐ๋Šฅ์—์„œ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์…‹์งธ, Alice ๋˜๋Š” XNUMX์ด ์•„๋‹Œ ํ”Œ๋กฏ์„ ์‚ฌ์šฉํ•˜๋Š” ์ผ์ข…์˜ ๋ด‡์„ ์œ„ํ•œ ๋น ๋ฅด๊ณ  ๋”๋Ÿฌ์šด ๊ธฐ์ˆ ์„ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์‹ค์ œ๋กœ ์ด ๊ธฐ์‚ฌ๋Š” ์ด๋Ÿฌํ•œ ๋‰˜์•™์Šค์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Yandex.Cloud ๋ฐ Python์˜ ์„œ๋ฒ„๋ฆฌ์Šค ๊ธฐ๋Šฅ์—์„œ Alice๋ฅผ ์œ„ํ•œ ์ƒํƒœ ์ €์žฅ ๊ธฐ์ˆ  ์ƒ์„ฑ

๋„๋•์  ์ค€๋น„

์ฐธ์„์„ฑ์ด ์—†๋Š” ๊ฒฝ์šฐ: ํ•จ์ˆ˜๋ฅผ ํด๋ผ์šฐ๋“œ์— ์—…๋กœ๋“œํ•˜๊ธฐ ์ „์— makefile๋กœ ํ•„์š”ํ•œ ์ข…์†์„ฑ์„ ์ˆ˜์ง‘ํ•˜๊ณ  Yandex Object Storage(S3 API ์ง€์›)์— ๋Œ€ํ™” ์ƒ์ž ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋ฉฐ ์ž์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€ํ™” ์ƒ์ž๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ‹ฐ๊ฐˆ๋ฆฌ์ฒด. ๊ทธ ๊ฒฐ๊ณผ, ์ด๋Ÿฌํ•œ ๋ฐ๋ชจ ์Šคํ‚ฌ. ์ด์ œ ์ด ๋ชจ๋“  ๊ฒƒ์„ ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์กฐ๊ธˆ ๋œ ์ฐธ์„์„ฑ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๋ณต์žก์„ฑ์— ๋Œ€ํ•œ ๋‚ด ์ด์•ผ๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๊ฐ„๋‹จํ•œ ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‹จ์ผ ํŒŒ์ผ echobot ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ Dialogs ๊ฐœ๋ฐœ์ž ์ฝ˜์†”์— ๋“ฑ๋กํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. ์„ธ๋ถ€์ •๋ณด - ์—์„œ ๋Œ€ํ™” ๋ธ”๋กœ๊ทธ ะธ ํด๋ผ์šฐ๋“œ ๋ฌธ์„œ. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ์•ผ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋ฌด์—‡์„ ์œ„ํ•ด ์‹ธ์šฐ๊ณ  ์žˆ๋Š”์ง€ ์ฆ‰์‹œ ๋Š๋ผ๊ณ  ์‹ถ๋‹ค๋ฉด ์•จ๋ฆฌ์Šค์—๊ฒŒ ๋ฌผ์–ด๋ณด์„ธ์š”."IT ์šด์„ธ" ์Šคํ‚ฌ์„ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”'. ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ๋Œ€ํ™”์ƒ์ž๊ฐ€ ๋‚˜ํƒ€๋‚˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•จ๋ฆฌ์Šค: ์•ˆ๋…•ํ•˜์„ธ์š”! ๋‹น์‹ ์€ "IT ์šด์„ธ" ์Šคํ‚ฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๋“ค์ด ๋‹น์‹ ์—๊ฒŒ ๋ฌด์—‡์„ ์•ฝ์†ํ•˜๋Š”์ง€ ์•Œ์•„ ๋ณด๋ ค๋ฉด "์‹œ์ž‘"์ด๋ผ๊ณ  ๋งํ•˜์‹ญ์‹œ์˜ค.
์‚ฌ์šฉ์ž: ์‹œ์ž‘
A: ์ด๋ฆ„์„ ๋ง์”€ํ•ด ์ฃผ์„ธ์š”
์œ : ๋ฐ”์‹œ์ฃผ์•Œ๋ฆฌ
A: ์ด์ œ ๋‹น์‹ ์ด ํƒœ์–ด๋‚œ ์—ฐ๋„๋ฅผ ๋งํ•ด์ฃผ์„ธ์š”. XNUMX์ž๋ฆฌ ์ˆซ์ž๋งŒ ์žˆ๊ณ  ์ถ”๊ฐ€ ๋‚ด์šฉ์€ ์—†์Šต๋‹ˆ๋‹ค.
์œ : ๋‘˜์งธ
A: ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”. ํƒœ์–ด๋‚œ ์—ฐ๋„๋ฅผ XNUMX์ž๋ฆฌ๋กœ ์ž…๋ ฅํ•˜์„ธ์š”.
์œ : 2002
๋Œ€๋‹จํ•œ! ์ด์ œ ํƒœ์–ด๋‚œ ๋‹ฌ์„ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค.
์œ : XNUMX์›”
๋Œ€๋‹จํ•œ! ๋งˆ์ง€๋ง‰์œผ๋กœ, ์ƒ๋…„์›”์ผ์„ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ์ˆซ์ž, ํ•œ๋‘ ์ž๋ฆฌ๋งŒ ๋ง์”€ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.
์œ : 18
A: ๊ณ ๋งˆ์›Œ์š”, Vasisualiy! ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์ด 17์„ธ์ด๊ณ  ๋ฌผ๋ณ‘์ž๋ฆฌ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๋‹น์‹ ์€ ์šด์ด ์ข‹์Šต๋‹ˆ๋‹ค! ๋ณ„๋“ค์€ ๋‹น์‹ ์—๊ฒŒ ์ด๋ ‡๊ฒŒ ๋งํ•ฉ๋‹ˆ๋‹ค. ะฐ ั‡ั‚ะพ ะณะพะฒะพั€ัั‚ ะทะฒั‘ะทะดั‹, ะฒั‹ ัƒะทะฝะฐะตั‚ะต, ะทะฐะฟัƒัั‚ะธะฒ ะฝะฐะฒั‹ะบ.

๋ฌธ์ œ๋Š” ์ด๋Ÿฐ ๊ฐ„๋‹จํ•œ ๋Œ€ํ™”๋ผ๋„ ์œ ์ง€ํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„๊ณผ ์ƒ๋…„์›”์ผ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์„œ๋ฒ„๋ฆฌ์Šค ๊ธฐ๋Šฅ ํ™˜๊ฒฝ์—์„œ๋Š” ์ด๊ฒƒ์ด ๊ฒฐ์ฝ” ์‚ฌ์†Œํ•œ ์ผ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์ด๋‹ค. ์ปจํ…์ŠคํŠธ๋ฅผ RAM์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋””์Šคํฌ์— ํŒŒ์ผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Yandex.Cloud๋Š” ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐ€์ƒ ๋จธ์‹ ์—์„œ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๊ณ  ๋งˆ์Œ๋Œ€๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์ข…์˜ ์™ธ๋ถ€ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Object Storage๋Š” Yandex.Cloud์—์„œ ์ง์ ‘์ ์œผ๋กœ ์ƒ๋‹นํžˆ ์ €๋ ดํ•˜๊ณ  ๋ณต์žกํ•˜์ง€ ์•Š์€ ์Šคํ† ๋ฆฌ์ง€(์ฆ‰, ์•„๋งˆ๋„ ๋น ๋ฆ„)๋กœ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌด๋ฃŒ ๋Œ€์•ˆ์œผ๋กœ ๋ฌด๋ฃŒ ์ž‘ํ’ˆ ๋“ฑ์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋”” ๋ชฌ๊ฐ€ ์–ด๋”˜๊ฐ€ ๋ฉ€๋ฆฌ. Object Storage(S3 ์ธํ„ฐํŽ˜์ด์Šค ์ง€์›)์™€ Mongo ๋ชจ๋‘๋ฅผ ์œ„ํ•œ ํŽธ๋ฆฌํ•œ Python ๋ž˜ํผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” Object Storage, MongoDB ๋ฐ ๊ธฐํƒ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด ํ•จ์ˆ˜ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ Yandex Functions์— ์—…๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ์ผ๋ถ€ ์™ธ๋ถ€ ์ข…์†์„ฑ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์ด๊ฒƒ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ์™„์ „ํžˆ ํŽธ๋ฆฌํ•˜์ง€๋Š” ์•Š์ง€๋งŒ(Heroku์ฒ˜๋Ÿผ) ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•(ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ)ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๊ธฐ๋ณธ์ ์ธ ํŽธ์•ˆํ•จ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šด์„ธ ์Šคํ‚ฌ ๋ฐœ๋™ ๋ฐฉ๋ฒ•

  1. ์ค€๋น„: Linux๊ฐ€ ์„ค์น˜๋œ ๋จธ์‹ ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์›์น™์ ์œผ๋กœ Windows์—์„œ๋„ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฉ”์ดํฌํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ๋งˆ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์–ด์จŒ๋“  ์ตœ์†Œํ•œ Python 3.6์ด ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. Github์—์„œ ๋ณต์ œ ์šด์„ธ ์Šคํ‚ฌ์˜ ์˜ˆ.
  3. Y.Cloud์— ๋“ฑ๋กํ•˜์„ธ์š”: https://cloud.yandex.ru
  4. ๋‘ ๊ฐœ์˜ ๋ฒ„ํ‚ท์„ ์ง์ ‘ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”. ๊ฐ์ฒด ์ €์žฅ์†Œ, ์–ด๋–ค ์ด๋ฆ„์œผ๋กœ๋“  ๋ถˆ๋Ÿฌ์ฃผ์„ธ์š” {BUCKET NAME} ะธ tgalice-test-cold-storage (์ด ๋‘ ๋ฒˆ์งธ ์ด๋ฆ„์€ ์ด์ œ main.py ๋‚ด ์˜ˆ). ์ฒซ ๋ฒˆ์งธ ๋ฒ„ํ‚ท์€ ๋ฐฐํฌ์—๋งŒ ํ•„์š”ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ๋ฒ„ํ‚ท์€ ๋Œ€ํ™” ์ƒ์ž ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  5. ์ƒ์„ฑ ์„œ๋น„์Šค ๊ณ„์ •, ๊ทธ์—๊ฒŒ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜์„ธ์š” editor, ์ด์— ๋Œ€ํ•œ ์ •์  ์ž๊ฒฉ ์ฆ๋ช…์„ ์–ป์Šต๋‹ˆ๋‹ค. {KEY ID} ะธ {KEY VALUE} โ€” ์šฐ๋ฆฌ๋Š” ๋Œ€ํ™”์˜ ์ƒํƒœ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฐ ์ด๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Ya.Cloud์˜ ๊ธฐ๋Šฅ์ด Ya.Cloud์˜ ์Šคํ† ๋ฆฌ์ง€์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ์ด ๋ชจ๋“  ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€๋Š” ์ธ์ฆ์ด ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์ง€๊ธธ ๋ฐ”๋ผ์ง€๋งŒ ์ง€๊ธˆ์€ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.
  6. (์„ ํƒ์‚ฌํ•ญ) ์„ค์น˜ ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค yc. ์›น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ๋„ ๊ธฐ๋Šฅ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ CLI๋Š” ์˜จ๊ฐ– ํ˜์‹ ์ด ๋” ๋นจ๋ฆฌ ๋‚˜ํƒ€๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์Šต๋‹ˆ๋‹ค.
  7. ์ด์ œ ์‹ค์ œ๋กœ ์ข…์†์„ฑ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ค€๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์ˆ  ์˜ˆ์ œ๊ฐ€ ์žˆ๋Š” ํด๋”์˜ ๋ช…๋ น์ค„์—์„œ ์‹คํ–‰ํ•˜์„ธ์š”. make all. ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋Œ€๋ถ€๋ถ„ ํ‰์†Œ์™€ ๊ฐ™์ด ๋ถˆํ•„์š”ํ•จ)๊ฐ€ ํด๋”์— ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. dist.
  8. Object Storage์— ์†์œผ๋กœ ๋ถ“๋Š”๋‹ค(๋ฒ„ํ‚ท์— ๋„ฃ๋Š”๋‹ค) {BUCKET NAME}) ์ด์ „ ๋‹จ๊ณ„์—์„œ ์–ป์€ ์•„์นด์ด๋ธŒ dist.zip. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋ช…๋ น์ค„์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. AWS CLI.
  9. ์›น ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋ฆฌ์Šค ๊ธฐ๋Šฅ ์ƒ์„ฑ yc. ์œ ํ‹ธ๋ฆฌํ‹ฐ์˜ ๊ฒฝ์šฐ ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

yc serverless function version create
    --function-name=horoscope
    --environment=AWS_ACCESS_KEY_ID={KEY ID},AWS_SECRET_ACCESS_KEY={KEY VALUE}
    --runtime=python37
    --package-bucket-name={BUCKET NAME}
    --package-object-name=dist.zip
    --entrypoint=main.alice_handler
    --memory=128M
    --execution-timeout=3s

ํ•จ์ˆ˜๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑํ•  ๋•Œ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค.

์ด์ œ ์ƒ์„ฑํ•œ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœ์ž ์ฝ˜์†”์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธํ•œ ํ›„ ๊ธฐ์ˆ ์„ ๊ฐœ์„ ํ•˜๊ณ  ๊ณต๊ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Yandex.Cloud ๋ฐ Python์˜ ์„œ๋ฒ„๋ฆฌ์Šค ๊ธฐ๋Šฅ์—์„œ Alice๋ฅผ ์œ„ํ•œ ์ƒํƒœ ์ €์žฅ ๊ธฐ์ˆ  ์ƒ์„ฑ

ํ›„๋“œ ์•„๋ž˜์—๋Š” ๋ฌด์—‡์ด ์žˆ๋‚˜์š”?

makefile์—๋Š” ์‹ค์ œ๋กœ ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๊ณ  ์ด๋ฅผ ์•„์นด์ด๋ธŒ์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. dist.zip, ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

mkdir -p dist/
pip3 install -r requirements.txt --target dist/ 
cp main.py dist/main.py
cp form.yaml dist/form.yaml
cd dist && zip --exclude '*.pyc' -r ../dist.zip ./*

๋‚˜๋จธ์ง€๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋œ ๋ช‡ ๊ฐ€์ง€ ๊ฐ„๋‹จํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. tgalice. ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ„์šฐ๋Š” ๊ณผ์ •์€ ๊ตฌ์„ฑ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. form.yaml:

form_name: 'horoscope_form'
start:
  regexp: 'ัั‚ะฐั€ั‚|ะฝะฐั‡(ะฐั‚ัŒ|ะฝะธ)'
  suggests:
    - ะกั‚ะฐั€ั‚
fields:
  - name: 'name'
    question: ะŸะพะถะฐะปัƒะนัั‚ะฐ, ะฝะฐะทะพะฒะธั‚ะต ัะฒะพั‘ ะธะผั.
  - name: 'year'
    question: ะขะตะฟะตั€ัŒ ัะบะฐะถะธั‚ะต ะผะฝะต ะณะพะด ะฒะฐัˆะตะณะพ ั€ะพะถะดะตะฝะธั. ะขะพะปัŒะบะพ ั‡ะตั‚ั‹ั€ะต ั†ะธั„ั€ั‹, ะฝะธั‡ะตะณะพ ะปะธัˆะฝะตะณะพ.
    validate_regexp: '^[0-9]{4}$'
    validate_message: ะŸะพะถะฐะปัƒะนัั‚ะฐ, ะฟะพะฟั€ะพะฑัƒะนั‚ะต ะตั‰ั‘ ั€ะฐะท. ะะฐะทะพะฒะธั‚ะต ะณะพะด ะฒะฐัˆะตะณะพ ั€ะพะถะดะตะฝะธั - ั‡ะตั‚ั‹ั€ะต ั†ะธั„ั€ั‹.
  - name: 'month'
    question: ะ—ะฐะผะตั‡ะฐั‚ะตะปัŒะฝะพ! ะขะตะฟะตั€ัŒ ะฝะฐะทะพะฒะธั‚ะต ะผะตััั† ะฒะฐัˆะตะณะพ ั€ะพะถะดะตะฝะธั.
    options:
      - ัะฝะฒะฐั€ัŒ
     ...
      - ะดะตะบะฐะฑั€ัŒ
    validate_message: ะขะพ, ั‡ั‚ะพ ะฒั‹ ะฝะฐะทะฒะฐะปะธ, ะฝะต ะฟะพั…ะพะถะต ะฝะฐ ะผะตััั†. ะŸะพะถะฐะปัƒะนัั‚ะฐ, ะฝะฐะทะพะฒะธั‚ะต ะผะตััั† ะฒะฐัˆะตะณะพ ั€ะพะถะดะตะฝะธั, ะฑะตะท ะดั€ัƒะณะธั… ัะปะพะฒ.
  - name: 'day'
    question: ะžั‚ะปะธั‡ะฝะพ! ะะฐะบะพะฝะตั†, ะฝะฐะทะพะฒะธั‚ะต ะผะฝะต ะดะฐั‚ัƒ ะฒะฐัˆะตะณะพ ั€ะพะถะดะตะฝะธั - ั‚ะพะปัŒะบะพ ั‡ะธัะปะพ, ะฒัะตะณะพ ะพะดะฝะฐ ะธะปะธ ะดะฒะต ั†ะธั„ั€ั‹.
    validate_regexp: '[0123]?d$'
    validate_message: ะŸะพะถะฐะปัƒะนัั‚ะฐ, ะฟะพะฟั€ะพะฑัƒะนั‚ะต ะตั‰ั‘ ั€ะฐะท. ะ’ะฐะผ ะฝัƒะถะฝะพ ะฝะฐะทะฒะฐั‚ัŒ ั‡ะธัะปะพ ัะฒะพะตะณะพ ั€ะพะถะดะตะฝะธั (ะฝะฐะฟั€ะธะผะตั€, ะดะฒะฐะดั†ะฐั‚ะพะต); ัั‚ะพ ะพะดะฝะฐ ะธะปะธ ะดะฒะต ั†ะธั„ั€ั‹.

์ด ๊ตฌ์„ฑ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ž‘์—…์€ Python ํด๋ž˜์Šค์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

class CheckableFormFiller(tgalice.dialog_manager.form_filling.FormFillingDialogManager):
    SIGNS = {
        'ัะฝะฒะฐั€ัŒ': 'ะšะพะทะตั€ะพะณ',
        ...
    }

    def handle_completed_form(self, form, user_object, ctx):
        response = tgalice.dialog_manager.base.Response(
            text='ะกะฟะฐัะธะฑะพ, {}! ะขะตะฟะตั€ัŒ ะผั‹ ะทะฝะฐะตะผ: ะฒะฐะผ {} ะปะตั‚, ะธ ะฒั‹ {}. n'
                 'ะ’ะพั‚ ัั‚ะพ ะฒะฐะผ, ะบะพะฝะตั‡ะฝะพ, ะฟะพะฒะตะทะปะพ! ะ—ะฒั‘ะทะดั‹ ะณะพะฒะพั€ัั‚ ะฒะฐะผ: {}'.format(
                form['fields']['name'],
                2019 - int(form['fields']['year']),
                self.SIGNS[form['fields']['month']],
                random.choice(FORECASTS),
            ),
            user_object=user_object,
        )
        return response

๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค FormFillingDialogManager "์–‘์‹" ์ž‘์„ฑ ๋ฐ ํ•˜์œ„ ํด๋ž˜์Šค ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. handle_completed_form ์ค€๋น„๊ฐ€ ๋˜๋ฉด ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ฃผ์š” ๋Œ€ํ™” ํ๋ฆ„ ์™ธ์—๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ธ์‚ฌ๋ฅผ ํ•ด์•ผ ํ•˜๊ณ  "help" ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„์›€์„ ์ฃผ๊ณ  "exit" ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํ‚ฌ์„ ํ•ด์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด tgalice ํ…œํ”Œ๋ฆฟ๋„ ์žˆ์œผ๋ฏ€๋กœ ์ „์ฒด ๋Œ€ํ™” ๊ด€๋ฆฌ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฐ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

dm = tgalice.dialog_manager.CascadeDialogManager(
    tgalice.dialog_manager.GreetAndHelpDialogManager(
        greeting_message=DEFAULT_MESSAGE,
        help_message=DEFAULT_MESSAGE,
        exit_message='ะ”ะพ ัะฒะธะดะฐะฝะธั, ะฟั€ะธั…ะพะดะธั‚ะต ะฒ ะฝะฐะฒั‹ะบ "ะะนั‚ะธัˆะฝั‹ะน ะณะพั€ะพัะบะพะฟ" ะตั‰ั‘!'
    ),
    CheckableFormFiller(`form.yaml`, default_message=DEFAULT_MESSAGE)
)

CascadeDialogManager ์ด๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋Œ€ํ™”์˜ ํ˜„์žฌ ์ƒํƒœ์— ์ฐจ๋ก€๋กœ ์ ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ ์ ์ ˆํ•œ ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ™” ์ƒ์ž ๊ด€๋ฆฌ์ž๋Š” ๊ฐ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ Python ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Response๋ด‡์ด ์‹คํ–‰๋˜๋Š” ์œ„์น˜์— ๋”ฐ๋ผ ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜๋˜๊ฑฐ๋‚˜ Alice ๋˜๋Š” Telegram์˜ ๋ฉ”์‹œ์ง€๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ๋Œ€ํ™”์˜ ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด ์ฃผ๋ฐฉ ์ „์ฒด๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. DialogConnector, Yandex Functions์—์„œ ๊ธฐ์ˆ ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

...
session = boto3.session.Session()
s3 = session.client(
    service_name='s3',
    endpoint_url='https://storage.yandexcloud.net',
    aws_access_key_id=os.environ['AWS_ACCESS_KEY_ID'],
    aws_secret_access_key=os.environ['AWS_SECRET_ACCESS_KEY'],
    region_name='ru-central1',
)
storage = tgalice.session_storage.S3BasedStorage(s3_client=s3, bucket_name='tgalice-test-cold-storage')
connector = tgalice.dialog_connector.DialogConnector(dialog_manager=dm, storage=storage)
alice_handler = connector.serverless_alice_handler

๋ณด์‹œ๋‹ค์‹œํ”ผ, ์ด ์ฝ”๋“œ์˜ ๋Œ€๋ถ€๋ถ„์€ Object Storage์˜ S3 ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ์—ฐ๊ฒฐ์ด ์–ด๋–ป๊ฒŒ ์ง์ ‘ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Tgalice ์ฝ”๋“œ์—์„œ.
๋งˆ์ง€๋ง‰ ์ค„์€ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค alice_handler โ€” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ๋•Œ Yandex.Cloud์— ๊ฐ€์ ธ์˜ค๋ผ๊ณ  ์ง€์‹œํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ฒƒ --entrypoint=main.alice_handler.

์‹ค์ œ๋กœ ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ์–ด์…ˆ๋ธ”๋ฆฌ์šฉ Makefile, ์ปจํ…์ŠคํŠธ ์ €์žฅ์„ ์œ„ํ•œ S3์™€ ์œ ์‚ฌํ•œ Object Storage ๋ฐ Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ tgalice. Python์˜ ์„œ๋ฒ„๋ฆฌ์Šค ๊ธฐ๋Šฅ๊ณผ ํ‘œํ˜„๋ ฅ์ด ๊ฒฐํ•ฉ๋˜๋ฉด ๊ฑด๊ฐ•ํ•œ ์ธ๊ฐ„ ๊ธฐ์ˆ ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์™œ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ๋Š”์ง€ ๋ฌผ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. tgalice? JSON์„ ์š”์ฒญ์—์„œ ์‘๋‹ต์œผ๋กœ, ์ €์žฅ์†Œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐ˜๋Œ€๋กœ ์ „์†กํ•˜๋Š” ๋ชจ๋“  ์ง€๋ฃจํ•œ ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์ฝ”๋“œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ, "XNUMX์›”"์ด "XNUMX์›”"๊ณผ ์œ ์‚ฌํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๋Š” ๊ธฐ๋Šฅ ๋ฐ ๊ฐ€๋‚œํ•œ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ๊ธฐํƒ€ NLU๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— ๋”ฐ๋ฅด๋ฉด ์ด๊ฒƒ์€ ๊ธฐ์ˆ ์ ์ธ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋„ˆ๋ฌด ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด์ง€ ์•Š๊ณ  yaml ํŒŒ์ผ์—์„œ ๊ธฐ์ˆ ์˜ ํ”„๋กœํ† ํƒ€์ž…์„ ์Šค์ผ€์น˜ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ด๋ฏธ ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ข€ ๋” ์ง„์ง€ํ•œ NLU๋ฅผ ์›ํ•œ๋‹ค๋ฉด ์Šคํ‚ฌ์— ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์‚ฌ ๋˜๋Š” ๋”ฅํŒŒ๋ธ”๋กœํ”„, ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด ํŠนํžˆ ์„œ๋ฒ„๋ฆฌ์Šค์—์„œ ํƒฌ๋ฒ„๋ฆฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ ๋Œ„์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋”ฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹œ๊ฐ์  ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—์ด๋ฐ€๋กœ์ง. tgalice๋ฅผ ๋งŒ๋“ค ๋•Œ ์ผ์ข…์˜ ์ค‘๊ฐ„ ๊ฒฝ๋กœ๋ฅผ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๋ด…์‹œ๋‹ค.

์ž, ์ด์ œ ํ•ฉ๋ฅ˜ํ•˜์„ธ์š” ์•จ๋ฆฌ์Šค ๊ธฐ์ˆ  ๊ฐœ๋ฐœ์ž ์ฑ„ํŒ…, ์ฝ๋‹ค ๋ฌธ์„œ, ๋ฉ‹์ง„ ์ž‘ํ’ˆ์„ ๋งŒ๋“ค์–ด๋ณด์„ธ์š” ๊ธฐ์ˆ !

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€