자습서 3: Snowpark Container Service 만들기 및 관리¶
소개¶
Snowpark Container Services 는 Snowflake 생태계 내에서 컨테이너화된 애플리케이션의 배포, 관리, 확장을 촉진하도록 설계된 완전 관리형 컨테이너 서비스입니다. 이 기능을 사용하면 Snowflake 내에서 컨테이너화된 워크로드를 직접 실행할 수 있습니다.
이 자습서에서는 Snowflake Python APIs 을 사용하여 Snowpark Container Services 에서 컴포넌트를 관리하는 방법을 알아봅니다.
중요
Snowpark Container Services 는 일반적으로 AWS의 Snowflake 계정에서 사용할 수 있습니다. 미리 보기 지원 은 Azure의 계정에서 사용할 수 있습니다. 자세한 내용은 Snowpark Container Services – 이용 가능한 리전 섹션을 참조하십시오.
전제 조건¶
이 자습서를 시작하기 전에 다음 단계를 완료해야 합니다.
Docker Desktop을 설치합니다.
이 자습서에서는 Docker Desktop이 필요한 지침을 제공합니다. 설치 지침은 https://docs.docker.com/get-docker/ 섹션을 참조하십시오.
다음 단계가 포함된 일반 설정 지침을 따릅니다.
개발 환경을 설정합니다.
Snowflake Python APIs 패키지를 설치합니다.
Snowflake 연결을 구성합니다.
Python API 자습서에 필요한 모든 모듈을 가져옵니다.
API
Root
오브젝트를 생성합니다.
참고
이미 공통 설정 을 완료했다면 이 단계를 건너뛰고 자습서를 시작할 수 있습니다.
이러한 사전 요구 사항을 완료하면 Snowpark Container Services 를 관리하기 위해 API를 사용할 준비가 된 것입니다.
개발 환경 설정¶
이전 Snowflake Python APIs 자습서에서 노트북을 사용했다면 이 자습서에서는 새 노트북으로 전환합니다. 이 노트북에는 Snowpark Container Services 를 사용하여 NGINX 웹 서버를 실행하는 샘플 코드가 포함되어 있으며, 모두 Snowflake에서 실행됩니다.
선호하는 코드 편집기를 사용하거나
jupyter notebook
명령을 실행해 새 노트북을 엽니다.노트북의 첫 번째 셀에서 다음 코드를 실행합니다.
from snowflake.core.database import Database from snowflake.core.schema import Schema database = root.databases.create(Database(name="spcs_python_api_db"), mode="orreplace") schema = database.schemas.create(Schema(name="public"), mode="orreplace")
앞서 공통 설정 에서 생성한 Snowflake 연결 및
root
오브젝트를 사용하여 해당 데이터베이스에spcs_python_api_db
데이터베이스와public
스키마를 생성합니다. 새로 생성된 오브젝트를 나타내는 참조도 저장합니다. Snowpark Container Services 컴포넌트는 이 데이터베이스와 스키마에 저장됩니다.
Snowpark Container Services 의 개요¶
자습서를 계속 진행하기 전에 Snowpark Container Services 의 주요 구성 요소를 간략히 살펴봅니다. Snowpark Container Services 에서 컨테이너화된 애플리케이션을 실행하려면 일반적으로 다음 오브젝트로 작업합니다.
이미지 리포지토리: Snowflake 계정에 애플리케이션 이미지를 업로드할 수 있는 저장소를 제공합니다.
Snowpark Container Services 는 OCI 클라이언트(예: Docker CLI 및 SnowSQL)가 Snowflake 계정의 이미지 레지스트리에 액세스할 수 있도록 활성화하는 OCIv2 호환 이미지 레지스트리 서비스를 제공합니다. 이러한 클라이언트를 사용하여 애플리케이션 이미지를 리포지토리에 업로드할 수 있습니다.
자세한 내용은 이미지 레지스트리 및 리포지토리 작업하기 를 참조하십시오.
컴퓨팅 풀: 컴퓨팅 리소스(가상 머신 노드) 집합을 나타냅니다.
이러한 컴퓨팅 리소스는 Snowflake 가상 웨어하우스와 유사하지만 동일하지는 않습니다. 서비스(이 경우, 사용자의 NGINX 서비스)가 컴퓨팅 풀에서 실행됩니다. 컴퓨팅 집약적인 서비스는 많은 코어와 많은 GPUs가 장착된 고성능 컴퓨팅 풀이 필요하지만, 덜 집약적인 서비스는 코어 수가 적은 소규모 컴퓨팅 풀에서 실행할 수 있습니다.
자세한 내용은 컴퓨팅 풀 작업하기 를 참조하십시오.
서비스: 애플리케이션 컨테이너를 실행하는 방법을 제공합니다.
서비스에는 최소한 사양과 컴퓨팅 풀이 필요합니다. 사양에는 컨테이너 이미지 경로, 서비스가 노출할 엔드포인트 등 애플리케이션 컨테이너를 실행하는 데 필요한 정보가 포함되어 있습니다. 사양은 YAML로 작성되어 있습니다. 컴퓨팅 풀은 서비스가 실행되는 컴퓨팅 리소스의 집합입니다.
자세한 내용은 서비스 작업하기 섹션을 참조하십시오.
다음 단계로 이동하여 이러한 오브젝트를 생성하고 설정합니다.
이미지 리포지토리 만들기¶
이 섹션에서는 먼저 Snowflake Python APIs 을 사용하여 이미지 리포지토리를 생성합니다. 그런 다음 Docker Hub에서 NGINX 애플리케이션 이미지를 가져오고 Docker CLI를 사용하여 이미지 리포지토리에 이미지를 업로드합니다.
리포지토리 만들기 및 리포지토리에 대한 정보 가져오기
노트북의 다음 셀에서 다음 코드를 실행합니다.
from snowflake.core.image_repository import ImageRepository my_repo = ImageRepository("MyImageRepository") schema.image_repositories.create(my_repo)
이 코드 예제에서는 이 자습서에서 이전에 생성한 데이터베이스와 스키마에 이미지 리포지토리를 생성합니다.
리포지토리의 세부 정보를 가져오고 이름을 출력하여 리포지토리가 성공적으로 생성되었는지 확인하려면 다음 코드를 실행합니다.
my_repo_res = schema.image_repositories["MyImageRepository"] my_repo = my_repo_res.fetch() print(my_repo.name)
리포지토리(리포지토리 URL 및 레지스트리 호스트 이름)에 대한 정보가 있어야 이미지를 업로드할 수 있습니다.
리포지토리 URL을 가져오려면 다음 셀에서 다음 코드를 실행합니다.
repositories = schema.image_repositories for repo_obj in repositories.iter(): print(repo_obj.repository_url)
출력의
repository_url
특성은 URL을 제공합니다. 예:<orgname>-<acctname>.registry.snowflakecomputing.com/spcs_python_api_db/public/myimagerepository
리포지토리 URL의 호스트 이름은 레지스트리 호스트 이름입니다. 예:
<orgname>-<acctname>.registry.snowflakecomputing.com
NGINX이미지를 가져와 리포지토리에 업로드하기
Docker가 사용자를 대신하여 리포지토리에 이미지를 업로드하려면 먼저 Snowflake로 Docker를 인증해야 합니다.
Snowflake 레지스트리로 Docker를 인증하려면 명령줄 터미널을 열고 Docker CLI를 사용하여 다음
docker login
명령을 실행합니다.docker login <registry_hostname> -u <username>
registry_hostname
: 이전 단계의 결과에서repository_url
에 호스트 이름을 지정합니다.username
: Snowflake 사용자 이름을 지정합니다. Docker가 비밀번호를 묻는 메시지를 표시합니다.
예
docker login myorg-myacct.registry.snowflakecomputing.com -u admin
Docker Hub에서 NGINX 이미지: 의 AMD64 빌드 가져오기
docker pull --platform linux/amd64 amd64/nginx
amd64/nginx
이미지에 Snowflake 이미지 리포지토리 URL을 태그로 지정합니다.docker tag docker.io/amd64/nginx:latest <repository_url>/<image_name>
예
docker tag docker.io/amd64/nginx:latest myorg-myacct.registry.snowflakecomputing.com/spcs_python_api_db/public/myimagerepository/amd64/nginx:latest
태그는 특정 버전이나 이미지 변형을 식별하는 데 사용할 수 있는 사용자 지정형 인간이 읽을 수 있는 식별자입니다.
Snowflake 계정의 리포지토리에 이미지를 업로드합니다.
docker push <repository_url>/<image_name>
예
docker push myorg-myacct.registry.snowflakecomputing.com/spcs_python_api_db/public/myimagerepository/amd64/nginx:latest
컴퓨팅 풀 만들기¶
컴퓨팅 풀을 정의하고 생성하려면 노트북의 다음 셀에서 다음 코드를 실행합니다.
new_compute_pool_def = ComputePool(
name="MyComputePool",
instance_family="CPU_X64_XS",
min_nodes=1,
max_nodes=2,
)
new_compute_pool = root.compute_pools.create(new_compute_pool_def)
이 셀에서는 다음 특성에 대한 값을 제공하여 ComputePool
생성자를 사용해 컴퓨팅 풀을 정의합니다.
instance_family
: 인스턴스 제품군은 컴퓨팅 풀의 노드에 프로비저닝할 머신의 유형을 식별합니다.각 머신 유형은 해당 컴퓨팅 풀에 서로 다른 양의 컴퓨팅 리소스를 제공합니다. 이 셀에서는 사용 가능한 가장 작은 머신 유형인
CPU_X64_XS
를 사용합니다. 자세한 내용은 CREATE COMPUTE POOL 섹션을 참조하십시오.min_nodes
: 컴퓨팅 풀을 시작할 최소 노드 수입니다.max_nodes
: 컴퓨팅 풀이 확장할 수 있는 최대 노드 수입니다.컴퓨팅 풀을 생성하면 Snowflake는 지정된 최소 노드 수로 해당 풀을 시작합니다. 그러면 Snowflake가 자동으로 확장을 관리하고, 실행 중인 노드가 추가 워크로드를 감당할 수 없을 때 최대 지정된 개수까지 새로운 노드를 생성합니다.
그런 다음 컴퓨팅 풀 정의를 compute_pools.create()
에 전달하여 컴퓨팅 풀을 생성합니다.
서비스를 만듭니다.¶
이제 설정한 이미지 리포지토리와 컴퓨팅 풀을 사용하여 서비스를 정의하고 생성할 수 있습니다. 서비스란 Snowflake에서 모두 조정되는 컴퓨팅 풀에서 실행되는 컨테이너 모음을 말합니다.
컨테이너 이미지가 포함된 리포지토리를 검색하려면 노트북의 다음 셀에서 다음 코드를 실행합니다.
image_repository = schema.image_repositories["MyImageRepository"]
이 리포지토리는 PUBLIC 스키마에 스테이지로 나열된 Snowflake 계정에 있습니다. 다음 단계에서 컨테이너 이미지 정보를 가져오려면 이 참조가 필요합니다.
서비스를 정의하고 생성하려면 다음 셀에서 다음 코드를 실행합니다.
from textwrap import dedent from io import BytesIO from snowflake.core.service import Service, ServiceSpecInlineText specification = dedent(f"""\ spec: containers: - name: web-server image: {image_repository.fetch().repository_url}/amd64/nginx:latest endpoints: - name: ui port: 80 public: true """) service_def = Service( name="MyService", compute_pool="MyComputePool", spec=ServiceSpecInlineText(specification), min_instances=1, max_instances=1, ) nginx_service = schema.services.create(service_def)
이 셀은 서비스 사양과 서비스를 정의한 다음 NGINX 웹 서버에 대한 서비스를 생성합니다. 사양 및 서비스에 대한 정의는 다음과 같은 속성을 갖습니다.
specification
– Python 형식이 지정된 문자열 리터럴 (f-string)을 사용하여 사양을 정의합니다. 문자열은 YAML로 형식이 지정됩니다.사양에는 컨테이너 이름, 컨테이너 이미지 경로, 서비스가 대중에게 공개될 엔드포인트가 포함됩니다. 이 예제에서는 사양을 인라인으로 정의하지만, 스테이지에서
.yml
파일에 대한 참조로 사양을 정의할 수도 있습니다.service_def
–Service
생성자를 사용하여 서비스 이름, 서비스가 실행될 컴퓨팅 풀, 사양 경로, 서비스의 총 인스턴스 수를 전달하여 서비스를 정의합니다.이 셀에서는 사양을 인라인으로 f- 문자열로 정의하기 때문에
ServiceSpecInlineText
를 사용하여spec
의 값을 설정합니다. 여러 인스턴스를 실행하도록 서비스를 지정할 수 있지만, 이 예제에서는min_instances
및max_instances
를1
로 설정하여 실행할 서비스 인스턴스를 하나만 지정합니다.
서비스 상태를 확인하려면 다음 셀에서 다음 코드를 실행합니다.
from pprint import pprint pprint(nginx_service.get_service_status(timeout=5))
출력은 다음과 유사해야 합니다.
{'auto_resume': True, 'auto_suspend_secs': 3600, 'instance_family': 'CPU_X64_XS', 'max_nodes': 1, 'min_nodes': 1, 'name': 'MyService'}
자체 서비스 사용¶
서비스를 생성한 후 Snowpark Container Services 는 서비스에 액세스하는 데 필요한 엔드포인트를 프로비저닝하는 데 몇 분 정도 걸립니다.
엔드포인트의 상태를 확인하려면 노트북의 다음 셀에서 다음 코드를 실행합니다.
import json, time while True: public_endpoints = nginx_service.fetch().public_endpoints try: endpoints = json.loads(public_endpoints) except json.JSONDecodeError: print(public_endpoints) time.sleep(15) else: break
이 코드 예제는 Snowpark Container Services 또는 Snowflake Python APIs 에 특정한 것이 아니라 엔드포인트가 준비되었는지 확인하는 편리한 방법을 제공할 뿐입니다. 서비스 오브젝트에서
.fetch().public_endpoints
를 호출하여 엔드포인트를 가져옵니다.출력은 다음과 유사해야 합니다.
Endpoints provisioning in progress... check back in a few minutes Endpoints provisioning in progress... check back in a few minutes Endpoints provisioning in progress... check back in a few minutes
엔드포인트가 프로비저닝된 후에는 브라우저에서 공개 엔드포인트를 열 수 있습니다.
다음 셀에서 다음 코드를 실행합니다.
import webbrowser print(f"Visiting {endpoints['ui']} in your browser. You might need to log in there.") webbrowser.open(f"https://{endpoints['ui']}")
출력은 다음과 유사해야 합니다.
Visiting myorg-myacct.snowflakecomputing.app in your browser. You might need to log in there.
성공하면 엔드포인트 방문 시 브라우저에 다음과 같은 NGINX 성공 페이지가 표시됩니다.
Python API를 사용하여 새 서비스를 관리할 수 있습니다.
예를 들어, 서비스를 일시 중단한 후 상태를 확인하려면 다음 코드를 실행합니다.
from time import sleep nginx_service.suspend() sleep(3) print(nginx_service.get_service_status(timeout=5))
서비스를 다시 시작하려면 다음 코드를 실행합니다.
nginx_service.resume() sleep(3) print(nginx_service.get_service_status(timeout=5))
단 몇 줄의 Python으로 Snowpark Container Services 를 사용하여 Snowflake에서 NGINX 웹 서버를 실행할 수 있었습니다.
정리¶
Snowflake는 계정의 활성 컴퓨팅 풀 노드에 대해 요금을 청구합니다. 원치 않는 요금이 청구되는 것을 방지하려면 먼저 서비스와 컴퓨팅 풀을 일시 중단한 다음, 두 오브젝트를 모두 삭제합니다.
컴퓨팅 풀과 서비스를 일시 중단하려면 노트북의 다음 셀에서 다음 코드를 실행합니다.
new_compute_pool_def.suspend() nginx_service.suspend()
컴퓨팅 풀과 서비스를 삭제하려면 다음 코드를 실행합니다.
new_compute_pool_def.drop() nginx_service.drop()
다음에는 무엇을 해야 합니까?¶
축하합니다! 이 자습서에서는 Snowflake Python APIs 을 사용하여 Snowpark Container Services 에서 컴포넌트를 관리하는 기본 사항을 배웠습니다.
요약¶
이 과정에서 다음 단계를 완료했습니다.
애플리케이션 이미지를 업로드하는 이미지 리포지토리를 생성합니다.
서비스가 실행되는 컴퓨팅 풀을 생성합니다.
애플리케이션 컨테이너를 실행하는 서비스를 생성합니다.
서비스를 사용하고 관리합니다.
Snowpark Container Services 리소스 오브젝트를 일시 중단하고 삭제하여 정리합니다.
추가 리소스¶
API를 사용하여 Snowflake에서 다른 유형의 오브젝트를 관리하는 더 많은 예제는 다음 개발자 가이드를 참조하십시오.
가이드 |
설명 |
---|---|
데이터베이스, 스키마, 테이블을 생성하고 관리하려면 API를 사용합니다. |
|
API를 사용하여 사용자, 역할 및 보조금을 생성하고 관리합니다. |
|
API를 사용하여 외부 볼륨, 파이프, 스테이지를 포함한 데이터 로딩 및 언로딩 리소스를 생성하고 관리합니다. |
|
API를 사용하여 작업과 작업 그래프를 생성, 실행, 관리합니다. |