Snowpark Container Services: 서비스 사용하기

Snowpark Container Services 를 사용하면 컨테이너화된 애플리케이션을 쉽게 배포, 관리, 확장할 수 있습니다. 애플리케이션을 만들고 Snowflake 계정의 리포지토리에 애플리케이션 이미지를 업로드하면 애플리케이션 컨테이너를 서비스로 실행할 수 있습니다.

서비스는 가상 머신(VM) 노드의 집합인 컴퓨팅 풀 에서 컨테이너화된 애플리케이션을 실행하는 Snowflake를 나타냅니다. 서비스에는 다음의 두 가지 유형이 있습니다.

  • 장기 실행 서비스. 장기 실행 서비스는 자동으로 종료되지 않는 웹 서비스와 유사합니다. 서비스를 생성하면 Snowflake가 실행 중인 서비스를 관리합니다. 예를 들어 서비스 컨테이너가 어떤 이유로든 중지되면 Snowflake는 해당 컨테이너를 다시 시작하여 서비스가 중단 없이 실행됩니다.

  • 작업 서비스. 작업 서비스는 저장 프로시저와 유사하게 코드가 종료되면 종료됩니다. 모든 컨테이너가 종료되면 작업 서비스가 완료됩니다.

Snowpark Container Services는 서비스를 생성하고 관리하는 데 사용할 수 있는 SQL 명령 세트를 제공합니다. 다음과 같은 오브젝트가 이에 해당합니다.

서비스 시작하기

서비스를 시작하는 데 필요한 최소 정보에는 다음이 포함됩니다.

  • name: 서비스의 이름입니다.

  • 서비스 사양:사양 은 Snowflake에 서비스 실행에 필요한 정보를 제공합니다. 사양은 YAML 파일입니다.

  • 컴퓨팅 풀: Snowflake는 지정된 컴퓨팅 풀 에서 서비스를 실행합니다.

장기 실행 서비스 만들기

장기 실행 서비스를 만들려면 CREATE SERVICE 를 사용합니다.

  • 인라인 사양을 사용하여 서비스를 만듭니다. 대부분의 경우 다음과 같이 개발 중에 인라인 사양을 선택할 수 있습니다.

    CREATE SERVICE echo_service
       IN COMPUTE POOL tutorial_compute_pool
       FROM SPECIFICATION $$
       spec:
         containers:
         - name: echo
           image: /tutorial_db/data_schema/tutorial_repository/my_echo_service_image:tutorial
           readinessProbe:
             port: 8000
             path: /healthcheck
         endpoints:
         - name: echoendpoint
           port: 8000
           public: true
       $$;
    
    Copy
  • 스테이지 정보를 사용하여 서비스를 생성합니다. 프로덕션 환경에 서비스를 배포할 때는 다음과 같이 관심사 분리 설계 원칙을 적용하여 스테이지에 사양을 업로드하고 스테이지 정보 CREATE SERVICE 명령을 제공하는 것이 좋습니다.

    CREATE SERVICE echo_service
      IN COMPUTE POOL tutorial_compute_pool
      FROM @tutorial_stage
      SPECIFICATION_FILE='echo_spec.yaml';
    
    Copy

작업 서비스 실행

작업 서비스를 만들려면 EXECUTE JOB SERVICE 를 사용합니다. 이 명령은 동기적으로 실행되며, 작업 서비스의 모든 컨테이너가 종료된 후 응답을 반환합니다.

  • 인라인 사양을 사용하여 작업 서비스를 실행합니다.

    EXECUTE JOB SERVICE
       IN COMPUTE POOL tutorial_compute_pool
       NAME = example_job_service
       FROM SPECIFICATION $$
       spec:
         container:
         - name: main
           image: /tutorial_db/data_schema/tutorial_repository/my_job_image:latest
           env:
             SNOWFLAKE_WAREHOUSE: tutorial_warehouse
           args:
           - "--query=select current_time() as time,'hello'"
           - "--result_table=results"
       $$;
    
    Copy
  • 스테이지 정보를 사용하여 작업 서비스 실행:

    EXECUTE JOB SERVICE
      IN COMPUTE POOL tutorial_compute_pool
      NAME = example_job_service
      FROM @tutorial_stage
      SPECIFICATION_FILE='my_job_spec.yaml';
    
    Copy

여러 서비스 인스턴스 만들기 및 자동 크기 조정 활성화하기

기본적으로, Snowflake는 지정된 컴퓨팅 풀에서 서비스 인스턴스를 하나 실행합니다. 과도한 워크로드를 관리하려면 시작할 서비스의 최소 인스턴스 수와 필요할 때 Snowflake가 확장할 수 있는 최대 인스턴스 수를 지정하는 MIN_INSTANCES 및 MAX_INSTANCES 속성을 설정하여 여러 서비스 인스턴스를 실행할 수 있습니다.

CREATE SERVICE echo_service
   IN COMPUTE POOL tutorial_compute_pool
   FROM @tutorial_stage
   SPECIFICATION_FILE='echo_spec.yaml'
   MIN_INSTANCES=2
   MAX_INSTANCES=4;
Copy

여러 서비스 인스턴스가 실행 중인 경우 Snowflake는 수신 요청을 분산하기 위해 로드 밸런서를 자동으로 제공합니다.

참고

2개 이상의 작업 서비스 인스턴스를 실행할 수 없습니다.

실행 중인 서비스 인스턴스 수를 자동으로 조정하도록 Snowflake를 구성하려면 다음 단계를 따르십시오.

  1. 서비스 사양 파일에서 서비스 인스턴스에 대한 CPU 및 메모리 요구 사항을 지정합니다. 자세한 내용은 컨테이너 리소스 필드를 참조하십시오.

    resources:
      requests:
       memory: <memory-reserved>
       cpu: <cpu-units>
    
    Copy
  2. CREATE SERVICE 명령을 실행할 때 MIN_INSTANCES 및 MAX_INSTANCES 매개 변수를 설정합니다. 또한 ALTER SERVICE를 사용하여 이러한 값을 변경할 수도 있습니다. 자동 크기 조정은 지정된 MAX_INSTANCES가 MIN_INSTANCES를 초과할 때 발생합니다.

