Git์ ์ฌ์ฉํ๊ธฐ ์ํด Snowflake ์ค์ ํ๊ธฐยถ
์๊ฒฉ Git ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ํตํฉํ๊ณ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ณต์ ํ๋ฉด Snowflake๋ ์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์์น, ์๊ฒฉ ์ฆ๋ช (ํ์ํ ๊ฒฝ์ฐ) ๋ฐ Snowflake๊ฐ Git ๋ฆฌํฌ์งํ ๋ฆฌ API ์ ์ํธ ์์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ง์ ํ๋ Git ๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์ ๋ณธ์ ์์ฑํฉ๋๋ค.
Snowflake์์ ์๊ฒฉ Git ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ญ์์ค.
ํ์ํ ๊ฒฝ์ฐ ์ํฌ๋ฆฟ์ ์์ฑํ์ฌ ์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ์ธ์ฆํ๊ธฐ ์ํ ์๊ฒฉ ์ฆ๋ช ์ ๋ณด๊ดํฉ๋๋ค.
API ํตํฉ์ ์์ฑ ํ์ฌ Git ๋ฆฌํฌ์งํ ๋ฆฌ API์์ Snowflake ์ํธ ์์ฉ์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ง์ ํฉ๋๋ค.
์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ์์ ํ์ผ์ ๋๊ธฐํํ ์ ์๋ Git ๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์ ๋ณธ์ ๋ง๋ญ๋๋ค.
์ธ์ฆ์ ์ํ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ์ฌ ์ํฌ๋ฆฟ์ ๋ง๋ญ๋๋ค.ยถ
์๊ฒฉ Git ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ธ์ฆ์ด ํ์ํ ๊ฒฝ์ฐ, Snowflake๊ฐ ์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ ์ธ์ฆ์ ์ฌ์ฉํ ์ ์๋ ์๊ฒฉ ์ฆ๋ช ์ด ํฌํจ๋ ์ํฌ๋ฆฟ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
์ด ์ํฌ๋ฆฟ์ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. Git ๋ฆฌํฌ์งํ ๋ฆฌ API์์ Snowflake ์ํธ ์์ฉ์ ์ง์ ํ๋ API ํตํฉ์ ๋ง๋๋ ์ฌ์ฉ์๋ ์ด ์ํฌ๋ฆฟ์ ALLOWED_AUTHENTICATION_SECRETS ๋งค๊ฐ ๋ณ์์ ๊ฐ์ผ๋ก ์ง์ ํด์ผ ํฉ๋๋ค. ๋ํ Git์ ์ฌ์ฉํ๋๋ก Snowflake๋ฅผ ์ค์ ํ๋ ์ฌ์ฉ์๊ฐ ์ํฌ๋ฆฟ์ ์ง์ ํฉ๋๋ค.
์ํฌ๋ฆฟ์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๊ถํ์ด ๋ถ์ฌ๋ ์ญํ ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ํฌ๋ฆฟ์ ์ ์ฅํ ์คํค๋ง์ ๋ํ CREATE SECRET ๊ถํ
์์ธํ ๋ด์ฉ์ CREATE SECRET ์ก์ธ์ค ์ ์ด ์๊ตฌ ์ฌํญ ์ ์ฐธ์กฐํ์ญ์์ค.
ํตํฉ์ด ํฌํจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์คํค๋ง์ ๋ํ USAGE ๊ถํ
๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ํฌ๋ฆฟ์ PASSWORD ๊ฐ์ ๊ฐ์ธ ์ก์ธ์ค ํ ํฐ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. GitHub์์ ๊ฐ์ธ ์ก์ธ์ค ํ ํฐ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ GitHub ์ค๋ช ์์์ ๊ฐ์ธ ์ก์ธ์ค ํ ํฐ ๊ด๋ฆฌํ๊ธฐ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
- SQL:
CREATE SECRET ๋ช ๋ น์ ์ฌ์ฉํ์ฌ Git ๋ฆฌํฌ์งํ ๋ฆฌ ์๊ฒฉ ์ฆ๋ช ์ด ํฌํจ๋ ์ํฌ๋ฆฟ์ ๋ง๋ค ์ ์์ต๋๋ค.
๋ค์ ์์ ์ ์ฝ๋๋ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ์ฌ์ฉ์์ ๊ฐ์ธ ์ก์ธ์ค ํ ํฐ์ผ๋ก
myco_git_secret
์ํฌ๋ฆฟ์ ์์ฑํ์ฌ ์๊ฒฉ ์ฆ๋ช ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.USE ROLE ACCOUNTADMIN; CREATE ROLE myco_secrets_admin; GRANT CREATE SECRET ON SCHEMA myco_db.integrations TO ROLE myco_secrets_admin; USE ROLE myco_db_owner; GRANT USAGE ON DATABASE myco_db TO ROLE myco_secrets_admin; GRANT USAGE ON SCHEMA myco_db.integrations TO ROLE myco_secrets_admin; USE ROLE myco_secrets_admin; USE DATABASE myco_db; USE SCHEMA myco_db.integrations; CREATE OR REPLACE SECRET myco_git_secret TYPE = password USERNAME = 'gladyskravitz' PASSWORD = 'ghp_token';
๋ฆฌํฌ์งํ ๋ฆฌ API์ ์ํธ ์์ฉํ๊ธฐ ์ํ API ํตํฉ ๋ง๋ค๊ธฐยถ
Snowflake๊ฐ Git ๋ฆฌํฌ์งํ ๋ฆฌ API์ ์ํธ ์์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ง์ ํ๋ ค๋ฉด API ํตํฉ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
Git์ ์ฌ์ฉํ๊ธฐ ์ํด Snowflake ๊ณ์ ์ ์ค์ ํ๋ ์ฌ์ฉ์๋ ์ฌ์ฉํ API ํตํฉ์ ์ง์ ํฉ๋๋ค.
API ํตํฉ์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๊ถํ์ด ๋ถ์ฌ๋ ์ญํ ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๊ณ์ ์ ๋ํ CREATE INTEGRATION ๊ถํ
์์ธํ ๋ด์ฉ์ CREATE API INTEGRATION ์ก์ธ์ค ์ ์ด ์๊ตฌ ์ฌํญ ์ ์ฐธ์กฐํ์ญ์์ค.
์ํฌ๋ฆฟ์ด ํฌํจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์คํค๋ง์ ๋ํ USAGE ๊ถํ
ํตํฉ์ด ์ฐธ์กฐํ๋ ์ํฌ๋ฆฟ์ ๋ํ USAGE ๊ถํ
Git ๋ฆฌํฌ์งํ ๋ฆฌ API์ ๋ํ API ํตํฉ์ ๋ง๋ค ๋๋ ๋ค์์ ์ํํด์ผ ํฉ๋๋ค.
git_https_api
๋ฅผ API_PROVIDER ๋งค๊ฐ ๋ณ์์ ๊ฐ์ผ๋ก ์ง์ ํฉ๋๋ค.์ธ์ฆ์ด ํ์ํ ๊ฒฝ์ฐ ALLOWED_AUTHENTICATION_SECRETS ๋งค๊ฐ ๋ณ์์ ๊ฐ์ผ๋ก ์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ ์๊ฒฉ ์ฆ๋ช ์ด ํฌํจ๋ ์ํฌ๋ฆฟ ์ ์ง์ ํฉ๋๋ค. ๋ค์ ์ค ํ๋๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
Snowflake๊ฐ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ธ์ฆํ ๋ ์ฌ์ฉํ ์ ์๋ ํ๋ ์ด์์ Snowflake ์ํฌ๋ฆฟ(์ผํ๋ก ๊ตฌ๋ถ๋ ๋ชฉ๋ก).
all
(๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์)์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ํฌ๋ฆฟ์ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ ํฉ๋๋ค.none
(๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์)์ ์ฌ์ฉํ์ฌ ์ํฌ๋ฆฟ์ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ ํฉ๋๋ค.
- SQL:
CREATE API INTEGRATION ๋ช ๋ น์ ์ฌ์ฉํ์ฌ Git ๋ฆฌํฌ์งํ ๋ฆฌ API์์ Snowflake ์ํธ ์์ฉ์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ง์ ํ๋ API ํตํฉ์ ๋ง๋ค ์ ์์ต๋๋ค.
๋ค์ ์์ ์ ์ฝ๋๋ ์ด๋ฆ์ด
git_api_integration
์ธ API ํตํฉ์ ์์ฑํฉ๋๋ค.USE ROLE ACCOUNTADMIN; CREATE ROLE myco_git_admin; GRANT CREATE INTEGRATION ON ACCOUNT TO ROLE myco_git_admin; USE ROLE myco_db_owner; GRANT USAGE ON DATABASE myco_db TO ROLE myco_git_admin; GRANT USAGE ON SCHEMA myco_db.integrations TO ROLE myco_git_admin; USE ROLE myco_secrets_admin; GRANT USAGE ON SECRET myco_git_secret TO ROLE myco_git_admin; USE ROLE myco_git_admin; USE DATABASE myco_db; USE SCHEMA myco_db.integrations; CREATE OR REPLACE API INTEGRATION git_api_integration API_PROVIDER = git_https_api API_ALLOWED_PREFIXES = ('https://github.com/my-account') ALLOWED_AUTHENTICATION_SECRETS = (myco_git_secret) ENABLED = TRUE;
์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ์์ Snowflake Git ๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์ ๋ณธ ๋ง๋ค๊ธฐยถ
์๊ฒฉ Git ๋ฆฌํฌ์งํ ๋ฆฌ์ ํจ๊ป ์๋ํ๋๋ก Snowflake๋ฅผ ์ค์ ํ๋ ค๋ฉด ์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ์์ ๊ฐ์ ธ์จ ํ์ผ์ ํฌํจํ๋๋ก Snowflake์์ Git ๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์ ๋ณธ์ ๋ง๋ญ๋๋ค.
์ฐธ๊ณ
์ด ์น์ ์ ๋จ๊ณ๋ฅผ ์์ํ๊ธฐ ์ ์ ๋จผ์ ์ํฌ๋ฆฟ (์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ธ์ฆ์ด ํ์ํ ๊ฒฝ์ฐ)๊ณผ API ํตํฉ ์ ๋ง๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ ๋ค ํ์ํ ์๋ ์์ต๋๋ค.
Git ๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์ ๋ณธ์ ๋ค์์ ์ง์ ํฉ๋๋ค.
์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ถ์ฒ
Git์์,
origin
์ ์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ URL์ ๋จ์ถ์ด์ ๋๋ค. ์๊ฒฉ Git ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ก Snowflake๋ฅผ ์ค์ ํ ๋ URL ์ ์ฌ์ฉํ์ญ์์ค. URL์ HTTPS๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์๋ณธ URL์ ๋ค์ ๋ฐฉ๋ฒ์ผ๋ก ๊ฒ์ํ ์ ์์ต๋๋ค.GitHub ์ฌ์ฉ์ ์ธํฐํ์ด์ค์์ ๋ฆฌํฌ์งํ ๋ฆฌ ํ ํ์ด์ง์์ ์๋ณธ URL๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ฉด Code ๋ฒํผ์ ์ ํํ ๋ค์ ๋ฒํผ ์๋์ ํ์๋๋ ์์์์ HTTPS URL์ ๋ณต์ฌํฉ๋๋ค.
๋ช ๋ น์ค์์ ๋ค์ ์์ ์ ๊ฐ์ด ๋ก์ปฌ ๋ฆฌํฌ์งํ ๋ฆฌ ๋ด์์
git config
๋ช ๋ น์ ์ฌ์ฉํฉ๋๋ค.$ git config --get remote.origin.url
์ด ๋ช ๋ น์ ๋ค์๊ณผ ๊ฐ์ ์ถ๋ ฅ์ ์์ฑํฉ๋๋ค.
https://github.com/my-account/snowflake-extensions.git
git config
์ ๋ํ ์ฐธ์กฐ ์ ๋ณด๋ git ์ค๋ช ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๋ฆฌํฌ์งํ ๋ฆฌ๋ก ์ธ์ฆํ ๋ Snowflake๊ฐ ์ฌ์ฉํ ์๊ฒฉ ์ฆ๋ช (ํ์ํ ๊ฒฝ์ฐ)
๋ฆฌํฌ์งํ ๋ฆฌ API์์ Snowflake ์ํธ ์์ฉ์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ง์ ํ๋ API ํตํฉ
Snowflake์์ Git ๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์ ๋ณธ์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๊ถํ์ด ๋ถ์ฌ๋ ์ญํ ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
Git ๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์ ๋ณธ์ด ํฌํจ๋ ์คํค๋ง์์ CREATE GIT REPOSITORY
์์ธํ ๋ด์ฉ์ CREATE GIT REPOSITORY ์ก์ธ์ค ์ ์ด ์๊ตฌ ์ฌํญ ์ ์ฐธ์กฐํ์ญ์์ค.
Git ์ธ์ฆ์ ์ํ ์๊ฒฉ ์ฆ๋ช ์ด ํฌํจ๋ ์ํฌ๋ฆฟ์ ๋ํ USAGE ๊ถํ
Git ๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์ ๋ณธ์ด ์ฐธ์กฐํ๋ API ํตํฉ์ ๋ํ USAGE ๊ถํ
Snowsight ๋๋ SQL ์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ Git ๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์ ๋ณธ์ ์์ฑํ ์ ์์ต๋๋ค.
์ฐธ๊ณ
Git ๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์ ๋ณธ์ ๋ง๋ค๊ธฐ ์ ์ ์ํฌ๋ฆฟ (์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ธ์ฆ์ด ํ์ํ ๊ฒฝ์ฐ) ๋ฐ API ํตํฉ ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
snowflake_extensions
๋ช
๋ น์ ์ฌ์ฉํ์ฌ Git ๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์ ๋ณธ์ ์์ฑํ ์ ์์ต๋๋ค. ์ด ๋ณต์ ๋ณธ์์๋ ์ธ์ฆ์ ์ํ ์๊ฒฉ ์ฆ๋ช
๊ณผ ํจ๊ป git_api_integration
API ํตํฉ ๋ฐ myco_git_secret
์ํฌ๋ฆฟ์ ์ง์ ํฉ๋๋ค.
USE ROLE ACCOUNTADMIN;
GRANT CREATE GIT REPOSITORY ON SCHEMA myco_db.integrations TO ROLE myco_git_admin;
USE ROLE myco_git_admin;
CREATE OR REPLACE GIT REPOSITORY snowflake_extensions
API_INTEGRATION = git_api_integration
GIT_CREDENTIALS = myco_git_secret
ORIGIN = 'https://github.com/my-account/snowflake-extensions.git';
Snowsight ์ ๋ก๊ทธ์ธํฉ๋๋ค.
ํ์ ๋ฉ๋ด์์ Data ยป Databases ๋ฅผ ์ ํํฉ๋๋ค.
์ค๋ธ์ ํธ ํ์๊ธฐ์์, ์์ฑ ์ค์ธ Git ๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์ ๋ณธ์ ํฌํจ์ํฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์คํค๋ง๋ฅผ ์ ํํฉ๋๋ค.
Create ยป Git Repository ๋ฅผ ์ ํํฉ๋๋ค.
Create Git Repository ๋ํ ์์์์ Repository Name ์ ๋ํด ์คํค๋ง์์ ์ด ๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์ ๋ณธ์ ๊ณ ์ ํ๊ฒ ์๋ณํ ์ ์๋ ์ด๋ฆ์ ์ ๋ ฅํฉ๋๋ค.
๋ช ๋ช ์ง์นจ์ ์๋ณ์ ์๊ตฌ ์ฌํญ ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Origin ์ ์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์๋ณธ URL์ ์ ๋ ฅํฉ๋๋ค.
API Integration ๋๋กญ๋ค์ด ๋ฉ๋ด์์ Git ๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์ ๋ณธ์ ๋ง๋ค ๋ ์ฐธ์กฐํ API ํตํฉ์ ์ ํํฉ๋๋ค.
์ฌ์ฉํ API ํตํฉ์ด ์๋ ๊ฒฝ์ฐ ํตํฉ์ ๋ง๋ค๊ธฐ ์ํด SQL์ ์ฌ์ฉํ Create new API integration in Worksheets ๋ฅผ ์ ํํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ฆฌํฌ์งํ ๋ฆฌ API์ ์ํธ ์์ฉํ๊ธฐ ์ํ API ํตํฉ ๋ง๋ค๊ธฐ ๋ฐ CREATE API INTEGRATION ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ ํ ์ฌํญ: Comment ์, ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ์ด ํตํฉ์ ์ค๋ช ํ๋ ํ ์คํธ๋ฅผ ์ ๋ ฅํฉ๋๋ค.
์ ํ ์ฌํญ: ์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ธ์ฆ์ด ํ์ํ ๊ฒฝ์ฐ Authentication ํ ๊ธ์ _on_ ์์น๋ก ์ค์ ํฉ๋๋ค.
On ์์น๋ก ์ค์ ๋ ๊ฒฝ์ฐ Secret ๋ฉ๋ด์์ ์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ์ธ์ฆํ๊ธฐ ์ํด Git ํตํฉ์์ ์ฐธ์กฐํด์ผ ํ๋ ์ํฌ๋ฆฟ์ ์ ํํฉ๋๋ค.
์ฌ์ฉํ ์ํฌ๋ฆฟ์ด ์๋ ๊ฒฝ์ฐ ์ํฌ๋ฆฟ์ ๋ง๋ค๊ธฐ ์ํด SQL์ ์ฌ์ฉํ Create new secret in Worksheets ๋ฅผ ์ ํํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ธ์ฆ์ ์ํ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ์ฌ ์ํฌ๋ฆฟ์ ๋ง๋ญ๋๋ค. ๋ฐ CREATE SECRET ์น์ ์ ์ฐธ์กฐํ์ญ์์ค.
Create ๋ฅผ ์ ํํฉ๋๋ค.
ํตํฉ์ ์ฑ๊ณต์ ์ผ๋ก ๋ง๋ค๋ฉด Git ๋ฆฌํฌ์งํ ๋ฆฌ ๋ณต์ ๋ณธ์ด ์คํค๋ง ์๋ Git Repositories ๋๋ ํฐ๋ฆฌ์ ๋ํ๋ฉ๋๋ค. ๋ํ ๋ฆฌํฌ์งํ ๋ฆฌ ๋๋ ํฐ๋ฆฌ, ๋ถ๊ธฐ, ํ๊ทธ๋ฅผ ๋์ดํ๋ ํ์ด์ง๋ ํ์๋ฉ๋๋ค.