Snowpipe Streaming 고성능 아키텍처 설정
Snowpipe Streaming 고성능 아키텍처 설정
이 가이드는 Java, Python, Node.js SDK에서 사용할 수 있는 고성능 Snowpipe Streaming 클라이언트의 구성 설정을 설명합니다. 두 가지 종류의 구성이 있습니다.
- 프로세스 전역 환경 변수(Process-wide environment variables): 실행 중인 전체 애플리케이션의 로깅과 지표를 제어하며 클라이언트를 초기화하기 전에 설정해야 합니다.
- 클라이언트 측 속성(Client-side properties): 보안 연결과 수집 대상을 정의하는 속성 — 예:
url,user,private_key— 으로, 보통 인라인 맵이나profile.json파일을 통해 특정 클라이언트 객체에 대해 구성합니다.
단일 애플리케이션이 여러 클라이언트 객체를 실행할 수 있습니다. 각 객체는 자체 클라이언트 측 속성을 가지지만, 로깅과 지표를 위한 프로세스 전역 환경 변수 설정은 모두 공유합니다.
고성능 아키텍처는 클라이언트가 특정 PIPE 객체에 명시적으로 바인딩되도록 요구합니다. PIPE가 스키마, 변환, 대상 테이블로의 수집을 관리합니다.
출처: Snowflake 문서
본문
환경 변수
이 구성 설정은 로깅과 지표 수집 같은 프로세스 전역 동작을 제어하며, 클라이언트 객체가 초기화되기 전에 환경 변수로 구성해야 합니다. 다음 표는 같은 프로세스 안의 모든 Snowpipe Streaming 클라이언트 객체에 적용되는 환경 변수를 보여줍니다.
| 변수 | 설명 | 기본값 |
|---|---|---|
SS_ENABLE_METRICS |
내장 Prometheus 지표 서버를 활성화하려면 TRUE로 설정합니다. | FALSE |
SS_METRICS_PORT |
지표를 노출하는 데 사용되는 포트. | 50000 |
SS_METRICS_IP |
지표 서버가 호스팅되는 IP 주소. | 127.0.0.1 |
SS_LOG_LEVEL |
출력할 최소 로깅 레벨. | info (옵션: info, warn, error) |
SS_APPLICATION |
application 클라이언트 속성의 대체 값. 클라이언트 생성 시 application이 설정되지 않은 경우 Connection String Identifier (CSID) 를 통한 파트너 귀속(attribution)에 사용됩니다. application과 동일한 제약을 받습니다: (, ), \\를 제외한 1–64개의 표시 가능한 ASCII 문자(0x21–0x7E). |
(없음) |
필수 속성
고성능 SDK는 보안 연결과 특정 수집 대상(PIPE)을 모두 설정하기 위해 몇 가지 속성을 요구합니다. 다음 표는 필수 연결 및 사용자 인증 속성을 보여줍니다.
| 속성 | 설명 |
|---|---|
url |
계정 식별자를 포함한 Snowflake 계정에 접근하기 위한 URL. 프로토콜(https://)과 포트 번호는 선택 사항입니다. |
user |
Snowflake 계정의 사용자 로그인 이름. |
account |
Snowflake 계정 식별자; 예: xy12345. |
authorization_type가 기본값인 JWT로 설정된 경우, 다음 표와 같이 키 내용 또는 키 파일 경로 중 하나를 제공해야 합니다.
| 속성 | 설명 |
|---|---|
private_key |
사용자를 인증하는 데 사용되는 개인 키 내용. 키 내용만 포함하세요. 헤더, 푸터, 줄 바꿈 없이. |
private_key_file |
개인 키의 파일 경로; 예: rsa_key.p8. 키 내용을 직접 제공하는 것의 대안입니다. |
private_key_passphrase |
암호화된 개인 키의 선택적 패스프레이즈. |
authorization_type가 OAUTH로 설정된 경우, 다음 표와 같이 OAuth 클라이언트 자격 증명과 refresh token을 제공해야 합니다.
| 속성 | 설명 |
|---|---|
oauth_client_id |
보안 통합을 위한 OAuth 클라이언트 ID. |
oauth_client_secret |
보안 통합을 위한 OAuth 클라이언트 시크릿. |
oauth_refresh_token |
새 OAuth 액세스 토큰을 얻는 데 사용되는 refresh token. Snowflake OAuth 및 External OAuth(refresh_token flow)에 필수. External OAuth client_credentials flow에서는 생략. |
oauth_token_endpoint |
External OAuth를 위한 토큰 엔드포인트 URL. Snowflake OAuth에서는 생략(SDK가 계정 URL에서 엔드포인트를 유도). |
authorization_type가 PAT로 설정된 경우, 다음 표와 같이 personal access token을 제공해야 합니다.
| 속성 | 설명 |
|---|---|
personal_access_token |
personal access token 값. PAT 인증은 user 속성을 요구하지 않습니다. |
선택 속성
다음 표는 고성능 SDK의 선택 속성을 보여줍니다.
| 속성 | 설명 |
|---|---|
role |
Snowflake에 연결한 후 세션에 사용할 액세스 제어 역할. |
authorization_type |
인증 방법을 구성하는 속성. 옵션: JWT(키-쌍 인증, 기본), OAUTH(OAuth 액세스 토큰), PAT(personal access token). OAuth와 PAT는 SDK 버전 1.4.0 이상이 필요합니다. |
application |
파트너 애플리케이션을 식별하는 선택적 문자열. 모든 발신 요청의 User-Agent 헤더에 (app=)로 추가되어 Connection String Identifier (CSID) 를 통한 파트너 귀속을 가능하게 합니다. (, ), \\를 제외한 1–64개의 표시 가능한 ASCII 문자(0x21–0x7E)여야 합니다. 설정하지 않으면 동일한 제약을 받는 SS_APPLICATION 환경 변수로 대체됩니다. |
시크릿 외부화(Externalizing secrets)
Snowflake는 private_key 및 OAuth 자격 증명 같은 시크릿을 외부화해 예를 들어 AWS KMS 같은 키 관리 서비스에 저장할 것을 강력히 권장합니다.
FIPS 140-3 준수
SDK 버전 1.5.0부터 Snowpipe Streaming SDK는 TLS 연결과 데이터 암호화에 FIPS 140-3 검증 암호화 제공자를 사용합니다. 이 변경은 Java, Python, Node.js SDK에 적용되며 자동으로 활성화됩니다. 애플리케이션을 업데이트하거나 구성을 변경할 필요가 없습니다.
이것이 애플리케이션에 의미하는 바는 다음과 같습니다.
- Snowflake 및 클라우드 스토리지 제공자에 대한 TLS 연결이 FIPS 140-3 검증 알고리즘을 사용합니다.
- SDK가 HTTPS 전용 연결을 강제합니다. 비-TLS 엔드포인트는 거부됩니다.
- SDK가 시작 시 암호화 셀프 테스트를 실행합니다. 셀프 테스트가 실패하면 명확한 오류와 함께 클라이언트 생성이 실패하고 프로세스는 계속되지 않습니다.
고객 영향:
- 이미 HTTPS로 Snowflake에 연결하는 기존 애플리케이션은 변경 없이 계속 작동합니다.
- 프록시를 통해 SDK 트래픽을 라우팅하는 애플리케이션은 TLS 종료 프록시(TLS-terminating proxy)를 사용해야 합니다. 일반 HTTP 프록시와
http://URL은 거부됩니다. - SnowGov 리전 및 공식 FIPS 140-2 또는 140-3 요구 사항이 있는 다른 배포에 대해서는 지원되는 클라우드 리전 을 참고하세요.
구성 예시
다음 예시는 클라이언트 측 및 환경 변수 구성을 보여줍니다.
profile.json 파일을 통한 클라이언트 측 구성
다음 예시는 클라이언트 측 속성을 정의하는 방법을 보여줍니다.
// profile.json
{
"authorization_type": "JWT",
"url": "https://.snowflakecomputing.com",
"user": "MY_SNOWFLAKE_USER",
"account": "XY12345",
"private_key_file": "/path/to/rsa_key.p8",
"role": "MY_INGEST_ROLE"
}
인라인으로 제공되는 클라이언트 측 구성
다음 예시는 코드에서 직접 클라이언트 측 속성을 정의하는 방법을 보여줍니다.
Map config = new HashMap<>();
config.put("authorization_type", "JWT");
config.put("url", "https://.snowflakecomputing.com");
config.put("user", "MY_SNOWFLAKE_USER");
config.put("account", "XY12345");
config.put("private_key_file", "/path/to/rsa_key.p8");
config.put("role", "MY_INGEST_ROLE");
// ... code to initialize client with 'config'
config = {
"authorization_type": "JWT",
"url": "https://.snowflakecomputing.com",
"user": "MY_SNOWFLAKE_USER",
"account": "XY12345",
"private_key": "[REDACTED PRIVATE KEY]",
}
# ... code to initialize client with 'config'
const { createClient } = require("snowpipe-streaming");
const client = await createClient({
clientName: "my-client",
dbName: "MY_DATABASE",
schemaName: "MY_SCHEMA",
pipeName: "MY_PIPE",
properties: {
authorization_type: "JWT",
url: "https://.snowflakecomputing.com",
user: "MY_SNOWFLAKE_USER",
account: "XY12345",
private_key: "[REDACTED PRIVATE KEY]",
},
});
환경 변수 구성
다음 예시는 애플리케이션을 실행하기 전에 셸에서 프로세스 전역 환경 변수를 정의하는 방법을 보여줍니다.
Linux 또는 macOS (Bash 또는 Zsh)
# Set the log level for the entire application process to 'warn'
export SS_LOG_LEVEL=warn
# Change the IP for metrics to a specific loopback address
export SS_METRICS_IP=127.0.0.5
# Now run your application
Windows (command prompt)
# Set the log level for the entire application process to 'warn'
set SS_LOG_LEVEL=warn
# Change the metrics port
set SS_METRICS_PORT=55000
# Now run your application