Snowflake는 지정된 컴퓨팅 풀에 최소 개수의 서비스 인스턴스를 생성하는 것으로 시작합니다. 그런 다음 Snowflake는 80% 임계값(CPU 및 메모리 모두에 대해)을 사용하여 서비스 인스턴스 수를 확장하거나 축소합니다. Snowflake는 컴퓨팅 풀 내의 리소스 사용률(메모리 또는 CPU)을 지속적으로 모니터링하여 현재 실행 중인 모든 서비스 인스턴스의 사용량 데이터를 집계합니다.

(모든 서비스 인스턴스에서) 집계된 리소스 사용량이 80%를 초과하면 Snowflake는 컴퓨팅 풀 내에 추가 서비스 인스턴스를 배포합니다. 집계된 리소스 사용량이 80% 미만으로 떨어지면 Snowflake는 실행 중인 서비스 인스턴스를 제거하여 규모를 축소합니다. Snowflake는 빈번한 크기 조정을 방지하기 위해 5분의 안정화 기간을 사용합니다.

다음 크기 조정 동작에 유의하십시오.

  • 서비스 인스턴스의 확장은 서비스용으로 구성된 MIN_INSTANCES 및 MAX_INSTANCES 매개 변수로 제한됩니다.

  • 확장이 필요하고 컴퓨팅 풀 노드에 다른 서비스 인스턴스를 시작하는 데 필요한 리소스 용량이 부족한 경우 컴퓨팅 풀 자동 크기 조정이 트리거될 수 있습니다. 자세한 내용은 컴퓨팅 풀 노드 자동 크기 조정 섹션을 참조하십시오.

  • 서비스를 생성할 때 MAX_INSTANCES 및 MIN_INSTANCES 매개 변수를 지정하지만 서비스 사양 파일에서 서비스 인스턴스의 CPU 및 메모리 요구 사항을 지정하지 않으면 자동 크기 조정이 이루어지지 않습니다. Snowflake는 MIN_INSTANCES 매개 변수에 지정된 인스턴스 수로 시작하며 크기가 자동으로 조정되지 않습니다.

사양 템플릿 사용하기

사양은 동일하지만 구성이 다른 여러 서비스를 생성해야 할 때가 있습니다. 예를 들어, 서비스 사양에 환경 변수 를 정의하고 동일한 사양을 사용하지만 환경 변수의 값이 다른 여러 서비스를 생성한다고 가정해 보겠습니다.

사양 템플릿을 사용하면 사양에서 필드 값에 대한 변수를 정의할 수 있습니다. 사용자는 서비스를 생성할 때 이러한 변수에 대한 값을 제공합니다.

사양 템플릿 사용은 다음의 두 단계로 수행됩니다.

  1. 다양한 사양 필드에 대한 값으로 변수를 사용하여 사양을 작성합니다. 이러한 변수를 지정하려면 {{ variable_name }} 구문을 사용합니다. 예를 들어, 다음 사양에서는 이미지 태그 이름에 “tag_name”이라는 변수를 사용하여 각 서비스마다 다른 이미지 태그를 지정할 수 있습니다.

    spec:
      containers:
      - name: echo
        image: myorg-myacct.registry.snowflakecomputing.com/tutorial_db/data_schema/tutorial_repository/my_echo_service_image:{{ tag_name }}
        ...
      endpoints:
      
    
    Copy
  2. CREATE SERVICE 명령으로 사양 템플릿을 제공하여 서비스를 생성합니다. 템플릿을 지정하려면 SPECIFICATION_TEMPLATE 또는 SPECIFICATION_TEMPLATE_FILE을 사용합니다. 변수의 값을 지정하려면 USING 매개 변수를 사용합니다. 예를 들어, 다음 문은 Snowflake 스테이지의 사양 템플릿을 사용합니다. USING 매개 변수는 tag_name 변수를 변수 'latest' 로 설정합니다.

    CREATE SERVICE echo_service
       IN COMPUTE POOL tutorial_compute_pool
       FROM @STAGE SPECIFICATION_TEMPLATE_FILE='echo.yaml'
       USING (tag_name=>'latest');
    
    Copy

사양에서 변수를 정의하기 위한 지침

  • 사양에서 변수를 필드 값으로 정의하려면 {{ variable_name }} 구문을 사용합니다.

  • 이러한 변수에는 기본값이 있을 수 있습니다. 기본값을 지정하려면 변수 선언에 default 함수를 사용합니다. 예를 들어, 다음 사양은 기본값이 있는 두 개의 변수(character_nameendpoint_name)를 정의합니다.

    spec:
      containers:
      - name: echo
        image: <image_name>
        env:
          CHARACTER_NAME: {{ character_name | default('Bob') }}
          SERVER_PORT: 8085
      endpoints:
      - name: {{ endpoint_name | default('echo-endpoint') }}
        port: 8085
    
    Copy

    또한, default 함수에 선택적 부울 매개 변수를 지정하여 변수에 빈 값을 전달할 때 기본값을 사용할지 여부를 나타낼 수 있습니다. 다음 사양을 고려하십시오.

    spec:
      containers:
      - name: echo
        image: <image_name>
        env:
          CHARACTER_NAME: {{ character_name | default('Bob', false) }}
          SERVER_PORT: 8085
      endpoints:
      - name: {{ endpoint_name | default('echo-endpoint', true) }}
        port: 8085
    
    Copy

    사양에서:

    • character_name 변수의 경우 부울 매개 변수가 false 로 설정됩니다. 따라서 이 매개 변수에 변수를 빈 문자열 값(‘’)으로 설정하면 기본값(“Bob”)이 사용되지 않고 값이 공백으로 유지됩니다.

    • echo_endpoint 변수의 경우 부울 매개 변수가 true 로 설정됩니다. 따라서 이 매개 변수에 공백 값을 전달하면 기본값(“echo-endpoint”)이 사용됩니다.

    기본적으로 default 함수의 부울 매개 변수는 false 입니다.

사양 변수에 대한 값 전달 관련 지침

변수 값을 제공하려면 CREATE SERVICE 명령에 USING 매개 변수를 지정합니다. USING의 일반 구문은 다음과 같습니다.

USING( var_name=>var_value, [var_name=>var_value, ... ] );
Copy

