Snowflake Connector for PostgreSQL Agent 컨테이너 설정하기¶
참고
Snowflake Connector for PostgreSQL 에는 커넥터 약관 이 적용됩니다.
이 항목에서는 Snowflake Connector for PostgreSQL 에이전트 컨테이너를 설정하는 절차를 설명합니다. 데이터베이스 커넥터 에이전트는 인프라 내부에서 실행되는 컨테이너화된 애플리케이션으로, 데이터베이스와 Snowflake에 직접 연결합니다.
Snowflake Connector for PostgreSQL 에이전트를 구성하는 과정에는 다음 단계가 포함됩니다.
전제 조건 검토 및 오케스트레이션 시스템 선택하기¶
모든 전제 조건을 검토하고 완료한 다음 에이전트 구성 및 실행하기 로 진행합니다.
컨테이너 오케스트레이션 시스템 선택하기¶
에이전트는 표준 Docker 컨테이너 이미지로 패키징되며 표준을 지원하는 모든 오케스트레이션 시스템에서 실행될 수 있습니다. 이는 독립 실행형 Docker 인스턴스, Kubernetes, RedHat OpenShift, 클라우드 관리형 솔루션(예: AWS Fargate) 등이 될 수 있습니다. 조직마다 선호하고 지금까지 사용해온 기존 시스템이 있는 경우가 많습니다.
다양한 오케스트레이션 시스템마다 제약 조건이 제각기 다르므로 이 문서의 에이전트 구성 섹션에 주의하십시오. 사용자 시스템이나 특정 설정에 따라 쓰기 가능한 볼륨(에이전트의 기본 구성 옵션에 필수 사항)을 탑재하지 못할 수도 있습니다.
이후의 예에서는 가장 인기 있는 오케스트레이션 시스템인 Kubernetes에 초점을 맞추겠습니다. 다른 시스템에서도 접근 방식이 비슷한 경우가 많으며, 자신의 설정에 맞게 예시의 내용을 조정해야 합니다.
필요한 시스템 리소스 확인하기¶
에이전트는 메모리를 많이 사용하는 애플리케이션으로, 올바르게 작동하려면 최소 6GB 이상의 RAM이 필요합니다.
CPU의 최적 개수는 4개입니다. CPU 수가 적으면 성능이 저하될 수 있습니다. CPU 수가 많아도 성능이 향상되지 않습니다.
연결 설정하기¶
에이전트는 데이터를 읽을 모든 원본 데이터베이스에 연결해야 합니다. 직접 연결이 가능하고 PostgreSQL의 클라이언트 포트에 접근할 수 있도록 네트워크와 방화벽을 구성합니다. 일반적으로 포트 5432
입니다. 자세한 내용은 PostgreSQL의 연결 설정 설명서 섹션을 참조하십시오.
원본 데이터베이스가 격리된 네트워크에 있고 단일 에이전트에서 연결할 수 없는 경우 각각 자체 에이전트가 있는 커넥터의 네이티브 애플리케이션 인스턴스를 추가로 설치해야 합니다. 이 기능은 현재 비공개 미리 보기로 제공됩니다. 액세스를 요청하려면 Snowflake 지원팀 에 문의하십시오.
에이전트는 Snowflake 배포에 직접 연결하기도 합니다. 사용 가능해야 하는 호스트 이름에 대한 정보는 호스트 이름 허용하기 를 참조하십시오.
에이전트의 연결 중 하나가 프록시를 통과하는 경우 에이전트에 추가 구성을 전달해야 합니다. 선택적 구성 환경 변수 검토하기 섹션을 참조하십시오.
에이전트 구성 및 실행하기¶
에이전트 구성 및 실행은 다음 단계로 구성됩니다.
에이전트 구성 파일 또는 에이전트의 환경 변수 준비 및 에이전트 시작하기
필요한 경우 PrivateLink 연결 설정하기
선택적으로 Kubernetes를 사용하여 오케스트레이션을 구성합니다.
[선택 사항] 원본 데이터베이스에 대한 SSL 인증서 획득 및 준비하기¶
에이전트와 원본 데이터베이스 간에 SSL 연결을 사용하려면 PostgreSQL 인스턴스에 대한 루트 인증서를 획득해 /home/agent/.postgresql/root.crt
아래에 있는 에이전트 컨테이너에 탑재해야 합니다.
에이전트 구성 준비하기¶
에이전트는 컨테이너에 탑재된 JSON 파일이나 환경 변수, 또는 두 가지를 혼합하여 구성할 수 있습니다. Snowflake에 연결하는 데 필요한 액세스 키는 호스트의 파일 시스템에서 탑재하거나 컨테이너 시크릿 또는 환경 변수로 제공할 수 있습니다.
다음 섹션에서는 가장 간단한 것부터 가장 포괄적인 것까지 다양한 구성 옵션을 설명합니다. 해당 인프라의 특성에 따라 접근 방식을 선택하십시오.
에이전트를 구성하는 가장 간단한 방법은 런타임에 두 JSON 파일을 컨테이너에 탑재하는 것입니다.
snowflake.json
에는 에이전트가 Snowflake 계정에 연결할 수 있는 구성이 포함됩니다.Snowsight에서 사용할 수 있는 마법사를 통해 커넥터 설정 과정이 끝나면 이 파일을 다운로드합니다.
datasources.json
에는 에이전트가 연결할 원본 데이터베이스 목록이 포함됩니다.이 파일은 직접 준비해야 합니다.
다운로드 직후, snowflake.json
은 에이전트를 나타내는 Snowflake 서비스 계정의 임시 개인 키를 포함합니다. 처음으로 에이전트를 시작할 때 에이전트는 해당 임시 키를 자동으로 새로운 영구 키 세트로 바꾸어 컨테이너 내부의 경로 /home/agent/.ssh/
에 출력합니다. 에이전트가 시작하려면 snowflake.json
과 /home/agent/.ssh/
아래의 경로가 모두 쓰기 가능으로 탑재되어야 합니다.
또는 에이전트의 서비스 계정에 대한 자체 개인 키를 제공할 수도 있습니다. 전달할 필수 환경 변수는 선택적 구성 환경 변수 검토하기 섹션을 참조하십시오.
조심
에이전트가 탑재된 파일이나 환경 변수로 기존 개인 키를 찾는 경우 snowflake.json
에 아직 있을 수 있는 임시 키를 무시합니다.
다음 템플릿을 복사하고 채워서 datasources.json
파일을 준비합니다.
{
"<data_source_name_1>": {
"url": "jdbc:postgresql://<host>:<port>/<databaseName>[?<key1>=<value1>[&<key2>=<value2>]]",
"username": "<postgresql_db_username>",
"password": "<postgresql_db_password>",
"publication": "<postgresql_db_publication>",
"ssl": false
},
"<data_source_name_2>": {
"url": "jdbc:postgresql://<host>:<port>/<databaseName>[?<key1>=<value1>[&<key2>=<value2>]]",
"username": "<postgresql_db_username>",
"password": "<postgresql_db_password>",
"publication": "<postgresql_db_publication>",
"ssl": false
}
}
파일을 생성할 경우
URL과 함께 하나 이상의 데이터 원본을 추가해야 하며, 그렇지 않으면 에이전트가 시작되지 않습니다.
에이전트가 모든 데이터 원본에 직접 연결할 수 있는 한, 데이터 원본을 필요한 수만큼 추가할 수 있습니다.
입력한 이름은 나중에 커넥터의 네이티브 앱을 호출하고 복제를 활성화하는 데 필요한 식별자가 됩니다. 이름은 데이터 원본마다 고유해야 합니다.
데이터 원본의 이름에는 문자와 숫자만 포함할 수 있습니다. 에이전트가 모든 소문자를 자동으로 대문자로 변경합니다.
ssl
매개 변수를true
로 설정하여 SSL 연결을 활성화하는 경우, 원본 데이터베이스의 루트 인증서도 컨테이너에 탑재해야 합니다. [선택 사항] 원본 데이터베이스에 대한 SSL 인증서 획득 및 준비하기 섹션을 참조하십시오.
두 JSON 파일이 모두 제자리에 있고 새로운 키 세트를 출력할 디렉터리와 선택 사항으로서 루트 SSL 인증서가 준비되면 컨테이너를 시작합니다.
docker run -d \
--restart unless-stopped \
--name database-connector-agent \
--volume </path/to/ssh/keys/directory>:/home/agent/.ssh \
--volume </path/to/snowflake.json>:/home/agent/snowflake.json \
--volume </path/to/datasources.json>:/home/agent/datasources.json \
--volume </path/to/root.crt>:/home/agent/.postgresql/root.crt \
-m 6g \
snowflakedb/database-connector-agent:latest
snowflake.json
과 datasources.json
을 통해 전달되는 구성 옵션은 환경 변수를 통해 제공될 수 있습니다.
중요
환경 변수는 JSON 파일을 통해 제공된 설정보다 우선합니다.
환경 변수 이름은 두 JSON 파일의 경로와 동일한 구조를 따릅니다. 중첩된 키는 밑줄 _
로 구분해야 하고, 모든 변수에는 SNOWFLAKE_
를 접두사로 붙이고 배열 항목에는 정수 인덱스를 접두사로 붙여야 합니다.
예를 들어 다음 스크립트는
docker run \
-e SNOWFLAKE_USERNAME="POSTGRESQL_AGENT_USER" \
-e SNOWFLAKE_APPLICATION_NAME="SNOWFLAKE_CONNECTOR_FOR_POSTGRESQL" \
-e SNOWFLAKE_ALLOWLIST_0_HOST="example_account.us-west-2.aws.snowflakecomputing.com" \
-e SNOWFLAKE_ALLOWLIST_0_PORT=443 \
-e SNOWFLAKE_ALLOWLIST_0_TYPE="SNOWFLAKE_DEPLOYMENT" \
...
다음과 동등합니다.
{
"userName": "POSTGRESQL_AGENT_USER",
"applicationName": "SNOWFLAKE_CONNECTOR_FOR_POSTGRESQL",
"allowlist": [
{
"host": "example_account.us-west-2.aws.snowflakecomputing.com",
"port": 443,
"type": "SNOWFLAKE_DEPLOYMENT"
}
]
}
allowList
또는 allowlistPrivatelink
배열의 모든 항목을 복사할 필요는 없습니다. 대신, SNOWFLAKE_DEPLOYMENT
의 type
을 가진 allowList
항목을 찾고 이 URL을 사용하여 다음과 같이 변수 SNOWFLAKE_ENFORCEDURL
을 설정합니다.
docker run \
-e SNOWFLAKE_USERNAME="POSTGRESQL_AGENT_USER" \
-e SNOWFLAKE_APPLICATION_NAME="SNOWFLAKE_CONNECTOR_FOR_POSTGRESQL" \
-e SNOWFLAKE_ENFORCEDURL="example_account.us-west-2.aws.snowflakecomputing.com:443" \
...
데이터 원본은 유사한 구조를 따르며 SNOWFLAKE_DATASOURCES_
가 접두사로 붙습니다.
예:
docker run \
-e SNOWFLAKE_DATASOURCES_POSTGRESQLDS1_URL="jdbc:postgresql://example.internal:5432/", \
-e SNOWFLAKE_DATASOURCES_POSTGRESQLDS1_USERNAME="example_user" \
-e SNOWFLAKE_DATASOURCES_POSTGRESQLDS1_PASSWORD="example_password" \
-e SNOWFLAKE_DATASOURCES_POSTGRESQLDS1_PUBLICATION="example_publication" \
-e SNOWFLAKE_DATASOURCES_POSTGRESQLDS1_SSL="false" \
...
다음과 동등합니다.
{
"POSTGRESQLDS1": {
"url": "jdbc:postgresql://example.internal:5432/",
"username": "example_user",
"password": "example_password",
"publication": "example_publication",
"ssl": false
}
}
선택적 구성 환경 변수 검토하기¶
에이전트는 컨테이너에 추가 환경 변수를 설정하여 사용할 수 있는 다음과 같은 선택적 설정을 지원합니다.
SNOWFLAKE_PRIVATEKEYPATH
에이전트 사용자의 개인 키가 있는 파일의 절대 경로를 지정합니다. 이는 보통 오케스트레이션 시스템의 시크릿을 통해 컨테이너에 자신의 개인 키를 탑재할 때 사용됩니다.
SNOWFLAKE_PRIVATEKEYPASSWORD
에이전트 사용자의 개인 키에 대한 비밀번호를 지정합니다. 에이전트가 키를 생성하도록 하는 경우 이 비밀번호는 개인 키에 설정됩니다. 기존 키를 재사용하는 경우 이 비밀번호는 기존 개인 키에 액세스하는 데 사용됩니다.
SNOWFLAKE_PRIVATEKEY
에이전트 사용자의 개인 키 내용을 지정합니다. 개인 키를 컨테이너에 파일로 탑재할 수 없는 경우 설정할 수 있습니다.
SNOWFLAKE_ENFORCEDURL
Snowflake에 연결할 URL을 지정하여 에이전트의 자체 검색 메커니즘을 재정의합니다. 이는 주로 PrivateLink 배포에 연결하는 데 사용됩니다.
JAVA_OPTS
에이전트 프로세스에 전달할 추가적인 Java 설정이나 속성을 지정합니다.
가장 일반적으로 사용되는 것은 다음과 같습니다.
최대 Java 힙 크기를 설정하는
-Xmx
옵션입니다. Snowflake에서는 이 값을 컨테이너에서 사용 가능한 메모리 양에서 1GB를 뺀 값으로 설정할 것을 권장합니다.예를 들어, 컨테이너에 6GB의 RAM을 사용할 수 있는 경우 다음을 설정합니다.
JAVA_OPTS=-Xmx5g
에이전트에서 Snowflake로의 연결에 프록시가 필요한 경우 다음을 설정합니다.
JAVA_OPTS=-Dhttp.useProxy=true -Dhttp.proxyHost=<proxy-host> -Dhttp.proxyPort=<proxy-port>
예를 들어 원본 데이터베이스와 같이 일부 호스트나 IP 주소에 대한 프록시를 우회하려면 추가적인
http.nonProxyHosts
속성을 설정합니다. 여러 개의 호스트 이름은 파이프 기호(|
)를 사용하여 구분합니다. 별표(*
)를 와일드카드 문자로 사용합니다.JAVA_OPTS=-Dhttp.useProxy=true -Dhttp.proxyHost=<proxy-host> -Dhttp.proxyPort=<proxy-port> -Dhttp.nonProxyHosts='*.my_company.com|localhost|myorganization-myaccount.snowflakecomputing.com|192.168.91.*'
프록시에 대한 자격 증명을 전달하려면
http.proxyUser
및http.proxyPassword
시스템 속성을 설정합니다.JAVA_OPTS=-Dhttp.useProxy=true -Dhttp.proxyHost=<proxy-host> -Dhttp.proxyPort=<proxy-port> -Dhttp.proxyUser=<proxy-user> -Dhttp.proxyPassword=<proxy-pass>
PrivateLink 연결 설정하기¶
PrivateLink 배포에 연결하는 경우 SNOWFLAKE_ENFORCEDURL
환경 변수를 설정하여 에이전트가 연결할 URL을 명시적으로 제공해야 합니다.
다음 중 하나를 수행하면 계정의 PrivateLink URL을 확인할 수 있습니다.
구성 과정에서 얻은
snowflake.json
파일을 엽니다.allowlistPrivatelink
라는 배열을 찾은 다음,SNOWFLAKE_DEPLOYMENT
의type
이 있는 항목을 찾습니다.SYSTEM$GET_PRIVATELINK_CONFIG 함수를 사용합니다.
Snowflake 액세스 키 이해하기¶
에이전트는 Snowsight에서 커넥터 설정 마법사를 통해 생성된 서비스 계정과 액세스 키 세트를 사용하여 Snowflake에 인증합니다. 설치 마법사는 임시 액세스 키를 생성하고 temporaryPrivateKey
라는 필드에서 개인 키를 snowflake.json
파일에 추가합니다.
에이전트는 초기 시작 중에 다음 방법으로 임시 키를 교체합니다.
새로운 액세스 키 세트를 생성하여 컨테이너 내부의
/home/agent/.ssh
아래에database-connector-agent-app-private-key.p8
과database-connector-agent-app-public-key.pub
로 저장합니다. 이 디렉터리는 외부에서 컨테이너에 데이터를 쓸 수 있는 볼륨으로 탑재해야 하므로, 컨테이너가 종료되어도 키가 유지됩니다.새로운 키를 사용하도록 서비스 계정을 변경합니다.
snowflake.json
파일에서temporaryPrivateKey
필드를 제거합니다.
최초 키 교체 후, 에이전트는 액세스 키를 교체하지 않습니다.
에이전트가 생성한 키를 사용할 수 있습니다. 또는 자체 세트를 만들고 서비스 계정을 변경한 후 에이전트에 개인 키를 제공할 수도 있습니다.
에이전트의 개인 키 검색 순서는 다음과 같습니다.
SNOWFLAKE_PRIVATEKEY
환경 변수를 사용하여 전달된 모든 키. 커넥터가 이 값을 찾으면snowflake.json
의 임시 키를 무시합니다./home/agent/.ssh/database-connector-agent-app-private-key.p8
에 탑재된 볼륨에서 찾은 키. 커넥터가 이 파일을 찾으면snowflake.json
의 임시 키를 무시합니다.snowflake.json
파일의temporaryPrivateKey
필드 값.
Kubernetes를 사용하여 오케스트레이션 구성하기¶
참고
이 섹션에서는 Kubernetes에 집중하지만, 어떤 컨테이너 오케스트레이션 시스템에서든 커넥터를 실행할 수 있습니다. 구성 구문은 비슷한 경우가 많습니다. 자세한 내용은 시스템 설명서를 참조하십시오.
Kubernetes를 사용하는 경우 쓰기 가능한 볼륨은 일반적으로 탑재할 수 없습니다. 결과적으로, 에이전트는 Snowflake 사용자 계정의 키를 자동으로 교체할 수 없습니다. 수동으로 키 세트를 생성하고 사용자를 변경한 다음 에이전트를 실행하는 컨테이너에 개인 키(일반적으로 탑재된 시크릿)를 제공해야 합니다. Snowflake 사용자를 위한 키-페어 설정에 대한 자세한 내용은 키 페어 인증 구성하기 를 참조하십시오.
HashiCorp Vault와 같은 안전한 저장소에 시크릿을 저장하는 것이 좋습니다. 이러한 저장소에는 보통 Kubernetes와의 기존 통합이 있는데, 예를 들어 Vault는 전문화된 연산자를 제공합니다. 통합 세부 정보는 컨테이너 오케스트레이션 시스템과 안전한 저장소에 따라 달라집니다. 자세한 내용은 해당 설명서를 참조하십시오.
Kubernetes는 보통 다중 노드 클러스터에서 실행되므로 호스트 컴퓨터에서 파일을 탑재할 방법이 없습니다. 에이전트의 컨테이너에 구성 JSON 파일을 제공하려면 세 파일을 모두 저장하는 Kubernetes ConfigMap 을 만들 수 있습니다.
다음은 Kubernetes에서 에이전트를 구성하는 기본적인 예를 보여줍니다.
snowflake.json
과 선택적으로 SSL 루트 인증서도 저장할 ConfigMap을 생성합니다.kubectl create configmap database-connector-config \ --from-file=snowflake.json=</path/to/snowflake.json> \ --from-file=root.crt=</path/to/root.crt>
에이전트 사용자의 개인 키와
datasources.json
의 내용을 저장할 시크릿을 생성합니다.kubectl create secret generic database-connector-secrets \ --from-file=private-key=</path/to/private/key/file> \ --from-file=datasources.json=</path/to/datasources.json>
구성 파일과 개인 키를 볼륨으로 탑재하여 에이전트의 Pod를 구성합니다.
apiVersion: v1 kind: Pod metadata: name: database-connector-agent spec: restartPolicy: Always containers: - name: database-connector-agent image: snowflakedb/database-connector-agent:latest resources: requests: memory: "6Gi" limits: memory: "8Gi" volumeMounts: - name: config mountPath: /home/agent/snowflake.json subPath: snowflake.json - name: config mountPath: /home/agent/.postgresql/root.crt subPath: root.crt - name: secrets mountPath: /home/agent/datasources.json subPath: datasources.json - name: secrets mountPath: /etc/private-key/private-key subPath: private-key env: - name: SNOWFLAKE_PRIVATEKEYPATH value: /etc/private-key/private-key volumes: - name: config configMap: name: database-connector-config - name: secrets secret: secretName: database-connector-secrets
예를 들어 Pod의 구성을 YAML 파일(예:
database-connector.yaml
)로 저장하고 시작합니다.kubectl apply -f database-connector.yaml
에이전트 모니터링하기¶
에이전트의 컨테이너는 Docker를 사용하여 액세스할 수 있는 stdout
에 로그를 출력합니다. 예를 들어, 컨테이너 이름이 database-connector-agent
인 경우 로그를 보는 명령은 다음과 같습니다.
docker container logs database-connector-agent
이러한 로그는 Snowflake로도 스트리밍됩니다. 이러한 로그에 액세스하는 방법에 대한 자세한 내용은 Snowflake Connector for PostgreSQL 모니터링하기 섹션을 참조하십시오.
상태 점검 엔드포인트에 액세스하기¶
에이전트는 상태 정보가 포함된 HTTP 엔드포인트를 노출합니다. 오케스트레이션 시스템에서 에이전트를 실행할 때 이 엔드포인트를 사용하면 에이전트가 완전히 시작되었는지, 정상적인 상태인지 확인할 수 있습니다. 엔드포인트는 포트 8080
및 경로 /actuator/health
에서 제공됩니다.
Kubernetes에서 엔드포인트를 활성 프로브로 사용하려면 Pod 구성에 다음을 추가합니다.
apiVersion: v1
kind: Pod
spec:
containers:
- ...
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
다음 단계¶
이러한 절차를 완료한 후 Snowflake Connector for PostgreSQL 에 대한 복제 구성하기 의 단계를 따르십시오.