๋ด์ค๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค. ์ด์ Yandex.Cloud๋ ์๋ฒ๋ฆฌ์ค ์ปดํจํ
์๋น์ค ์ถ์๋ฅผ ๋ฐํํ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ผ๋ถ๋ ์ ํ ์ง๋ถํ์ง ์์ ์๋ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ค์ด์์
๊ทธ๋ฌ๋ ๋ช ๊ฐ์ง ๋์์ค๊ฐ ์์ต๋๋ค. ์ฒซ์งธ, ํผํธ ์ฝ๋์๋ ์ผ๋ถ ์ข ์์ฑ์ด ํ์ํ ์ ์์ผ๋ฉฐ ์ด๋ฅผ ํด๋ผ์ฐ๋๋ก ๋์ด์ค๋ ๊ฒ์ ์ฝ์ง ์์ต๋๋ค. ๋์งธ, ์ผ๋ฐ ์ฑ๋ด์ ๋ํ ์ํ๋ฅผ ์ด๋๊ฐ์ ์ ์ฅํด์ผ ํฉ๋๋ค(๋ฐ๋ผ์ ์ํ ์ ์ฅ). ์๋ฒ๋ฆฌ์ค ๊ธฐ๋ฅ์์ ์ด๋ฅผ ์ํํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น? ์ ์งธ, Alice ๋๋ XNUMX์ด ์๋ ํ๋กฏ์ ์ฌ์ฉํ๋ ์ผ์ข ์ ๋ด์ ์ํ ๋น ๋ฅด๊ณ ๋๋ฌ์ด ๊ธฐ์ ์ ์ด๋ป๊ฒ ์์ฑํ ์ ์์ต๋๊น? ์ค์ ๋ก ์ด ๊ธฐ์ฌ๋ ์ด๋ฌํ ๋์์ค์ ๊ดํ ๊ฒ์ ๋๋ค.
๋๋์ ์ค๋น
์ฐธ์์ฑ์ด ์๋ ๊ฒฝ์ฐ: ํจ์๋ฅผ ํด๋ผ์ฐ๋์ ์
๋ก๋ํ๊ธฐ ์ ์ makefile๋ก ํ์ํ ์ข
์์ฑ์ ์์งํ๊ณ Yandex Object Storage(S3 API ์ง์)์ ๋ํ ์์ ์ํ๋ฅผ ์ ์ฅํ๋ฉฐ ์์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ํ ์์๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
์กฐ๊ธ ๋ ์ฐธ์์ฑ์ด ์๋ ์ฌ๋๋ค์ ์ํด ๋ณต์ก์ฑ์ ๋ํ ๋ด ์ด์ผ๊ธฐ๋ฅผ ์์ํ๊ธฐ ์ ์ ๊ฐ๋จํ ๊ฒ๋ถํฐ ์์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฆ, ๋จ์ผ ํ์ผ echobot ํจ์๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ Dialogs ๊ฐ๋ฐ์ ์ฝ์์ ๋ฑ๋กํ๊ณ ํ
์คํธํฉ๋๋ค. ์ธ๋ถ์ ๋ณด - ์์
์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋ฌด์์ ์ํด ์ธ์ฐ๊ณ ์๋์ง ์ฆ์ ๋๋ผ๊ณ ์ถ๋ค๋ฉด ์จ๋ฆฌ์ค์๊ฒ ๋ฌผ์ด๋ณด์ธ์.
์จ๋ฆฌ์ค: ์๋
ํ์ธ์! ๋น์ ์ "IT ์ด์ธ" ์คํฌ์ ์์ต๋๋ค. ๋ณ๋ค์ด ๋น์ ์๊ฒ ๋ฌด์์ ์ฝ์ํ๋์ง ์์ ๋ณด๋ ค๋ฉด "์์"์ด๋ผ๊ณ ๋งํ์ญ์์ค.
์ฌ์ฉ์: ์์
A: ์ด๋ฆ์ ๋ง์ํด ์ฃผ์ธ์
์ : ๋ฐ์์ฃผ์๋ฆฌ
A: ์ด์ ๋น์ ์ด ํ์ด๋ ์ฐ๋๋ฅผ ๋งํด์ฃผ์ธ์. XNUMX์๋ฆฌ ์ซ์๋ง ์๊ณ ์ถ๊ฐ ๋ด์ฉ์ ์์ต๋๋ค.
์ : ๋์งธ
A: ๋ค์ ์๋ํด ์ฃผ์ธ์. ํ์ด๋ ์ฐ๋๋ฅผ XNUMX์๋ฆฌ๋ก ์
๋ ฅํ์ธ์.
์ : 2002
๋๋จํ! ์ด์ ํ์ด๋ ๋ฌ์ ์ง์ ํ์ญ์์ค.
์ : XNUMX์
๋๋จํ! ๋ง์ง๋ง์ผ๋ก, ์๋
์์ผ์ ์๋ ค์ฃผ์ญ์์ค. ์ซ์, ํ๋ ์๋ฆฌ๋ง ๋ง์ํด ์ฃผ์ญ์์ค.
์ : 18
A: ๊ณ ๋ง์์, Vasisualiy! ์ด์ ์ฐ๋ฆฌ๋ ๋น์ ์ด 17์ธ์ด๊ณ ๋ฌผ๋ณ์๋ฆฌ๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๋ฌผ๋ก , ๋น์ ์ ์ด์ด ์ข์ต๋๋ค! ๋ณ๋ค์ ๋น์ ์๊ฒ ์ด๋ ๊ฒ ๋งํฉ๋๋ค. ะฐ ััะพ ะณะพะฒะพััั ะทะฒัะทะดั, ะฒั ัะทะฝะฐะตัะต, ะทะฐะฟัััะธะฒ ะฝะฐะฒัะบ.
๋ฌธ์ ๋ ์ด๋ฐ ๊ฐ๋จํ ๋ํ๋ผ๋ ์ ์งํ๋ ค๋ฉด ์ฌ์ฉ์์ ์ด๋ฆ๊ณผ ์๋
์์ผ์ ๊ธฐ์ตํด์ผ ํ๋๋ฐ, ์๋ฒ๋ฆฌ์ค ๊ธฐ๋ฅ ํ๊ฒฝ์์๋ ์ด๊ฒ์ด ๊ฒฐ์ฝ ์ฌ์ํ ์ผ์ด ์๋๋ผ๋ ์ ์ด๋ค. ์ปจํ
์คํธ๋ฅผ RAM์ ์ ์ฅํ๊ฑฐ๋ ๋์คํฌ์ ํ์ผ๋ก ์ ์ฅํ ์ ์์ต๋๋ค. Yandex.Cloud๋ ๋์์ ์ฌ๋ฌ ๊ฐ์ ๋จธ์ ์์ ๊ธฐ๋ฅ์ ์คํํ๊ณ ๋ง์๋๋ก ์ ํํ ์ ์์ต๋๋ค. ์ผ์ข
์ ์ธ๋ถ ์ ์ฅ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. Object Storage๋ Yandex.Cloud์์ ์ง์ ์ ์ผ๋ก ์๋นํ ์ ๋ ดํ๊ณ ๋ณต์กํ์ง ์์ ์คํ ๋ฆฌ์ง(์ฆ, ์๋ง๋ ๋น ๋ฆ)๋ก ์ ํ๋์์ต๋๋ค. ๋ฌด๋ฃ ๋์์ผ๋ก ๋ฌด๋ฃ ์ํ ๋ฑ์ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ Object Storage, MongoDB ๋ฐ ๊ธฐํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐ์ดํฐ ์ ์ฅ์์ ์ก์ธ์คํ๋ ค๋ฉด ํจ์ ์ฝ๋์ ํจ๊ป Yandex Functions์ ์ ๋ก๋ํด์ผ ํ๋ ์ผ๋ถ ์ธ๋ถ ์ข ์์ฑ์ด ํ์ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ ์ด๊ฒ์ ํธ๋ฆฌํ๊ฒ ํ๊ณ ์ถ์ต๋๋ค. ๋ถํํ๊ฒ๋ ์์ ํ ํธ๋ฆฌํ์ง๋ ์์ง๋ง(Heroku์ฒ๋ผ) ํ๊ฒฝ์ ๊ตฌ์ถ(ํ์ผ ๋ง๋ค๊ธฐ)ํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ์ฌ ๊ธฐ๋ณธ์ ์ธ ํธ์ํจ์ ๋ง๋ค ์ ์์ต๋๋ค.
์ด์ธ ์คํฌ ๋ฐ๋ ๋ฐฉ๋ฒ
- ์ค๋น: Linux๊ฐ ์ค์น๋ ๋จธ์ ์ผ๋ก ์ด๋ํฉ๋๋ค. ์์น์ ์ผ๋ก Windows์์๋ ์์ ํ ์ ์์ง๋ง ๋ฉ์ดํฌํ์ผ์ ์คํํ๋ ค๋ฉด ๋ช ๊ฐ์ง ๋ง๋ฒ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์จ๋ ์ต์ํ Python 3.6์ด ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค.
- Github์์ ๋ณต์
์ด์ธ ์คํฌ์ ์ . - Y.Cloud์ ๋ฑ๋กํ์ธ์:
https://cloud.yandex.ru - ๋ ๊ฐ์ ๋ฒํท์ ์ง์ ๋ง๋ค์ด ๋ณด์ธ์.
๊ฐ์ฒด ์ ์ฅ์ , ์ด๋ค ์ด๋ฆ์ผ๋ก๋ ๋ถ๋ฌ์ฃผ์ธ์{BUCKET NAME}
ะธtgalice-test-cold-storage
(์ด ๋ ๋ฒ์งธ ์ด๋ฆ์ ์ด์ main.py
๋ด ์). ์ฒซ ๋ฒ์งธ ๋ฒํท์ ๋ฐฐํฌ์๋ง ํ์ํ๊ณ ๋ ๋ฒ์งธ ๋ฒํท์ ๋ํ ์์ ์ํ๋ฅผ ์ ์ฅํ๋ ๋ฐ ํ์ํฉ๋๋ค. - ์์ฑ
์๋น์ค ๊ณ์ , ๊ทธ์๊ฒ ์ญํ ์ ๋ถ์ฌํ์ธ์editor
, ์ด์ ๋ํ ์ ์ ์๊ฒฉ ์ฆ๋ช ์ ์ป์ต๋๋ค.{KEY ID}
ะธ{KEY VALUE}
โ ์ฐ๋ฆฌ๋ ๋ํ์ ์ํ๋ฅผ ๊ธฐ๋กํ๋ ๋ฐ ์ด๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. Ya.Cloud์ ๊ธฐ๋ฅ์ด Ya.Cloud์ ์คํ ๋ฆฌ์ง์ ์ก์ธ์คํ ์ ์์ผ๋ ค๋ฉด ์ด ๋ชจ๋ ๊ฒ์ด ํ์ํฉ๋๋ค. ์ธ์ ๊ฐ๋ ์ธ์ฆ์ด ์๋์ผ๋ก ์ด๋ฃจ์ด์ง๊ธธ ๋ฐ๋ผ์ง๋ง ์ง๊ธ์ ๊ทธ๋ ์ต๋๋ค. - (์ ํ์ฌํญ) ์ค์น
๋ช ๋ น์ค ์ธํฐํ์ด์ค yc
. ์น ์ธํฐํ์ด์ค๋ฅผ ํตํด์๋ ๊ธฐ๋ฅ์ ์์ฑํ ์ ์์ง๋ง CLI๋ ์จ๊ฐ ํ์ ์ด ๋ ๋นจ๋ฆฌ ๋ํ๋๊ธฐ ๋๋ฌธ์ ์ข์ต๋๋ค. - ์ด์ ์ค์ ๋ก ์ข
์์ฑ ์ด์
๋ธ๋ฆฌ๋ฅผ ์ค๋นํ ์ ์์ต๋๋ค. ๊ธฐ์ ์์ ๊ฐ ์๋ ํด๋์ ๋ช
๋ น์ค์์ ์คํํ์ธ์.
make all
. ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋๋ถ๋ถ ํ์์ ๊ฐ์ด ๋ถํ์ํจ)๊ฐ ํด๋์ ์ค์น๋ฉ๋๋ค.dist
. - Object Storage์ ์์ผ๋ก ๋ถ๋๋ค(๋ฒํท์ ๋ฃ๋๋ค)
{BUCKET NAME}
) ์ด์ ๋จ๊ณ์์ ์ป์ ์์นด์ด๋ธdist.zip
. ์ํ๋ ๊ฒฝ์ฐ ๋ช ๋ น์ค์์ ์ด ์์ ์ ์ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์์ ์ฌ์ฉํฉ๋๋ค.AWS CLI . - ์น ์ธํฐํ์ด์ค ๋๋ ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ๋ฆฌ์ค ๊ธฐ๋ฅ ์์ฑ
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
ํจ์๋ฅผ ์๋์ผ๋ก ์์ฑํ ๋ ๋ชจ๋ ๋งค๊ฐ๋ณ์๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฑ์์ง๋๋ค.
์ด์ ์์ฑํ ๊ธฐ๋ฅ์ ๊ฐ๋ฐ์ ์ฝ์์ ํตํด ํ ์คํธํ ํ ๊ธฐ์ ์ ๊ฐ์ ํ๊ณ ๊ณต๊ฐํ ์ ์์ต๋๋ค.
ํ๋ ์๋์๋ ๋ฌด์์ด ์๋์?
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 ์ธํฐํ์ด์ค์ ๋ํ ์ฐ๊ฒฐ์ ์์ฑํฉ๋๋ค. ์ด ์ฐ๊ฒฐ์ด ์ด๋ป๊ฒ ์ง์ ์ฌ์ฉ๋๋์ง ์ฝ์ ์ ์์ต๋๋ค.
๋ง์ง๋ง ์ค์ ํจ์๋ฅผ ์์ฑํฉ๋๋ค alice_handler
โ ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํ ๋ Yandex.Cloud์ ๊ฐ์ ธ์ค๋ผ๊ณ ์ง์ํ ๊ฒ๊ณผ ๋์ผํ ๊ฒ --entrypoint=main.alice_handler
.
์ค์ ๋ก ๊ทธ๊ฒ ์ ๋ถ์
๋๋ค. ์ด์
๋ธ๋ฆฌ์ฉ Makefile, ์ปจํ
์คํธ ์ ์ฅ์ ์ํ S3์ ์ ์ฌํ Object Storage ๋ฐ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ tgalice
. Python์ ์๋ฒ๋ฆฌ์ค ๊ธฐ๋ฅ๊ณผ ํํ๋ ฅ์ด ๊ฒฐํฉ๋๋ฉด ๊ฑด๊ฐํ ์ธ๊ฐ ๊ธฐ์ ์ ๊ฐ๋ฐํ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค.
์ ๋ง๋ค์ด์ผ ํ๋์ง ๋ฌผ์ ์๋ ์์ต๋๋ค. tgalice
? JSON์ ์์ฒญ์์ ์๋ต์ผ๋ก, ์ ์ฅ์์์ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฐ๋๋ก ์ ์กํ๋ ๋ชจ๋ ์ง๋ฃจํ ์ฝ๋๊ฐ ์ฌ๊ธฐ์ ์์ต๋๋ค. ์ผ๋ฐ ์ฝ๋ ์์ฉ ํ๋ก๊ทธ๋จ, "XNUMX์"์ด "XNUMX์"๊ณผ ์ ์ฌํ๋ค๋ ๊ฒ์ ์ดํดํ๋ ๊ธฐ๋ฅ ๋ฐ ๊ฐ๋ํ ์ฌ๋๋ค์ ์ํ ๊ธฐํ NLU๋ ์์ต๋๋ค. ๋ด ์๊ฐ์ ๋ฐ๋ฅด๋ฉด ์ด๊ฒ์ ๊ธฐ์ ์ ์ธ ์ธ๋ถ ์ฌํญ์ ๋๋ฌด ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ง ์๊ณ yaml ํ์ผ์์ ๊ธฐ์ ์ ํ๋กํ ํ์
์ ์ค์ผ์นํ ์ ์์ ๋งํผ ์ด๋ฏธ ์ถฉ๋ถํ ๊ฒ์
๋๋ค.
์ข ๋ ์ง์งํ NLU๋ฅผ ์ํ๋ค๋ฉด ์คํฌ์ ๋ถ์ผ ์ ์์ต๋๋ค.
์, ์ด์ ํฉ๋ฅํ์ธ์
์ถ์ฒ : habr.com