여기서

  • var_name 은 대/소문자를 구분하며 유효한 Snowflake 식별자이어야 합니다(식별자 요구 사항 참조).

  • var_value 는 영숫자 값 또는 유효한 JSON 값일 수 있습니다.

    예:

    -- Alphanumeric string and literal values
    USING(some_alphanumeric_var=>'blah123',
          some_int_var=>111,
          some_bool_var=>true,
          some_float_var=>-1.2)
    
    -- JSON string
    USING(some_json_var=>' "/path/file.txt" ')
    
    -- JSON map
    USING(env_values=>'{"SERVER_PORT": 8000, "CHARACTER_NAME": "Bob"}' );
    
    -- JSON list
    USING (ARGS='["-n", 2]' );
    
    Copy
  • CREATE SERVICE의 USING 매개 변수는 사양 변수에 대한 값을 제공해야 합니다(사양에서 기본값을 제공하는 변수 제외). 그렇지 않으면, 오류가 반환됩니다.

다음 예제에서는 사양 템플릿을 사용하여 서비스를 만드는 방법을 보여줍니다. 이 예제의 CREATE SERVICE 명령은 인라인 사양을 사용합니다.

예제 1: 간단한 값 제공

자습서 1 에서는 인라인 사양을 제공하여 서비스를 만듭니다. 다음 예제는 사양에서 두 개의 변수 image_urlSERVER_PORT 를 정의하는 동일한 예제를 수정한 것입니다. SERVER_PORT 변수는 세 위치에서 반복된다는 점에 유의하십시오. 이렇게 하면 동일한 값을 가질 것으로 예상되는 모든 필드가 동일한 값을 갖도록 하는 변수를 사용할 수 있다는 추가적인 이점이 있습니다.

CREATE SERVICE echo_service
   IN COMPUTE POOL tutorial_compute_pool
   MIN_INSTANCES=1
   MAX_INSTANCES=1
   FROM SPECIFICATION_TEMPLATE $$
      spec:
         containers:
         - name: echo
           image: {{ image_url }}
           env:
             SERVER_PORT: {{SERVER_PORT}}
             CHARACTER_NAME: Bob
           readinessProbe:
             port: {{SERVER_PORT}}
             path: /healthcheck
         endpoints:
         - name: echoendpoint
           port: {{SERVER_PORT}}
           public: true
         $$
      USING (image_url=>' "/tutorial_db/data_schema/tutorial_repository/my_echo_service_image:latest" ', SERVER_PORT=>8000 );
Copy

이 CREATE SERVICE 명령에서 USING 매개 변수는 두 가지 사양 변수에 대한 값을 제공합니다. image_url 값에는 슬래시와 콜론이 포함됩니다. 이 값은 영숫자 문자가 아닙니다. 따라서 예제에서는 값을 큰따옴표로 묶어 유효한 JSON 문자열 값이 되도록 합니다. 템플릿 사양은 다음 사양을 확장합니다.

spec:
  containers:
  - name: echo
    image: /tutorial_db/data_schema/tutorial_repository/my_echo_service_image:latest
    env:
      SERVER_PORT: 8000
      CHARACTER_NAME: Bob
    readinessProbe:
      port: 8000
      path: /healthcheck
    endpoints:
    - name: echoendpoint
      port: 8000
      public: true
Copy

예 2: JSON 값 제공

자습서 1에서 사양은 다음과 같이 두 개의 환경 변수(SERVER_PORTCHARACTER_NAME)를 정의합니다.

spec:
 containers:
 - name: echo
   image: /tutorial_db/data_schema/tutorial_repository/my_echo_service_image:latest
   env:
     SERVER_PORT: 8000
     CHARACTER_NAME: Bob
   
Copy

이 사양은 env 필드에 대한 변수를 사용하여 템플릿화할 수 있습니다. 이를 통해 환경 변수에 대해 서로 다른 값을 설정하여 여러 서비스를 생성할 수 있습니다. 다음 CREATE SERVICE 명령은 env 필드에 변수(env_values)를 사용합니다.

CREATE SERVICE echo_service
  IN COMPUTE POOL tutorial_compute_pool
  MIN_INSTANCES=1
  MAX_INSTANCES=1
  FROM SPECIFICATION_TEMPLATE $$
     spec:
       containers:
       - name: echo
         image: /tutorial_db/data_schema/tutorial_repository/my_echo_service_image:latest
         env: {{env_values}}
         readinessProbe:
           port: {{SERVER_PORT}}    #this and next tell SF to connect to port 8000
           path: /healthcheck
       endpoints:
       - name: echoendpoint
         port: {{SERVER_PORT}}
         public: true
        $$
     USING (env_values=>'{"SERVER_PORT": 8000, "CHARACTER_NAME": "Bob"}' );
Copy

CREATE SERVICE의 USING 매개 변수는 env_values 변수에 대한 값을 제공합니다. 이 값은 두 환경 변수에 대한 값을 제공하는 JSON 맵입니다.

예제 3: 목록을 변수 값으로 제공

자습서 2 의 사양에는 두 개의 인자가 있는 args 필드가 포함되어 있습니다.

spec:
  container:
  - name: main
    image: /tutorial_db/data_schema/tutorial_repository/my_job_image:latest
    env:
      SNOWFLAKE_WAREHOUSE: tutorial_warehouse
    args:
    - "--query=select current_time() as time,'hello'"
    - "--result_table=results"
Copy

템플릿 버전의 명세서에서는 이러한 인자를 그림과 같이 JSON 목록으로 제공할 수 있습니다.

spec:
  container:
  - name: main
    image: /tutorial_db/data_schema/tutorial_repository/my_job_image:latest
    env:
      SNOWFLAKE_WAREHOUSE: tutorial_warehouse
    args: {{ARGS}}
  $$
  USING (ARGS=$$["--query=select current_time() as time,'hello'", "--result_table=results"]$$ );
Copy

서비스 수정 및 삭제하기

서비스 생성 후:

  • 스키마에서 서비스를 제거하려면 DROP SERVICE 명령을 사용합니다(Snowflake는 모든 서비스 컨테이너를 종료함).

  • 서비스를 수정하려면 ALTER SERVICE 명령을 사용합니다(예: 서비스 일시 중단 또는 재개, 실행 중인 인스턴스 수 변경, 새 서비스 사양을 사용하여 서비스를 다시 배포하도록 Snowflake에 지시).

    참고

    • 작업 서비스를 변경할 수 없습니다.

서비스 종료

