์ธ๋ถ ์ก์ธ์ค ํตํฉ ์์ฑ ๋ฐ ์ฌ์ฉํ๊ธฐยถ
ํน์ ์ธ๋ถ ๋คํธ์ํฌ ์์น์ ๋ํ ์ก์ธ์ค๋ฅผ ํ์ฑํํ๊ธฐ ์ํด ์ธ๋ถ ์์น๋ฅผ ์ง์ ํ๋ ๋คํธ์ํฌ ๊ท์น ๋ชฉ๋ก๊ณผ ์ฌ์ฉํ๋๋ก ํ์ฉ๋ ์ํฌ๋ฆฟ ๋ชฉ๋ก์ ์ง์ ํ๋ ์ธ๋ถ ์ก์ธ์ค ํตํฉ์ ์์ฑํฉ๋๋ค. CREATE FUNCTION ๋๋ CREATE PROCEDURE๋ก UDF ๋๋ ํ๋ก์์ ๋ฅผ ์์ฑํ ๋ EXTERNAL_ACCESS_INTEGRATIONS ์ ์ ์ฌ์ฉํ์ฌ ์ด ํตํฉ์ ์ฐธ์กฐํจ์ผ๋ก์จ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๊ฐ ์ํฌ๋ฆฟ์ ์ฌ์ฉํ์ฌ ์ธ๋ถ ์์น์ ์ธ์ฆํ๋๋ก ํ์ฉํ ์ ์์ต๋๋ค.
๊ด๋ฆฌ์๋ EXTERNAL_ACCESS_HISTORY ๋ทฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ ๋คํธ์ํฌ ์์น์ ๋ํ ์์ฒญ์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค.
์ธ๋ถ ์ก์ธ์ค๋ฅผ ์ค์ ํ๊ณ ์ฌ์ฉํ๋ ๋ฐ ํ์ฉํ ์ ์๋ ์ฝ๋ ์์ ์ ์ฒด ์ํ์ค๋ ์ธ๋ถ ๋คํธ์ํฌ ์ก์ธ์ค ์์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
UDF ๋๋ ํ๋ก์์ ์์ ์ธ๋ถ ๋คํธ์ํฌ ์์น์ ๋ํ ์ก์ธ์ค๋ฅผ ์ค์ ํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ญ์์ค.
๊ณต์ฉ ์ธํฐ๋ท ๋๋ ๋น๊ณต๊ฐ ์ฐ๊ฒฐ ์ ์ฌ์ฉํ์ฌ ์ธ๋ถ ๋คํธ์ํฌ ์์น์ ์ฐ๊ฒฐํ ์ง ์ฌ๋ถ๋ฅผ ์ ํํฉ๋๋ค.
์ธ๋ถ ๋คํธ์ํฌ ์์น๋ฅผ ๋ํ๋ด๋ ๋คํธ์ํฌ ๊ท์น์ ๋ง๋ญ๋๋ค.
์๊ฒฉ ์ฆ๋ช ์ ์ง๋ฅผ ์ํ ์ํฌ๋ฆฟ์ ๋ง๋ญ๋๋ค.
์ธ๋ถ ์์น์ ์ก์ธ์คํ ๋ ์ฒ๋ฆฌ๊ธฐ์์ ์ฌ์ฉํ ์ ์๋๋ก ์ํฌ๋ฆฟ๊ณผ ๋คํธ์ํฌ ๊ท์น์ ์ง๊ณํ์ฌ ์ธ๋ถ ์ก์ธ์ค ํตํฉ์ ๋ง๋ญ๋๋ค.
๊ฐ์ผ๋ก ๋ํ๋ธ ํตํฉ ์ด๋ฆ์ผ๋ก ์ค์ ๋ EXTERNAL_ACCESS_INTEGRATIONS ๋งค๊ฐ ๋ณ์๋ก UDF ๋๋ ํ๋ก์์ ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ธ๋ถ ๋คํธ์ํฌ ์์น์ ์ก์ธ์คํ๊ณ ํตํฉ์์ ๋คํธ์ํฌ ๊ท์น๊ณผ ์ํฌ๋ฆฟ์ผ๋ก ์ง์ ๋ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ ์ ์๋ ํจ์ ๋๋ ํ๋ก์์ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค.
์ฒ๋ฆฌ๊ธฐ ์ฝ๋์์ ์ํฌ๋ฆฟ์ ๋ด์ฉ์ ์ก์ธ์คํ ์ ์๋๋ก SECRET ๋งค๊ฐ ๋ณ์๋ฅผ ํตํฉ์ ํฌํจ๋ ์ํฌ๋ฆฟ ์ด๋ฆ์ผ๋ก ๋ฐ๋ก ์ค์ ํฉ๋๋ค.
ํจ์ ๋๋ ํ๋ก์์ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋์์ ํตํฉ์ ํฌํจ๋ ๋คํธ์ํฌ ๊ท์น์ ์ง์ ๋ ์ธ๋ถ ๋คํธ์ํฌ ์์น์ ์ก์ธ์คํฉ๋๋ค. ํ์ฉ๋ ๋คํธ์ํฌ ๊ท์น์ ์ง์ ๋์ง ์์ ๋คํธ์ํฌ ์์น์ ๋ํ ์ก์ธ์ค ์๋๋ ๊ฑฐ๋ถ๋ฉ๋๋ค.
๊ณต์ฉ ์ธํฐ๋ท ๋๋ ๋น๊ณต๊ฐ ์ฐ๊ฒฐ ์ ํํ๊ธฐยถ
์ธ๋ถ ๋คํธ์ํฌ ์์น์ ์ฐ๊ฒฐํ ๋ Snowflake์์ ์ธ๋ถ ๋คํธ์ํฌ ์์น๋ก์ ์ฐ๊ฒฐ์ ๊ณต์ฉ ์ธํฐ๋ท์ ํตํ๊ฑฐ๋ Azure Private Link (Microsoft ์ค๋ช ์) ๋๋ AWS PrivateLink (AWS ์ค๋ช ์)๋ฅผ ํตํด ๋น๊ณต๊ฐ ์ฐ๊ฒฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ธ๋ถ ๋คํธ์ํฌ ์์น์ ๋ํ ์ฐ๊ฒฐ์ ๋ณด์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋น๊ณต๊ฐ ์ฐ๊ฒฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋น๊ณต๊ฐ ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ฉด ๋ณด์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
๊ณต์ฉ ์ธํฐ๋ท์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ํญ๋ชฉ์ ๋ค์ ์น์ ์ ์๋ ์ง์นจ์ ๋ฐ๋ฅด์ญ์์ค.
๋น๊ณต๊ฐ ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ํธ ์์ฉ์ ๊ตฌ์ฑํ๋ ์ฌ๋์๊ฒ ACCOUNTADMIN ์ญํ ์ด ํ ๋น๋์ด ์์ด์ผ ํฉ๋๋ค. ๋ํ Snowflake ๊ณ์ ์ Business Critical Edition ์ด์์ด์ด์ผ ํฉ๋๋ค. Azure Private Link ๋๋ AWS PrivateLink ์ฌ์ฉ ์ ์ถ๊ฐ ์ฒญ๊ตฌ ์๊ธ์ด ๋ฐ์ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ค์ ํญ๋ชฉ๋ฅผ ๊ฒํ ํ์ญ์์ค.
์์๋ฐ์ด๋ ๋คํธ์ํฌ ํธ๋ํฝ์ ์ํ ๋น๊ณต๊ฐ ์ฐ๊ฒฐ
๋น๊ณต๊ฐ ์ฐ๊ฒฐ ์๋ํฌ์ธํธ(AWS)๋ฅผ ๊ด๋ฆฌํ์ญ์์ค.
๋ค์์ผ๋ก, ์๋ ํญ๋ชฉ ์ค ํ๋์ ํ์๋ ๋๋ก ๋น๊ณต๊ฐ ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋๋ก ์ธ๋ถ ๋คํธ์ํฌ ์์น์ ๋ํ ์ก์ธ์ค๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
์ธ๋ถ ๋คํธ์ํฌ ์์น๋ฅผ ๋ํ๋ด๋ ๋คํธ์ํฌ ๊ท์น ๋ง๋ค๊ธฐยถ
CREATE NETWORK RULE ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์ธ๋ถ ๋คํธ์ํฌ์ ์์น์ ์ก์ธ์ค ์ ํ์ ๋ํ๋ด๋ ๋คํธ์ํฌ ๊ท์น์ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋คํธ์ํฌ ๊ท์น์์๋ ํธ์คํธ ์ด๋ฆ, ๋คํธ์ํฌ์์ ํต์ ๋ฐฉํฅ(์์ ๋๋ ์ก์ )๊ณผ ๊ฐ์ ๋คํธ์ํฌ ์๋ณ์๋ฅผ ์ง์ ํฉ๋๋ค.
์ธ๋ถ ๋คํธ์ํฌ์ ๋ํ ์ก์ธ์ค๋ฅผ ์ง์ํ๊ธฐ ์ํด ๊ด๋ฆฌ์๋ ์ธ๋ถ ์ก์ธ์ค ํตํฉ ์ ์์ฑํ ๋ ๊ท์น์ ํฌํจํฉ๋๋ค. ํตํฉ์ ํฌํจ๋ ๊ฐ ๊ท์น์ ํจ์ ๋๋ ํ๋ก์์ ๊ฐ ์ก์ธ์คํ๋๋ก ํ์ฉ๋๋ ์ธ๋ถ ๋คํธ์ํฌ ์์น๋ฅผ ์ง์ ํฉ๋๋ค.
์ธ๋ถ ์ก์ธ์ค ํตํฉ์ ์ฌ์ฉํ ๋คํธ์ํฌ ๊ท์น์ ์์ฑํ ๋ ๋ค์์ ์ง์ ํฉ๋๋ค.
EGRESS๋ฅผ MODE ๋งค๊ฐ ๋ณ์ ๊ฐ์ผ๋ก ์ง์ ํฉ๋๋ค.
HOST_PORT ๋๋ PRIVATE_HOST_PORT ์ ๊ฐ์ ๋คํธ์ํฌ ์ ํ์ ๋ํ๋ด๋ TYPE ๋งค๊ฐ ๋ณ์ ๊ฐ์ ๋๋ค.
VALUE_LIST ๋งค๊ฐ ๋ณ์์ ์ธ๋ถ ์์น์ ์๋ํฌ์ธํธ๋ฅผ ์ง์ ํฉ๋๋ค.
(์ ํ ์ฌํญ) ์ธ๋ถ ์์น์ ์๋ํฌ์ธํธ ์ด๋ฆ์ ํฌํจํ ํฌํธ ๋ฒํธ๋ฅผ ์ง์ ํฉ๋๋ค. ํฌํธ ๋ฒํธ๋ฅผ ์๋ตํ๋ฉด Snowflake๋ ์ธ๋ถ ์ก์ธ์ค์ ๊ธฐ๋ณธ ํฌํธ ๋ฒํธ์ธ 443์ ์ฌ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์๋ํฌ์ธํธ์ ํฌํธ 80์ด ํ์ํ ๊ฒฝ์ฐ VALUE_LIST ๋งค๊ฐ ๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
VALUE_LIST = ('example.com:80')
์ก์ธ์ค ์ ์ดยถ
๋ณด์์ ์ํด Snowflake์์๋ ๋คํธ์ํฌ ๊ท์น์ ์์ฑํ ๋ ๋ค์์ ๋ณด์ ํ ์ญํ ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๊ท์น์ ๋ณด์ ํ ์คํค๋ง์ ๋ํ CREATE NETWORK RULE ๊ถํ์ ๋๋ค.
์ยถ
๋ค์ ์์์ ์ฝ๋๋ Google Translation API์ ๋ํ ์์๋ฐ์ด๋ ์์ฒญ์ ๋ํด google_apis_network_rule
์ด๋ผ๋ ๋คํธ์ํฌ ๊ท์น์ ๋ง๋ญ๋๋ค.
๋ ๋ง์ ์๋ ์ธ๋ถ ๋คํธ์ํฌ ์ก์ธ์ค ์์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
CREATE OR REPLACE NETWORK RULE google_apis_network_rule
MODE = EGRESS
TYPE = HOST_PORT
VALUE_LIST = ('translation.googleapis.com');
์๊ฒฉ ์ฆ๋ช ์ ๋ํ๋ด๋ ์ํฌ๋ฆฟ ๋ง๋ค๊ธฐยถ
CREATE SECRET ์ ์ฌ์ฉํ์ฌ ์ธ๋ถ ๋คํธ์ํฌ ์์น๋ก ์ธ์ฆํ๋ ๋ฐ ํ์ํ ์๊ฒฉ ์ฆ๋ช ์ ๋ํ๋ด๋ ์ํฌ๋ฆฟ์ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ํฌ๋ฆฟ์๋ ์ฌ์ฉ์ ์ด๋ฆ ๋ฐ ๋น๋ฐ๋ฒํธ ๋๋ ๋ณด์ ํตํฉ ๋ฑ์ ์๊ฒฉ ์ฆ๋ช ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
OAuth๋ฅผ ์ง์ํ๋ ์ธ๋ถ ๋คํธ์ํฌ ์์น์ ์ก์ธ์คํ๋ ค๋ฉด ํด๋ผ์ด์ธํธ ID, ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ, ํ ํฐ ์๋ํฌ์ธํธ ๋ฑ OAuth ํ๋ฆ์ ํ์ํ ๊ฐ์ด ํฌํจ๋ ๋ณด์ ํตํฉ ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ํฌ๋ฆฟ์ ํฌํจํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
์ํฌ๋ฆฟ์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
๊ด๋ฆฌ์๊ฐ ์ธ๋ถ ์ก์ธ์ค ํตํฉ ์ ์์ฑํ ๋ ์ฌ์ฉํฉ๋๋ค.
ํตํฉ ์์ฑ ์, ๊ด๋ฆฌ์๋ ๊ฐ๋ฐ์๊ฐ ํตํฉ์ ์ฌ์ฉํ๋ ํจ์๋ ํ๋ก์์ ๋ฅผ ์์ฑํ ๋ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋์์ ์ฌ์ฉํ ์ ์๋ ์ํฌ๋ฆฟ์ ์ง์ ํฉ๋๋ค.
๊ฐ๋ฐ์๊ฐ UDF ๋๋ ํ๋ก์์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํฉ๋๋ค.
๊ฐ๋ฐ์๋ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๊ฐ ์ธ๋ถ ์์น์ ๋ํ ์์ฒญ์ ํ ๋ ์ธ์ฆํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์๊ฒฉ ์ฆ๋ช ์ด ํฌํจ๋ ํ์ฉ๋ ์ํฌ๋ฆฟ์ ์ง์ ํฉ๋๋ค. ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์์ฑํ ๋ ๊ฐ๋ฐ์๋ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋์ ์๊ฒฉ ์ฆ๋ช ์ ๋ฆฌํฐ๋ด ๊ฐ์ผ๋ก ํฌํจํ๋ ๋์ Snowflake API๋ฅผ ์ฌ์ฉํ์ฌ ์ํฌ๋ฆฟ์ ํฌํจ๋ ์๊ฒฉ ์ฆ๋ช ์ ๊ฒ์ํ ์ ์์ต๋๋ค.
์ฐธ๊ณ
์๋ก ๊ณ ์นจ ํ ํฐ์ด ํ์ํ OAuth ์ํฌ๋ฆฟ์ ๊ฒฝ์ฐ Snowflake์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์์คํ ํจ์๋ฅผ ํตํ๋ ๋ฐฉ๋ฒ์ ํฌํจํ์ฌ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ผ๋ก ํ ํฐ์ ์ป์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ณด๋ ค๋ฉด OAuth๋ฅผ ์ฌ์ฉํ์ฌ Google Translate API์ ์ก์ธ์คํ๊ธฐ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ก์ธ์ค ์ ์ดยถ
๋ณด์์ ์ํด Snowflake์์๋ ์ํฌ๋ฆฟ์ ์์ฑํ ๋ ๋ค์์ ๋ณด์ ํ ์ญํ ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ํฌ๋ฆฟ์ ๋ณด์ ํ ์คํค๋ง์ ๋ํ CREATE SECRET ๊ถํ.
์ยถ
๋ค์ ์์์ ์ฝ๋๋ OAuth๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆํ๋ ๋ฐ ํ์ํ ๊ฐ์ด ํฌํจ๋ ๋ณด์ ํตํฉ(google_translate_oauth
๋ก ํ์๋จ)์ ์ง์ ํ๋ oauth_token
์ด๋ผ๋ ์ํฌ๋ฆฟ์ ์์ฑํฉ๋๋ค.
๋ณด์ ํตํฉ ์์ฑ์ ์ํ ์ฝ๋๋ฅผ ํฌํจํ ๋ ์์ ํ ์๋ ์ธ๋ถ ๋คํธ์ํฌ ์ก์ธ์ค ์์ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
CREATE OR REPLACE SECRET oauth_token
TYPE = OAUTH2
API_AUTHENTICATION = google_translate_oauth
OAUTH_REFRESH_TOKEN = 'my-refresh-token';
ํ
์ด ๋ฏธ๋ฆฌ ๋ณด๊ธฐ์์๋ API ํค๋ฅผ ์๊ฒฉ ์ฆ๋ช
์ผ๋ก๋ง ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ TYPE
์ GENERIC_STRING
์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค.
CREATE OR REPLACE SECRET bp_maps_api
TYPE = GENERIC_STRING
SECRET_STRING = 'replace-with-your-api-key';
์ธ๋ถ ์ก์ธ์ค ํตํฉ ๋ง๋ค๊ธฐยถ
CREATE EXTERNAL ACCESS INTEGRATION ๋ช ๋ น์ ์ฌ์ฉํ์ฌ UDF ๋ฐ ํ๋ก์์ ์ ํจ๊ป ์ฌ์ฉํ๋๋ก ํ์ฉ๋ ๋คํธ์ํฌ ๊ท์น(์ธ๋ถ ๋คํธ์ํฌ ์์น๋ฅผ ๋ํ๋)๊ณผ ํ์ฉ๋ ์ํฌ๋ฆฟ(์ธ์ฆ์ ์ํ ์๊ฒฉ ์ฆ๋ช ์ ๋ํ๋)์ ์ง๊ณํ๋ ์ธ๋ถ ์ก์ธ์ค ํตํฉ์ ์์ฑํ ์ ์์ต๋๋ค.
ํนํ, ์ธ๋ถ ์ก์ธ์ค ํตํฉ์ ํตํฉ์ ์ฐธ์กฐํ๋ UDF ๋ฐ ํ๋ก์์ ๊ฐ ์ฌ์ฉํ ์ ์๋ ๋คํธ์ํฌ ๊ท์น๊ณผ ์ํฌ๋ฆฟ์ ์ง์ ํฉ๋๋ค.
์ธ๋ถ ์ก์ธ์ค ํตํฉ์ ๊ด๋ฆฌ์๊ฐ UDF์ ํ๋ก์์ ์์ ์ธ๋ถ ๋คํธ์ํฌ ์์น์ ๋ํ ์ก์ธ์ค๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํตํฉ์ ํตํฉ์ ์ฐธ์กฐํ๋ UDF์ ํ๋ก์์ ์์ ์ฌ์ฉํ๋๋ก ํ์ฉ๋ ์์น์ ์๊ฒฉ ์ฆ๋ช ๋ง ์ง์ ํฉ๋๋ค. ๊ด๋ฆฌ์๋ ์ธ๋ถ ์์น์ ๋ํ ์ก์ธ์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ํตํฉ์ ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํ ์๋ ์์ต๋๋ค.
์ก์ธ์ค ์ ์ดยถ
๋ณด์์ ์ํด Snowflake์์๋ ์ธ๋ถ ์ก์ธ์ค ํตํฉ์ ์์ฑํ ๋ ๋ค์์ ๋ณด์ ํ ์ญํ ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๊ณ์ ์ ๋ํ CREATE INTEGRATION ๊ถํ.
ํตํฉ์์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ํฌ๋ฆฟ์ ๋ํ USAGE ๊ถํ๊ณผ ์ํฌ๋ฆฟ์ ์คํค๋ง์ ๋ํ USAGE ๊ถํ.
์ยถ
๋ค์ ์์์ ์ฝ๋๋ google_apis_access_integration
์ด๋ผ๋ ์ธ๋ถ ์ก์ธ์ค ํตํฉ์ ๋ง๋ญ๋๋ค. ํตํฉ์ google_apis_network_rule
๋คํธ์ํฌ ๊ท์น(๋คํธ์ํฌ ์์น๋ฅผ ๋ํ๋)๊ณผ oauth_token
์ํฌ๋ฆฟ(์๊ฒฉ ์ฆ๋ช
์ ๋ํ๋)์ ์ง์ ํฉ๋๋ค.
์ด ๊ท์น๊ณผ ์ํฌ๋ฆฟ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ธ๋ถ ๋คํธ์ํฌ ์์น๋ฅผ ๋ํ๋ด๋ ๋คํธ์ํฌ ๊ท์น ๋ง๋ค๊ธฐ ๋ฐ ์๊ฒฉ ์ฆ๋ช ์ ๋ํ๋ด๋ ์ํฌ๋ฆฟ ๋ง๋ค๊ธฐ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION google_apis_access_integration
ALLOWED_NETWORK_RULES = (google_apis_network_rule)
ALLOWED_AUTHENTICATION_SECRETS = (oauth_token)
ENABLED = true;
ํจ์ ๋๋ ํ๋ก์์ ์์ ์ธ๋ถ ์ก์ธ์ค ํตํฉ ์ฌ์ฉํ๊ธฐยถ
CREATE FUNCTION ๋๋ CREATE PROCEDURE ๋ช ๋ น์ ์ฌ์ฉํ์ฌ UDF ๋๋ ํ๋ก์์ ๋ฅผ ์์ฑํ ๋ ๋ค์๊ณผ ๊ฐ์ด ์ธ๋ถ ๋คํธ์ํฌ ์์น์ ๋ํ ์ก์ธ์ค๋ฅผ ํ์ฑํํ ์ ์์ต๋๋ค.
EXTERNAL_ACCESS_INTEGRATIONS ๋งค๊ฐ ๋ณ์์ ๊ฐ์ ํ๋ ์ด์์ ํตํฉ์ผ๋ก ์ค์ ํ์ฌ ์ด ๋งค๊ฐ ๋ณ์๋ฅผ ํฌํจํฉ๋๋ค.
์ฌ๊ธฐ์ ์ง์ ํ๋ ๊ฐ ํตํฉ์ ํตํฉ์ด ์ง์ ํ๋ ์ธ๋ถ ๋คํธ์ํฌ ์์น์ ์ํฌ๋ฆฟ์ ๋ํ ์ก์ธ์ค๋ฅผ ํ์ฉํฉ๋๋ค.
SECRETS ๋งค๊ฐ ๋ณ์์ ๊ฐ์ ํ๋ ์ด์์ ์ํฌ๋ฆฟ๊ณผ ์ฒ๋ฆฌ๊ธฐ ์ฝ๋์์ ์ก์ธ์คํ๋ ๋ฐ ์ฌ์ฉํ ์ด๋ฆ์ผ๋ก ์ค์ ํ์ฌ ์ด ๋งค๊ฐ ๋ณ์๋ฅผ ํฌํจํฉ๋๋ค.
๊ฐ์ผ๋ก ์ง์ ํ๋ ์ํฌ๋ฆฟ์ ์ธ๋ถ ์ก์ธ์ค ํตํฉ์์๋ ์ง์ ํด์ผ ํฉ๋๋ค.
์ฒ๋ฆฌ๊ธฐ ์ฝ๋์์ ์ํฌ๋ฆฟ์ ์ก์ธ์คํ์ฌ ์ธ๋ถ ๋คํธ์ํฌ ์์น๋ก ์ธ์ฆํ๊ธฐ ์ํ ์๊ฒฉ ์ฆ๋ช ์ ๋ถ๋ฌ์ต๋๋ค.
์ฐธ๊ณ
์ฝ๋์ ์๊ฒฉ ์ฆ๋ช ์ ๋ฆฌํฐ๋ด ๊ฐ์ผ๋ก ํฌํจํ๋ ๋์ ํญ์ ์๊ฒฉ ์ฆ๋ช ์ ๋ํ๋ด๋ Snowflake ์ํฌ๋ฆฟ์ ์ฌ์ฉํ์ญ์์ค. ์๊ฒฉ ์ฆ๋ช ์ ๋ณดํธํ๋ ๊ฒ ์ธ์๋, ์ํฌ๋ฆฟ์ ์ฌ์ฉํ๋ฉด ์ํฌ๋ฆฟ์ ๋ํ READ ๊ถํ์ด ๋ถ์ฌ๋ ์ฌ์ฉ์๋ง UDF ๋๋ ํ๋ก์์ ์ ์ด ๊ถํ์ด ํฌํจ๋ ํตํฉ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์๊ฒฉ ์ฆ๋ช ์ฌ์ฉ์ ๊ฐ์ฌํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
Snowflake๋ ํน์ UDF์์ ๋ง๋ค ์ ์๋ ์ด ์ฐ๊ฒฐ ์๋ฅผ ์ ํํฉ๋๋ค. ๋ฆฌ์์ค ๊ณ ๊ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํ๋ ค๋ฉด ์ฐ๊ฒฐ์ ์ต๋ํ ๋ง์ด ์ฌ์ฌ์ฉํ์ญ์์ค. UDF ์ด๊ธฐํ ์ค์ TCP ํด๋ผ์ด์ธํธ ๋๋ ์ธ์ ์ ํ ๋ฒ ๋ง๋ ๋ค์ ๋๋จธ์ง ์ฟผ๋ฆฌ์ ๋ํด UDF ์ฒ๋ฆฌ๊ธฐ์์ ํด๋ผ์ด์ธํธ๋ ์ธ์ ์ ์ฌ์ฉํ๋ฉด ์ต๋ํ ๋ง์ด ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ก์ธ์ค ์ ์ดยถ
๋ณด์์ ์ํด Snowflake์์๋ UDF ๋๋ ํ๋ก์์ ๋ฅผ ์์ฑํ ๋ ๋ค์์ ๋ณด์ ํ ์ญํ ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ฐธ์กฐํ๋ ๋ชจ๋ ์ํฌ๋ฆฟ์ ๋ํ READ ๊ถํ๊ณผ ์ํฌ๋ฆฟ์ ์คํค๋ง์ ๋ํ USAGE ๊ถํ.
์ฐธ์กฐํ๋ ๋ชจ๋ ํตํฉ์ ๋ํ USAGE ๊ถํ.
์ด๋ฌํ ๊ถํ์ ์๊ตฌํจ์ผ๋ก์จ ๊ด๋ฆฌ์๊ฐ ์ธ๋ถ ์ก์ธ์ค๋ฅผ ํ์ฑํํ ์ ์๋ ์ฌ์ฉ์๋ก ๊ตฌ์ฑ๋ ์ธํธ๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ GRANT <privileges> โฆ TO ROLE ๋ฐ ์ก์ธ์ค ์ ์ด ๊ถํ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ยถ
๋ค์ ์์์ ์ฝ๋๋ google_apis_access_integration
์ด๋ผ๋ ์ธ๋ถ ์ก์ธ์ค ํตํฉ์ ์ง์ ํ์ฌ google_translate_python
์ด๋ผ๋ UDF๋ฅผ ์์ฑํฉ๋๋ค(์์ธํ ๋ด์ฉ์ ์ธ๋ถ ์ก์ธ์ค ํตํฉ ๋ง๋ค๊ธฐ ์ฐธ์กฐ). ํตํฉ์ ํตํฉ์ ์ฐธ์กฐํ๋ UDF์์ ์ฌ์ฉํ๋๋ก ํ์ฉ๋ ๋คํธ์ํฌ ๊ท์น(์ธ๋ถ ๋คํธ์ํฌ ์์น๋ฅผ ๋ํ๋)๊ณผ ์ํฌ๋ฆฟ(์๊ฒฉ ์ฆ๋ช
์ ๋ํ๋)์ ์ง์ ํฉ๋๋ค. ์ด ๊ท์น๊ณผ ์ํฌ๋ฆฟ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ธ๋ถ ๋คํธ์ํฌ ์์น๋ฅผ ๋ํ๋ด๋ ๋คํธ์ํฌ ๊ท์น ๋ง๋ค๊ธฐ ๋ฐ ์๊ฒฉ ์ฆ๋ช
์ ๋ํ๋ด๋ ์ํฌ๋ฆฟ ๋ง๋ค๊ธฐ ์น์
์ ์ฐธ์กฐํ์ญ์์ค.
Python ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๋ _snowflake.get_oauth_access_token
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํฌ๋ฆฟ์์ OAuth ํ ํฐ์ ๋ถ๋ฌ์จ ๋ค์ ๊ทธ ํ ํฐ์ ์ฌ์ฉํด ์ธ๋ถ ์์น๋ก ์ธ์ฆํฉ๋๋ค. ์ฒ๋ฆฌ๊ธฐ ์ฝ๋๋ ์ง์ ๋ URL์ ์์ฒญํ ์ ์๋๋ฐ, URL์ ํธ์คํธ๊ฐ ํตํฉ์์ ์ง์ ํ ๋คํธ์ํฌ ๊ท์น์ ๋์ด๋์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.
CREATE OR REPLACE FUNCTION google_translate_python(sentence STRING, language STRING)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
HANDLER = 'get_translation'
EXTERNAL_ACCESS_INTEGRATIONS = (google_apis_access_integration)
PACKAGES = ('snowflake-snowpark-python','requests')
SECRETS = ('cred' = oauth_token )
AS
$$
import _snowflake
import requests
import json
session = requests.Session()
def get_translation(sentence, language):
token = _snowflake.get_oauth_access_token('cred')
url = "https://translation.googleapis.com/language/translate/v2"
data = {'q': sentence,'target': language}
response = session.post(url, json = data, headers = {"Authorization": "Bearer " + token})
return response.json()['data']['translations'][0]['translatedText']
$$;