CREATE APPLICATION SERVICE
CREATE APPLICATION SERVICE
아티팩트 저장소(artifact repository)에서 패키징된 애플리케이션 빌드를 배포하는 새 Application Service를 만드는 명령이에요.
출처: 문서
본문
Application Service는 일급(first-class) Snowflake 객체예요. 자체 컴퓨트, 수명 주기, 접근 제어를 관리해요. Snowpark Container Services 서비스와 달리 Application Service는 사용자가 제공한 서비스 사양이 아니라 버전 있는 패키지에서 배포해요.
이 명령은 다음 변형을 지원해요:
- CREATE OR ALTER APPLICATION SERVICE: Application Service가 없으면 만들고, 있으면
SPECIFICATION이 설명하는 상태로 수렴(converge)시켜요.
관련 명령: ALTER APPLICATION SERVICE, DESCRIBE APPLICATION SERVICE, DROP APPLICATION SERVICE, SHOW APPLICATION SERVICES
구문 (Syntax)
CREATE APPLICATION SERVICE [ IF NOT EXISTS ] <name>
FROM ARTIFACT REPOSITORY <repository_name> PACKAGE <package_name>
[ VERSION <version_alias> ]
[ EXTERNAL_ACCESS_INTEGRATIONS = ( <integration_name> [ , ... ] ) ]
[ QUERY_WAREHOUSE = <warehouse_name> ]
[ EXECUTE_AS_ROLE = <role_name> ]
[ AUTO_RESUME = { TRUE | FALSE } ]
[ AUTO_SUSPEND_SECS = <num> ]
[ MIN_INSTANCES = <num> ]
[ MAX_INSTANCES = <num> ]
[ COMMENT = '<string_literal>' ]
[ SPECIFICATION = '<yaml>' ]
변형 구문 (Variant syntax)
CREATE OR ALTER APPLICATION SERVICE
Application Service가 없으면 만들고, 있으면 문에 설명된 상태로 수렴시켜요. SPECIFICATION은 서비스의 완전한 의도된 상태예요. Snowflake는 그 상태에 도달하는 데 필요한 변경을 계산하고, 사양이 설정하지 않은 속성은 재설정해요.
CREATE OR ALTER APPLICATION SERVICE는 SPECIFICATION이 필요해요. ALTER APPLICATION SERVICE는 사양을 설정할 수 없기 때문에 사양을 업데이트하는 유일한 방법이에요.
자세한 내용은 CREATE OR ALTER APPLICATION SERVICE 사용 참고사항과 CREATE OR ALTER 를 참고하세요.
CREATE OR ALTER APPLICATION SERVICE <name>
FROM ARTIFACT REPOSITORY <repository_name> PACKAGE <package_name>
[ VERSION <version_alias> ]
[ COMMENT = '<string_literal>' ]
SPECIFICATION = '<yaml>'
필수 파라미터 (Required parameters)
*name*
Application Service의 식별자를 지정해요. 식별자는 서비스가 만들어진 스키마에서 고유해야 해요. 자세한 내용은 Identifier requirements를 참고하세요.
Application Service는 SPCS SERVICE 객체와 네임스페이스를 공유하지 않아요.
FROM ARTIFACT REPOSITORY *repository_name* PACKAGE *package_name*
배포할 아티팩트 저장소와 패키지를 지정해요. 저장소는 APPLICATION 유형이어야 해요.
FROM ARTIFACT REPOSITORY를 반드시 포함해야 해요. 저장소 절을 생략하는 것은 지원되지 않아요.
선택 파라미터 (Optional parameters)
VERSION *version_alias*
배포할 패키지의 버전을 지정해요. VERSION$3 같은 버전 이름이나 LATEST·DEFAULT 같은 버전 별칭을 전달할 수 있어요. 버전을 지정하지 않으면 Snowflake는 패키지의 기본 버전을 사용하고, 패키지에 기본 버전이 없으면 명령이 오류를 반환해요.
EXTERNAL_ACCESS_INTEGRATIONS = ( *integration_name* [ , ... ] )
애플리케이션이 외부 네트워크 위치에 접근할 수 있게 하는 외부 액세스 통합(external access integrations)의 이름을 지정해요. 이 목록의 이름은 대소문자를 구분해요.
QUERY_WAREHOUSE = *warehouse_name*
컨테이너가 웨어하우스를 명시적으로 지정하지 않고 Snowflake에 연결할 때 애플리케이션이 사용하는 웨어하우스를 지정해요.
EXECUTE_AS_ROLE = *role_name*
Snowflake가 앱에서 owner's rights 쿼리를 실행하고 caller's rights 권한을 파생할 때 사용하는 역할을 지정해요. 개인 데이터베이스(personal database)에서 만들어진 앱에만 유효해요.
요구사항:
-
지정된 역할은 앱의 소유 사용자에게 부여되어야 해요.
-
생략하면 Snowflake는
EXECUTE_AS_ROLE을 생성자의 세션 주 역할(primary role)로 설정해요.
앱이 시작될 때 지정된 역할이 더 이상 소유 사용자에게 부여되지 않으면 시작이 실패해요.
AUTO_RESUME = { TRUE | FALSE }
Snowflake가 엔드포인트 중 하나로 인바운드 요청을 받을 때 서비스를 자동으로 다시 시작할지 여부를 지정해요.
AUTO_SUSPEND_SECS = *num*
비활성 상태 후 Snowflake가 Application Service를 자동으로 중단할 때까지의 시간(초)을 지정해요. 0이 아닌 최소값은 300이에요. 0 값은 자동 중단을 비활성화해요.
기본값: 0(비활성화)
MIN_INSTANCES = *num*
Snowflake가 계속 실행하는 최소 인스턴스 수를 지정해요. 앱이 유휴 상태여도 Snowflake는 이보다 적게 실행하지 않아요.
-
최소 1이어야 해요.
-
MAX_INSTANCES보다 클 수 없어요.
기본값: 설정되지 않음. MAX_INSTANCES가 설정되면 1로 기본값이 정해져요. 둘 다 설정되지 않으면 Snowflake는 한 인스턴스를 실행해요.
MAX_INSTANCES = *num*
Snowflake가 실행하는 최대 인스턴스 수를 지정해요. Snowflake는 이보다 많이 실행하지 않아요.
-
최소 1, 최대
10이어야 해요. -
MIN_INSTANCES보다 작을 수 없어요.
기본값: 설정되지 않음. 설정되지 않으면 MIN_INSTANCES와 일치해요.
COMMENT = '*string_literal*'
Application Service에 대한 주석을 지정해요.
SPECIFICATION = '*yaml*'
서비스를 구성하는 인라인 매니페스트를 단일 따옴표 문자열 또는 달러 따옴표($$ ... $$) 블록으로 지정해요. 사양을 제공하면 Snowflake는 이를 자신이 소유한 속성의 진실 원천(source of truth)으로 사용하고 아티팩트 저장소에 패키징된 매니페스트를 읽지 않아요.
사양은 CREATE OR ALTER APPLICATION SERVICE에는 필수이고 CREATE APPLICATION SERVICE에는 선택사항이에요.
사양은 다음 키를 받아들여요. 알 수 없는 키는 오류이므로 min_instance 같은 오타는 조용히 무시되지 않고 실패해요.
version
사양의 스키마 버전이에요. 지원되는 유일한 값은 2예요.
기본값: 2
label, description, icon
앱의 표시 이름, 설명, 아이콘이에요. icon은 프로젝트 루트에 대한 상대 경로이고 ../로 루트를 벗어날 수 없어요. 이 값들은 SHOW APPLICATION SERVICES와 DESCRIBE APPLICATION SERVICE의 additional_properties 열에 나타나요.
query_warehouse
QUERY_WAREHOUSE와 동일해요.
min_instances, max_instances
MIN_INSTANCES와 MAX_INSTANCES와 동일해요.
auto_resume, auto_suspend_secs
AUTO_RESUME과 AUTO_SUSPEND_SECS와 동일해요.
execute_as_role
EXECUTE_AS_ROLE과 동일해요. 서비스가 만들어질 때 적용돼요. CREATE OR ALTER를 포함해 나중에 변경할 수 없어요.
external_access_integrations
EXTERNAL_ACCESS_INTEGRATIONS와 동일한 외부 액세스 통합 이름 목록이에요.
secrets
앱에 노출할 시크릿 목록이에요. 각 항목은 name(앱이 읽는 이름)과 secret(Snowflake 시크릿 객체의 식별자)을 가져요. 각 시크릿은 존재해야 하고 소유 역할이 접근할 수 있어야 해요.
environment_variables
앱의 컨테이너에 설정할 환경 변수 목록이에요. 각 항목은 name과 value를 가져요.
사양이 소유하는 속성은 같은 문에서 최상위 절로도 나타날 수 없어요. SPECIFICATION과 함께 QUERY_WAREHOUSE, EXTERNAL_ACCESS_INTEGRATIONS, MIN_INSTANCES, MAX_INSTANCES, AUTO_RESUME, AUTO_SUSPEND_SECS, EXECUTE_AS_ROLE을 지정하면 속성을 사양 안에서 설정하라고 알려주는 오류가 반환돼요. COMMENT는 사양이 소유하지 않으므로 최상위 절로 설정해요.
접근 제어 요구사항 (Access control requirements)
역할이 다음 표의 객체를 소유하지 않는다면, 그 역할은 해당 객체들에 나열된 권한(privileges)을 가져야 해요:
| Privilege | Object | Notes |
|---|---|---|
| CREATE APPLICATION SERVICE | Schema | 스키마에 새 Application Service를 만드는 데 필요해요. |
| READ | Artifact repository | 패키지를 포함하는 아티팩트 저장소에 필요해요. |
| USAGE | External access integration | EXTERNAL_ACCESS_INTEGRATIONS 또는 SPECIFICATION의 external_access_integrations 키에 나열된 각 통합에 필요해요. |
| USAGE | Warehouse | QUERY_WAREHOUSE가 지정된 경우(SPECIFICATION의 query_warehouse 포함) 필요해요. |
| USAGE | Role | EXECUTE_AS_ROLE에 지정된 역할(SPECIFICATION의 execute_as_role 포함)에 필요해요. 역할은 앱의 소유 사용자에게 부여되어야 해요. |
| OWNERSHIP | Application Service | CREATE OR ALTER APPLICATION SERVICE가 기존 Application Service를 수정할 때 필요해요. |
| READ | Secret | SPECIFICATION의 secrets 키에 나열된 각 시크릿에 필요해요. |
스키마의 객체를 작업하려면 상위 데이터베이스에 최소한 하나의 권한과 상위 스키마에 최소한 하나의 권한이 필요해요.
사용 참고사항 (Usage notes)
-
Application Service는 생성 후 자동으로 시작돼요. 상태를 확인하려면 SHOW APPLICATION SERVICES 또는 DESCRIBE APPLICATION SERVICE를 사용해요.
-
서비스를 다른 패키지 버전으로 업그레이드하려면
UPGRADE와 함께 ALTER APPLICATION SERVICE를 사용해요. -
CREATE SERVICE,EXECUTE JOB SERVICE같은 독립형 SPCS SQL 명령은 Application Service를 관리하는 데 사용되지 않아요. 대신APPLICATION SERVICE명령을 사용하세요. -
CREATE OR REPLACE는 Application Service에서 지원되지 않아요. 서비스가 없으면 만들고 있으면 업데이트하려면 CREATE OR ALTER APPLICATION SERVICE를 사용해요. -
저장소 이름과 함께
FROM ARTIFACT REPOSITORY를 반드시 지정해야 해요. 저장소 없이FROM PACKAGE만 지정하는 명령은 지원되지 않아요. -
Snowflake App Runtime은 트라이얼 계정(trial accounts)에서 사용할 수 없어요.
-
EXECUTE_AS_ROLE은 생성 시점에 설정되며 ALTER APPLICATION SERVICE로 변경할 수 없어요. -
OR REPLACE와IF NOT EXISTS절은 상호 배타적이에요. 같은 문에서 둘 다 사용할 수 없어요. -
CREATE OR REPLACE <object>문은 원자적이에요. 즉 객체를 교체할 때 기존 객체가 삭제되고 새 객체가 단일 트랜잭션으로 만들어져요.
CREATE OR ALTER APPLICATION SERVICE 사용 참고사항
-
SPECIFICATION이 필수예요. 없는CREATE OR ALTER APPLICATION SERVICE는 오류를 반환해요. -
CREATE OR ALTER는IF NOT EXISTS와 결합할 수 없어요. -
사양은 서비스의 완전한 의도된 상태예요. Snowflake는 사양이 소유하지만 설정하지 않은 모든 속성을 재설정해요:
-
label,description,icon을 생략하면 지워져요. -
external_access_integrations,secrets,environment_variables를 생략하면 모두 제거돼요. -
auto_suspend_secs,min_instances,max_instances를 생략하면 기본값으로 돌아가요. -
query_warehouse를 생략하면 해제돼요. -
auto_resume을 생략하면 기본값으로 돌아가요.
값을 유지하려면 매
CREATE OR ALTER문에서 다시 명시해요. -
-
execute_as_role은 서비스가 만들어질 때 적용되며 이후 변경할 수 없어요. 기존 서비스에 다른 값을 보내면 오류가 반환되고, 생략하면 현재 역할이 유지돼요. -
패키지와 아티팩트 저장소는 서비스가 만들어질 때 고정돼요. 기존 서비스에 다른 패키지나 저장소를 지정하면 오류가 반환돼요. 현재 값을 다시 보내는 것은 no-op이에요.
-
VERSION절을 포함하면 Snowflake는 사양을 적용한 뒤 서비스를 해당 버전으로 수렴시켜요. 버전 별칭은 문 실행 시점에 해석되므로VERSION LATEST는 마지막 배포 이후 새 버전이 게시되었다면 새 버전을 가져와요. -
사양은 다시 읽을 수 없어요. DESCRIBE APPLICATION SERVICE나 SHOW APPLICATION SERVICES에 표시되지 않고, GET_DDL도 Application Services를 지원하지 않아요. 사양을 소스 제어에 보관하세요. CLI 배포에서는
app.yml의 서비스 수준 키이고, SQL을 직접 작성한다면SPECIFICATION아래에 나열된 키만 보내세요. 사양으로 전체app.yml을 전달할 수 없어요. 자세한 내용은 Validation을 참고하세요. -
CREATE OR ALTER APPLICATION SERVICE는FROM ARTIFACT REPOSITORY절이 필요해요.
예제 (Examples)
아티팩트 저장소에서 패키지의 기본 버전을 배포하는 예제예요:
CREATE APPLICATION SERVICE my_app
FROM ARTIFACT REPOSITORY my_app_repo PACKAGE web_ui;
특정 버전을 배포하는 예제예요:
CREATE APPLICATION SERVICE my_app
FROM ARTIFACT REPOSITORY my_app_repo PACKAGE web_ui
VERSION VERSION$3
EXTERNAL_ACCESS_INTEGRATIONS = ( my_eai )
QUERY_WAREHOUSE = my_warehouse
AUTO_RESUME = TRUE
AUTO_SUSPEND_SECS = 600
COMMENT = 'Customer portal';
LATEST 별칭을 배포하는 예제예요:
CREATE APPLICATION SERVICE my_app
FROM ARTIFACT REPOSITORY my_app_repo PACKAGE web_ui
VERSION LATEST;
이름 있는 실행 역할로 개인 데이터베이스에 배포하는 예제예요:
CREATE APPLICATION SERVICE my_db.my_schema.my_app
FROM ARTIFACT REPOSITORY my_app_repo PACKAGE web_ui
EXECUTE_AS_ROLE = my_app_role;
2~5개 인스턴스로 배포하는 예제예요:
CREATE APPLICATION SERVICE my_app
FROM ARTIFACT REPOSITORY my_app_repo PACKAGE web_ui
VERSION LATEST
MIN_INSTANCES = 2
MAX_INSTANCES = 5;
서비스가 없으면 만들고, 있으면 이 상태로 수렴시키는 예제예요:
CREATE OR ALTER APPLICATION SERVICE my_db.my_schema.my_app
FROM ARTIFACT REPOSITORY my_app_repo PACKAGE web_ui
VERSION LATEST
SPECIFICATION = $$
label: "My App"
description: "Production instance of My App."
icon: public/icon.svg
query_warehouse: my_warehouse
min_instances: 1
max_instances: 3
auto_resume: true
auto_suspend_secs: 600
external_access_integrations:
- stripe_eai
- logging_eai
secrets:
- name: STRIPE_API_KEY
secret: my_db.my_schema.stripe_secret
environment_variables:
- name: LOG_LEVEL
value: "INFO"
$$;
사양이 완전한 의도된 상태이므로, 다음 문은 웨어하우스를 바꾸고 이전 문이 설정한 그 밖의 모든 것을 삭제해요. 통합과 시크릿은 제거되고, label과 description은 지워지며, max_instances와 auto_suspend_secs는 기본값으로 돌아가요:
CREATE OR ALTER APPLICATION SERVICE my_db.my_schema.my_app
FROM ARTIFACT REPOSITORY my_app_repo PACKAGE web_ui
VERSION LATEST
SPECIFICATION = $$
query_warehouse: my_other_warehouse
$$;
새 빌드를 게시한 후 재배포하는 예제예요. LATEST를 다시 해석하면 서비스가 새 버전으로 이동하고, 사양을 전체 다시 명시하면 다른 모든 것은 그대로 유지돼요:
CREATE OR ALTER APPLICATION SERVICE my_db.my_schema.my_app
FROM ARTIFACT REPOSITORY my_app_repo PACKAGE web_ui
VERSION LATEST
COMMENT = 'Redeployed after the nightly build'
SPECIFICATION = $$
label: "My App"
description: "Production instance of My App."
icon: public/icon.svg
query_warehouse: my_warehouse
min_instances: 1
max_instances: 3
auto_resume: true
auto_suspend_secs: 600
external_access_integrations:
- stripe_eai
- logging_eai
secrets:
- name: STRIPE_API_KEY
secret: my_db.my_schema.stripe_secret
environment_variables:
- name: LOG_LEVEL
value: "INFO"
$$;
더 알아보기 (Learn more)
ALTER APPLICATION SERVICE, DESCRIBE APPLICATION SERVICE, DROP APPLICATION SERVICE, SHOW APPLICATION SERVICES