서비스를 일시 중단(ALTER SERVICE … SUSPEND)하거나 서비스를 삭제(DROP SERVICE)하면 Snowflake는 모든 서비스 인스턴스를 종료합니다. 마찬가지로 서비스 코드를 업그레이드(ALTER SERVICE … <fromSpecification>)하는 경우, Snowflake는 한 번에 1개의 서비스 인스턴스를 종료하고 다시 배포하는 방식으로 롤링 업그레이드 를 적용합니다.

서비스 인스턴스를 종료할 때, Snowflake는 먼저 각 서비스 컨테이너에 SIGTERM 신호를 보냅니다. 컨테이너에는 신호를 처리하고 30초의 유예 기간을 두고 종료하는 옵션이 있습니다. 그렇지 않으면, 유예 기간이 경과한 후 Snowflake는 컨테이너의 모든 프로세스를 종료합니다.

서비스 코드 업데이트하기 및 서비스 재배포하기

서비스가 생성된 후 ALTER SERVICE … <fromSpecification> 명령을 사용하여 서비스 코드를 업데이트하고 서비스를 재배포합니다.

먼저 이미지 리포지토리에 수정된 애플리케이션 코드를 업로드한 다음, 서비스 사양을 인라인으로 제공하거나 Snowflake 스테이지에서 사양 파일의 경로를 지정하여 ALTER SERVICE를 호출합니다. 예:

ALTER SERVICE echo_service
FROM SPECIFICATION $$
spec:
  
  
$$;
Copy

요청을 받으면 Snowflake는 새 코드를 사용하여 서비스를 다시 배포합니다.

CREATE SERVICE … <from-Specification> 명령을 실행하면 Snowflake는 공급자가 제공한 이미지의 특정 버전을 기록합니다. 다음 시나리오에서 Snowflake는 리포지토리의 이미지가 업데이트된 경우에도 동일한 이미지 버전을 배포합니다.

  • 일시 중단된 서비스가 재개되는 경우(ALTER SERVICE … RESUME 사용).

  • 자동 크기 조정으로 서비스 인스턴스가 더 추가되는 경우.

  • 클러스터 유지 관리 중에 서비스 인스턴스가 다시 시작되는 경우.

그러나 사용자가 ALTER SERVICE … <fromSpecification>을 호출하면 해당 이미지에 대해 리포지토리에 있는 최신 버전을 사용하도록 Snowflake가 트리거됩니다.

서비스 소유자인 경우 DESCRIBE SERVICE 명령의 출력에는 아래와 같이 이미지 요약(사양에서 sha256 필드의 값)이 포함된 서비스 사양이 포함됩니다.

spec:
containers:
- name: "echo"
    image: "/tutorial_db/data_schema/tutorial_repository/my_echo_service_image:latest"
    sha256: "@sha256:8d912284f935ecf6c4753f42016777e09e3893eed61218b2960f782ef2b367af"
    env:
      SERVER_PORT: "8000"
      CHARACTER_NAME: "Bob"
    readinessProbe:
      port: 8000
      path: "/healthcheck"
endpoints:
- name: "echoendpoint"
    port: 8000
    public: true
Copy

ALTER SERVICE는 서비스와의 통신에 영향을 미칠 수 있습니다(서비스 사용하기 참조).

  • ALTER SERVICE … <fromSpecification>을 통해 엔드포인트가 제거되거나 엔드포인트를 사용하기 위해 필요한 관련 권한이 제거되면(사양 참조의 serviceRoles 참조) 서비스에 대한 액세스가 실패합니다. 자세한 내용은 서비스 사용하기 섹션을 참조하십시오.

  • 업그레이드가 진행되는 동안 새 연결이 새 버전으로 라우팅될 수 있습니다. 새 서비스 버전이 이전 버전과 호환되지 않으면 모든 활성 서비스의 사용이 중단됩니다. 예를 들어, 서비스 함수를 사용하는 진행 중인 쿼리가 실패할 수 있습니다.

참고

컨테이너로 네이티브 앱의 일부인 서비스 코드를 업데이트할 때 SYSTEM$WAIT_FOR_SERVICES 시스템 함수를 사용하여 네이티브 앱 설정 스크립트를 일시 중지하여 서비스가 완전히 업그레이드될 수 있도록 할 수 있습니다. 자세한 내용은 컨테이너를 사용한 앱 업그레이드 섹션을 참조하십시오.

롤링 업그레이드 모니터링하기

여러 서비스 인스턴스가 실행 중인 경우, Snowflake는 서비스 인스턴스의 ID를 기준으로 내림차순으로 롤링 업그레이드를 수행합니다. 서비스 업그레이드를 모니터링하려면 다음 명령을 사용합니다.

  • DESCRIBE SERVICESHOW SERVICES:

    • 서비스가 업그레이드 중인 경우 출력의 is_upgrading 열은 TRUE입니다.

    • 출력의 spec_digest 열은 현재 서비스 사양의 사양 요약을 나타냅니다. 이 명령은 주기적으로 실행할 수 있으며, spec_digest 값이 변경되면 서비스 업그레이드가 트리거되었음을 나타냅니다. 아래에 설명된 대로 모든 인스턴스가 최신 버전으로 업그레이드되었는지 확인하려면 SHOW SERVICE INSTANCES IN SERVICE 명령을 사용합니다.

  • SHOW SERVICE INSTANCES IN SERVICE:

    • 출력의 status 열은 롤링 업그레이드가 진행되는 동안 각 개별 서비스 인스턴스의 상태를 제공합니다. 업그레이드하는 동안 사용자는 TERMINATING에서 PENDING으로, PENDING에서 READY로 전환되는 등 각 서비스 인스턴스 전환 상태를 확인할 수 있습니다.

    • 서비스 업그레이드 중에 SHOW SERVICE INSTANCES IN SERVICE 명령은 SHOW SERVICES와 다른 값을 spec_digest 출력 열에 반환할 수 있으며, 이는 항상 최신 사양 요약을 반환합니다. 이는 단순히 서비스 업그레이드가 진행 중이며 서비스 인스턴스가 여전히 이전 버전의 서비스를 실행하고 있음을 나타냅니다.

서비스에 대한 정보 가져오기

다음 명령을 사용할 수 있습니다.

  • 서비스의 속성 및 상태를 검색하려면 DESCRIBE SERVICE 명령을 사용합니다.

  • 권한이 있는 현재 서비스(작업 서비스 포함)를 목록으로 표시하려면 SHOW SERVICES 명령을 사용합니다. 각 서비스에 대해 출력은 서비스의 속성 및 상태를 제공합니다. 기본적으로 출력에는 현재 데이터베이스 및 스키마의 서비스가 목록으로 표시됩니다. 또는 다음 범위를 지정할 수 있습니다. 예:

    • 계정, 특정 데이터베이스 또는 특정 스키마에 있는 서비스 나열: 예제: 서비스가 속한 데이터베이스 또는 스키마에 관계없이 IN ACCOUNT 필터를 사용하여 Snowflake 계정에 있는 서비스를 나열합니다. 이는 계정의 여러 데이터베이스와 스키마에서 생성된 Snowflake 서비스가 있는 경우 유용합니다. 다른 모든 명령과 마찬가지로 SHOW SERVICES IN ACCOUNTS는 권한으로 제어되며, 사용 중인 역할에 보기 권한이 있는 서비스만 반환합니다.

      IN DATABASE 또는 IN SCHEMA를 지정하여 현재(또는 지정된) 데이터베이스 또는 스키마에 있는 서비스를 나열할 수도 있습니다.

    • 컴퓨팅 풀에서 실행 중인 서비스 나열: 예를 들어, IN COMPUTE POOL 필터를 사용하여 컴퓨팅 풀에서 실행 중인 서비스를 목록으로 표시합니다.

    • 접두사로 시작하거나 패턴과 일치하는 서비스를 나열: LIKE 및 STARTS WITH 필터를 적용하여 이름별로 서비스를 필터링할 수 있습니다.

    • 작업 서비스를 목록에 나열하거나 목록에서 작업 서비스 제외: SHOW JOB SERVICES 또는 SHOW SERVICES EXCLUDE JOBS를 사용하여 작업 서비스만 나열하거나 작업 서비스를 제외할 수 있습니다.

    이러한 옵션을 조합하여 SHOW SERVICES 출력을 사용자 지정할 수도 있습니다.

  • 서비스 인스턴스의 속성을 검색하려면 SHOW SERVICE INSTANCES IN SERVICE 명령을 사용합니다.

  • 서비스 인스턴스의 속성 및 상태를 검색하려면 SHOW SERVICE CONTAINERS IN SERVICE 명령을 사용합니다.

서비스 모니터링하기

Snowpark Container Services는 계정의 컴퓨팅 풀과 해당 풀에서 실행 중인 서비스를 모니터링하는 도구를 제공합니다. 자세한 내용은 Snowpark Container Services: 모니터링 서비스 섹션을 참조하십시오.

서비스 엔드포인트에 대한 액세스 관리하기

서비스 소유자 역할 (서비스를 만드는 데 사용하는 역할)은 서비스 및 서비스가 노출하는 엔드포인트에 대한 전체 액세스 권한을 갖습니다. 다른 역할이 서비스와 통신하려면 엔드포인트에 대한 USAGE 권한이 필요합니다. 예를 들어,

  • 클라이언트의 소유자 역할은 엔드포인트에 대한 USAGE 권한이 필요합니다. 클라이언트 는 서비스 함수 또는 다른 서비스의 엔드포인트에 요청을 하는 서비스를 의미합니다.

    • 엔드포인트를 참조하는 서비스 함수 를 만들려면 사용자가 엔드포인트에 액세스할 수 있어야 합니다. 즉, 서비스 함수의 소유자 역할은 CREATE FUNCTION에 참조된 엔드포인트에 대한 USAGE 권한이 필요합니다.

    • 서비스 간 통신 에서 클라이언트 서비스의 소유자 역할(다른 서비스의 엔드포인트를 호출하는 역할)에는 엔드포인트에 대한 USAGE 권한이 필요합니다.

  • Snowflake 외부에서 공용 엔드포인트로 수신 요청을 하는 사용자에는 엔드포인트에 대한 USAGE 권한이 필요합니다.

서비스 역할 은 다른 역할에 서비스 엔드포인트에 대한 권한을 부여하는 방법입니다. 사용할 수 있는 옵션은 다음과 같습니다.

  • 기본 서비스 역할 사용: Snowflake는 서비스가 노출하는 모든 엔드포인트에 대해 USAGE 권한을 부여하는 기본 서비스 역할(ALL_ENDPOINTS_USAGE)을 정의하고 이 기본 서비스 역할을 서비스의 소유자 역할에 부여합니다. 따라서 소유자 역할은 서비스가 노출하는 모든 엔드포인트에 액세스할 수 있습니다. 이 기본 서비스 역할을 다른 역할에 부여할 수 있습니다.

  • 서비스 역할 만들기: 기본 서비스 역할을 사용하여 모든 엔드포인트에 대한 권한을 부여하는 대신 서비스 사양 에서 하나 이상의 서비스 역할을 정의할 수 있습니다. 정의 내에서 역할에 USAGE 권한이 부여되는 특정 엔드포인트를 표시합니다. GRANT SERVICE ROLEREVOKE SERVICE ROLE 명령을 사용하여 다른 역할에 서비스 역할을 부여(또는 취소)할 수 있습니다. SHOW ROLES IN SERVICE, SHOW GRANTS 명령을 사용하여 권한에 대한 정보를 표시할 수도 있습니다

    Snowflake는 서비스를 생성할 때 서비스 역할을 생성하고 서비스를 삭제할 때 해당 서비스 역할을 삭제합니다.

    사용자 지정 서비스 역할을 생성하면 여러 시나리오에 다른 액세스 허가를 부여할 수 있습니다. 예를 들어, 서비스 함수과 함께 사용할 수 있도록 엔드포인트에 서비스 역할 권한을 부여할 수 있습니다. 웹 UI와 함께 사용되는 공용 엔드포인트에 대한 권한이 있는 다른 서비스 역할을 생성할 수 있습니다.

다음 사항을 참고하십시오.

  • 동일한 역할을 사용하여 여러 서비스를 만드는 경우 소유자 역할은 모든 엔드포인트에 액세스할 수 있으므로 추가로 구성을 변경하지 않고 해당 서비스가 서로 원활하게 통신할 수 있습니다.

  • 서비스에 여러 개의 컨테이너가 있는 경우 이러한 컨테이너는 localhost를 통해 서로 통신할 수 있으며, 이러한 통신은 각 서비스 인스턴스 내에서 로컬로 수행되고 역할 기반 액세스 제어의 대상이 되지 않습니다.

다음 섹션에서는 세부 정보를 제공합니다. 이 기능을 살펴보기 위한 단계별 지침을 제공하는 자습서(서비스 엔드포인트 권한 구성 및 테스트)를 사용해 볼 수도 있습니다.

기본 서비스 역할을 사용하여 모든 엔드포인트에 USAGE 권한 부여하기

서비스(작업 서비스 포함)를 만들 때 Snowflake는 이름이 ALL_ENDPOINTS_USAGE 인 기본 서비스 역할도 만듭니다. 이 역할에는 서비스가 노출하는 모든 엔드포인트에 대한 USAGE 권한이 있습니다. GRANT SERVICE ROLE 명령을 사용하여 다른 역할에 이 기본 서비스 역할을 부여할 수 있습니다.

GRANT SERVICE ROLE my_echo_service_image!ALL_ENDPOINTS_USAGE TO ROLE some_other_role;
Copy

some_other_role 을 사용하는 사용자는 모든 서비스 엔드포인트에 대한 USAGE 권한을 갖습니다.

서비스를 삭제하면 Snowflake는 해당 서비스와 연관된 모든 서비스 역할(기본 서비스 역할 및 서비스 사양에 정의된 서비스 역할)을 삭제하고 모든 서비스 역할 부여를 무효화합니다.

사양에 정의된 서비스 역할을 사용하여 특정 엔드포인트에 USAGE 권한 부여하기

서비스 역할을 사용하여 서비스 엔드포인트에 대한 세분화된 액세스를 관리합니다. 서비스 사양에서 서비스 역할과 해당 역할에 USAGE 권한이 부여된 엔드포인트 목록을 정의합니다.

서비스의 특정 엔드포인트에 대한 권한을 부여하는 것은 2단계 프로세스입니다.

  1. 서비스 역할 정의: 서비스 명세서를 사용하여 역할 이름과 USAGE 권한을 부여할 하나 이상의 엔드포인트 목록을 제공하여 서비스 역할을 정의합니다. 예를 들어, 다음 사양 조각에서 최상위 serviceRoles 필드는 각각 특정 엔드포인트에 대한 USAGE 권한이 있는 2개의 서비스 역할을 정의합니다.

    spec:
    ...
    serviceRoles:                 # Optional list of service roles
    - name: <svc_role_name1>
      endpoints:                  # endpoints that role can access
      - <endpoint_name1>
      - <endpoint_name2>
    - name: <svc_role_name2>
      endpoints:
      - <endpoint_name3>
      - <endpoint_name4>
    
    Copy
  2. 다른 역할에 서비스 역할 부여. GRANT SERVICE ROLE 명령을 사용하여 다른 역할(계정 역할, 애플리케이션 역할 또는 데이터베이스 역할)에 서비스 역할을 부여합니다. 예:

    GRANT SERVICE ROLE <service-name>!<svc_role_name1> TO ROLE <another-role>
    
    Copy

서비스 사용하기

서비스를 생성한 후, 동일한 계정(서비스를 만든 계정)의 사용자는 다음 3가지 지원 방법 중 하나를 사용하여 서비스를 사용할 수 있습니다. 사용자는 필요한 권한이 있는 역할에 액세스해야 합니다.

  • SQL 쿼리의 서비스 사용 (Service 함수): 서비스와 연관된 사용자 정의 함수(UDF)인 서비스 함수를 생성하고 이를 SQL 쿼리에서 사용하여 서비스와 통신합니다. 예를 보려면 자습서 1 을 참조하십시오.

  • Snowflake 외부에서 서비스 사용 (수신): 하나 이상의 서비스 엔드포인트를 공개로 선언하여 서비스에 대한 네트워크 수신 액세스를 허용할 수 있습니다. 예를 보려면 자습서 1 을 참조하십시오.

  • 다른 서비스에서 서비스 사용 (서비스 간 통신): 서비스는 서비스 간 통신을 위해 Snowflake에서 할당된 서비스 DNS 이름을 사용하여 서로 통신할 수 있습니다. 예제는 자습서 3 을 참조하십시오.

참고

  • 작업 서비스는 작업처럼 실행되며 완료되면 종료됩니다. 서비스 함수 또는 수신을 사용하여 작업 서비스와 통신하는 기능은 지원되지 않습니다.

    • 서비스 함수를 작업 서비스의 엔드포인트에 연결할 수 없습니다.

    • 공용 엔드포인트를 정의하는 사양으로 작업 서비스를 생성할 수 없습니다.

  • 작업 서비스와의 서비스 간 커뮤니케이션은 지원됩니다. 즉, 서비스와 작업 서비스가 서로 통신할 수 있습니다.

다음 섹션에서는 세부 정보를 제공합니다.

서비스 함수: SQL 쿼리에서 서비스 사용하기

서비스 함수는 CREATE FUNCTION(Snowpark Container Services) 를 사용하여 생성하는 사용자 정의 함수(UDF)입니다. 그러나 UDF 코드를 직접 작성하는 대신 UDF를 서비스 엔드포인트와 연결합니다. 서비스 함수는 HTTP 또는 HTTPS 프로토콜을 지원하는 서비스 엔드포인트와만 연결할 수 있습니다.

예를 들어 자습서 1 에서는 서비스 사양에 정의된 대로 하나의 엔드포인트(echoendoint)를 노출하는 echo_service 라는 서비스를 만듭니다.

spec:

  endpoints:
  - name: echoendpoint
    port: 8080
Copy

echoendpoint 는 해당 포트(8080)를 나타내는 사용자에게 친숙한 엔드포인트 이름입니다. 이 서비스 엔드포인트와 통신하려면 다음과 같이 SERVICE 및 ENDPOINT 매개 변수를 제공하여 서비스 함수를 만듭니다.

CREATE FUNCTION my_echo_udf (text varchar)
   RETURNS varchar
   SERVICE=echo_service
   ENDPOINT=echoendpoint
   AS '/echo';
Copy

AS 매개 변수는 서비스 코드에 대한 HTTP 경로를 제공합니다. 이 경로 값은 서비스 코드에서 가져옵니다. 예를 들어, 다음 코드 라인은 자습서 1service.py 에서 가져온 것입니다.

@app.post("/echo")
def echo():
...
Copy

서비스 함수를 호출하면 Snowflake는 요청을 연결된 서비스 엔드포인트와 경로로 보냅니다.

참고

서비스 함수는 작업이 아닌 서비스와 통신하는 데 사용됩니다. 즉, (작업이 아니라) 서비스만 서비스 함수와 연결할 수 있습니다.

동시성을 높이기 위해 서비스에 데이터를 전송할 때 배치 크기 지정하기

서비스의 여러 인스턴스를 실행할 때 선택적 MAX_BATCH_ROWS 매개 변수를 지정하여 Snowflake가 서비스에 일괄적으로 전송하는 최대 행 수인 배치 크기 를 제한함으로써 서비스 함수를 생성할 수 있습니다. 예를 들어, MAX_BATCH_ROWS 가 10이고 100개의 입력 행으로 my_echo_udf 서비스 함수를 호출한다고 가정합니다. Snowflake는 각 배치에 최대 10개의 행이 포함되도록 입력 행을 여러 배치로 분할하고 요청 본문에 행 배치가 포함된 일련의 요청을 서비스에 보냅니다. 배치 크기를 구성하면 처리 시간이 적지 않게 소요될 때 도움이 될 수 있으며, 사용 가능한 모든 서버에 행을 분산시켜도 도움이 될 수 있습니다.

ALTER FUNCTION을 사용하여 서비스 함수를 변경할 수 있습니다. 다음 ALTER FUNCTION 명령은 연결되는 서비스 엔드포인트와 배치 크기를 변경합니다.

ALTER FUNCTION my_echo_udf(VARCHAR)
   SET SERVICE=other_service
   ENDPOINT=otherendpoint
   MAX_BATCH_ROWS=100
Copy

데이터 교환 형식

서비스 함수와 애플리케이션 컨테이너 간의 데이터 교환을 위해 Snowflake는 외부 함수가 사용하는 것과 동일한 형식을 따릅니다(데이터 형식 참조). 예를 들어 테이블(input_table)에 데이터 행이 저장되어 있다고 가정합니다.

"Alex", "2014-01-01 16:00:00"
"Steve", "2015-01-01 16:00:00"

이 데이터를 서비스로 보내려면 다음 행을 매개 변수로 전달하여 서비스 함수를 호출합니다.

SELECT service_func(col1, col2) FROM input_table;
Copy

Snowflake는 요청 본문에 다음 형식의 데이터 행 배치를 사용하여 일련의 요청을 컨테이너에 보냅니다.

{
   "data":[
      [
         0,
         "Alex",
         "2014-01-01 16:00:00"
      ],
      [
         1,
         "Steve",
         "2015-01-01 16:00:00"
      ],
      …
      [
         <row_index>,
         "<column1>",
         "<column2>"
      ],
   ]
}
Copy

그런 다음 컨테이너는 다음 형식으로 출력을 반환합니다.

{
   "data":[
      [0, "a"],
      [1, "b"],
      …
      [ row_index,  output_column1]
   ]
}
Copy

표시된 출력 예에서는 결과가 행(“a”, “b”, …)이 있는 1열 테이블이라고 가정합니다.

여러 서비스 인스턴스가 실행 중인 경우 MAX_BATCH_ROWS 매개 변수를 사용하여 서비스 함수를 생성하여 처리할 입력 행을 사용 가능한 모든 서버에 배포할 수 있습니다. 자세한 내용은 동시성을 높이기 위해 서비스에 데이터를 전송할 때 배치 크기 지정하기 섹션을 참조하십시오.

서비스 함수를 생성하고 관리하는 데 필요한 권한

서비스 함수를 생성하고 관리하려면 역할에 다음 권한이 필요합니다.

  • 서비스 함수 생성 방법: 현재 역할에 참조되는 서비스에 대한 USAGE 권한이 있어야 합니다.

  • 서비스 함수 변경 방법: 서비스 함수를 변경하고 이를 다른 서비스와 연결할 수 있습니다. 현재 역할에 새로운 서비스에 대한 USAGE 권한이 있어야 합니다.

  • 서비스 함수 사용 방법: 현재 역할에 서비스 함수에 대한 USAGE 권한이 있어야 하며, 서비스 함수 소유자 역할에는 연결된 서비스에 대한 USAGE 권한이 있어야 합니다.

다음 예제 스크립트는 서비스 함수 사용 권한을 부여하는 방법을 보여줍니다.

USE ROLE service_owner;
GRANT USAGE ON service service_db.my_schema.my_service TO ROLE func_owner;

USE ROLE func_owner;
CREATE OR REPLACE test_udf(v VARCHAR)
  RETURNS VARCHAR
  SERVICE=service_db.my_schema.my_service
  ENDPOINT=endpointname1
  AS '/run';

SELECT test_udf(col1) FROM some_table;

ALTER FUNCTION test_udf(VARCHAR) SET
  SERVICE = service_db.other_schema.other_service
  ENDPOINT=anotherendpoint;

GRANT USAGE ON FUNCTION test_udf(varchar) TO ROLE func_user;
USE ROLE func_user;
SELECT my_test_udf('abcd');
Copy

수신: Snowflake 외부에서 서비스 사용하기

서비스는 사용자가 공개 웹에서 서비스를 사용할 수 있도록 1개 이상의 엔드포인트를 공개 로 노출할 수 있습니다. 이 경우 Snowflake가 액세스 제어를 관리합니다. 수신은 HTTP 또는 HTTPS 엔드포인트에서만 허용됩니다.

서비스 사양 파일에서 엔드포인트를 공용으로 표시합니다.

spec
  ...
  endpoints
  - name: <endpoint name>
    port: <port number>
    public: true
Copy

Snowflake 외부의 공용 엔드포인트 액세스 및 인증

모든 사람이 서비스에서 노출하는 공용 엔드포인트에 액세스할 수 있는 것은 아닙니다. 공용 엔드포인트에 대한 USAGE 권한이 있고 서비스와 동일한 Snowflake 계정을 가진 사용자만 공용 엔드포인트에 액세스할 수 있습니다. 서비스 역할 을 사용하여 이 권한을 부여할 수 있습니다.

이러한 사용자는 브라우저를 사용하거나 프로그래밍 방식으로 공용 엔드포인트에 액세스할 수 있습니다. Snowflake는 OAuth를 사용하여 다음 요청을 인증합니다.

  • 브라우저를 사용하여 공용 엔드포인트에 액세스: 사용자가 브라우저를 사용하여 공용 엔드포인트에 액세스하는 경우 Snowflake는 사용자 인증을 위한 자동 리디렉션을 제공합니다. 사용자는 로그인해야 하며, 사용자 로그인은 백그라운드에서 Snowflake에서 OAuth 토큰을 생성합니다. 그런 다음 OAuth 토큰은 서비스 엔드포인트에 요청을 보내는 데 사용됩니다.

  • 프로그래밍 방식으로 공용 엔드포인트에 액세스: 애플리케이션은 키 페어 인증 을 사용하여 공용 엔드포인트에 대한 요청을 인증할 수 있습니다. 코드에서는 키 페어에서 JSON 웹 토큰(JWT)을 생성하고, JWT 토큰을 Snowflake와 OAuth 토큰으로 교환한 다음, OAuth 토큰을 사용하여 서비스의 공용 엔드포인트에 대한 요청을 인증합니다.

자습서 1 은 공용 엔드포인트 액세스를 테스트하기 위한 단계별 지침을 제공합니다.

자습서 1에서 제공되는 키 페어 인증은 공용 엔드포인트에 액세스할 때 요청을 인증하는 데 권장되는 방법입니다. 키 페어 대신 다음 코드를 인증에 사용할 수 있지만, 이 코드가 향후 버전의 Python용 Snowflake 커넥터 에서 작동한다는 보장은 없습니다. 이 Python 코드는 먼저 Python Connector를 사용하여 ID를 나타내는 세션 토큰을 생성합니다. 그런 다음 이 코드는 세션 토큰을 사용하여 공용 엔드포인트에 로그인합니다.

import snowflake.connector
import requests

ctx = snowflake.connector.connect(
   user="<username>",# username
   password="<password>", # insert password here
   account="<orgname>-<acct-name>",
   session_parameters={
      'PYTHON_CONNECTOR_QUERY_RESULT_FORMAT': 'json'
   })

# Obtain a session token.
token_data = ctx._rest._token_request('ISSUE')
token_extract = token_data['data']['sessionToken']

# Create a request to the ingress endpoint with authz.
token = f'\"{token_extract}\"'
headers = {'Authorization': f'Snowflake Token={token}'}
# Set this to the ingress endpoint URL for your service
url = 'http://<ingress_url>'

# Validate the connection.
response = requests.get(f'{url}', headers=headers)
print(response.text)

# Insert your code to interact with the application here
Copy

코드에서는 다음 사항이 적용됩니다.

  • 계정 정보(<orgname>-<acctname>)를 모르는 경우 자습서 일반 설정 을 참조하십시오.

  • SHOW ENDPOINTS 를 사용하여 서비스에서 노출된 공용 엔드포인트의 ingress_url 을 가져올 수 있습니다.

수신 요청의 사용자별 헤더

수신 엔드포인트에 대한 요청이 도착하면 Snowflake는 HTTP 요청과 함께 다음 헤더를 자동으로 컨테이너에 전달합니다.

Sf-Context-Current-User: <user_name>
Copy

컨테이너 코드는 선택적으로 헤더를 읽고, 호출자가 누구인지 파악하고, 다양한 사용자에 대한 컨텍스트별 사용자 지정을 적용할 수 있습니다. 또한 Snowflake는 선택적으로 Sf-Context-Current-User-Email 헤더를 포함할 수 있습니다. 이 헤더를 포함하려면 Snowflake 지원 에 문의하십시오.

서비스 간 통신

서비스는 Snowflake가 각 서비스에 자동으로 할당하는 DNS 이름을 사용하여 서로 통신할 수 있습니다. 예를 보려면 자습서 3 을 참조하십시오. 서비스 간 통신을 허용하기 위해서만 서비스 엔드포인트를 생성하는 경우에는 TCP 프로토콜을 사용해야 한다는 점에 유의하십시오.

DNS 이름 형식은 다음과 같습니다.

<service-name>.<schema-name>.<db-name>.snowflakecomputing.internal

SHOW SERVICES (또는 DESCRIBE SERVICE)를 사용하여 서비스의 DNS 이름을 가져옵니다. 앞의 DNS 이름은 전체 이름입니다. 동일한 스키마에서 생성된 서비스는 <service-name> 만 사용하여 통신할 수 있습니다. 동일한 데이터베이스에 있지만 스키마는 다른 서비스는 <service-name>.<schema-name> 과 같은 스키마 이름을 제공해야 합니다.

Snowflake는 동일한 역할로 생성된 서비스 간의 네트워크 통신을 허용하고, 서로 다른 역할에 의해 생성된 서비스 간의 네트워크 통신을 차단합니다. (보안 등의 이유로) 서비스가 서로 통신하지 못하도록 하려면 다른 Snowflake 역할을 사용하여 해당 서비스를 생성하십시오.

DNS 이름에는 다음과 같은 제한 사항이 있습니다.

  • 데이터베이스, 스키마 또는 서비스 이름은 유효한 DNS 레이블이어야 합니다. (https://www.ietf.org/rfc/rfc1035.html#section-2.3.1 참조). 그렇지 않으면 서비스 생성이 실패합니다.

  • Snowflake는 이름(데이터베이스, 스키마 및 서비스 이름)의 밑줄(_)을 DNS 이름의 대시(-)로 바꿉니다.

  • Snowflake는 서비스의 DNS 이름을 업데이트하지 않으므로 서비스를 생성한 후에는 데이터베이스 또는 스키마 이름을 변경하지 마십시오.

  • DNS 이름은 동일한 계정에서 실행되는 서비스 사이에서 Snowflake 내의 내부 통신에만 사용됩니다. 인터넷에서는 액세스할 수 없습니다.

권한

권한

사용법

참고

USAGE

서비스와 통신하려면 서비스 엔드포인트에 대한 USAGE 권한 이 필요합니다. 서비스 함수를 생성하고, 공용 엔드포인트를 사용하고, 다른 서비스에서 연결하는 데 필요합니다.

MONITOR

서비스를 모니터링하고 런타임 상태를 가져올 권한입니다.

OPERATE

서비스를 일시 중단하거나 재개할 권한입니다.

OWNERSHIP

서비스를 완벽하게 제어할 권한입니다. 특정 오브젝트에 대해 한 번에 단 하나의 역할만 이 권한을 보유할 수 있습니다.

ALL [ PRIVILEGES ]

OWNERSHIP을 제외하고 서비스에 대한 모든 권한을 부여합니다.