AWS PrivateLink와 Snowflake

AWS PrivateLink와 Snowflake

Business Critical 기능

이 기능은 Business Critical(이상)이 필요해요.

이 주제는 Snowflake 계정을 하나 이상의 AWS VPC(Virtual Private Cloud)에 직접 연결하기 위해 AWS PrivateLink를 구성하는 방법을 설명해요.

출처: Snowflake 문서

본문

AWS PrivateLink는 공용 인터넷을 경유하지 않고 AWS VPC와 Snowflake VPC 사이의 직접적이고 안전한 연결을 허용하는 개인 VPC 엔드포인트를 생성하기 위한 AWS 서비스예요. PrivateLink는 네트워크에서 Snowflake로의 인바운드 연결을 통제해요. Snowflake에서 개인 데이터 소스에 도달하려면(아웃바운드) 데이터 연결 프록시를 참고해요. AWS PrivateLink 연결은 같은 리전 또는 다른 AWS 리전에 있는 VPC 엔드포인트 서비스와 AWS VPC를 지원해요. AWS PrivateLink의 교차 리전 연결을 사용하면 AWS VPC 리전과 다른 리전의 Snowflake 계정을 커스텀 엔드포인트 서비스로 연결할 수 있어요. Amazon Simple Storage Service(Amazon S3)나 키 관리 서비스(KMS) 같은 PaaS(platform as a service) 서비스에는 교차 리전 연결이 현재 지원되지 않아요.

자세한 내용은 AWS 블로그 페이지 Introducing Cross-Region Connectivity for AWS PrivateLink를 참고해요. 계정의 리전 이름을 찾는 방법은 계정을 호스팅하는 리전의 클라우드 제공자 이름 찾기를 참고해요.

외부 함수를 작성할 때 개인 엔드포인트와 함께 AWS PrivateLink를 사용할 수도 있어요.

비호스팅 데이터 센터 같은 온프레미스 환경이 있다면 AWS Direct Connect를 AWS PrivateLink와 함께 사용해 모든 가상·물리 환경을 단일 개인 네트워크로 연결할 수 있어요.

참고(Note): AWS Direct Connect는 AWS PrivateLink와 독립적으로 구현해야 하는 별도의 AWS 서비스이며, 이 주제의 범위 밖이에요. AWS Direct Connect 구현 문의는 Amazon에 연락해 주세요.

참고(Note): 이 섹션의 셀프 서비스 활성화 프로세스는 현재 관리형 클라우드 서비스 또는 서드파티 공급업체의 AWS 계정 식별자 인증을 지원하지 않아요. 이 사용 사례에 AWS 계정 식별자를 인증하려면 공급업체에서 AWS 계정 식별자를 받아 Snowflake Support에 연락해 주세요.

Snowflake 계정에 AWS PrivateLink를 활성화하려면 다음 단계를 완료해요.

  • 연합 토큰(federated token)을 생성한 후 출력을 저장해요.
    • 토큰을 생성하려면 명령줄에서 AWS CLI STS 명령을 실행해요. get-federation-token은 AWS의 IAM(identity and access management) 사용자 또는 AWS 계정 루트 사용자가 필요해요. 자세한 내용은 AWS 문서를 참고해요.

중요(Important): 연합 토큰은 12시간 후 만료돼요. Snowflake 계정이 AWS PrivateLink를 사용하도록 승인·검증·비활성화하는 시스템 함수를 호출할 때 토큰이 만료되었으면 AWS CLI STS 명령을 다시 실행해 토큰을 재생성해요.

aws sts get-federation-token --name sam

이후 단계에서 이 명령의 출력을 SYSTEM$AUTHORIZE_PRIVATELINK 함수의 *federated_token* 인자로 제공해요.

  • 생성한 토큰에서 "FederatedUserId" 필드의 값을 추출해요. 예를 들어 토큰에 다음 값이 포함되어 있으면:
{
 ...
   "FederatedUser": {
     "FederatedUserId": "185...:sam",
     "Arn": "arn:aws:sts::185...:federated-user/sam"
   },
 "PackedPolicySize": 0
}

185...을 추출해요. 다음 단계에서 이 12자리 숫자를 SYSTEM$AUTHORIZE_PRIVATELINK 함수의 *aws_id* 인자로 제공해요.

  • ACCOUNTADMIN Snowflake 시스템 역할을 사용해 SYSTEM$AUTHORIZE_PRIVATELINK 함수를 호출해 Snowflake 계정에 AWS PrivateLink를 승인(활성화)해요.
SELECT SYSTEM$AUTHORIZE_PRIVATELINK ( '<aws_id>' , '<federated_token>' );

여기서:

  • '*aws_id*' — Amazon Web Services(AWS) 계정을 고유하게 식별하는 12자리 식별자를 문자열로.
  • '*federated_token*' — 연합 사용자에 대한 접근 자격 증명을 포함하는 연합 토큰 값을 문자열로.

예를 들어:

USE ROLE ACCOUNTADMIN;

SELECT SYSTEM$AUTHORIZE_PRIVATELINK (
  '185...',
 '{
   "Credentials": {
     "AccessKeyId": "ASI...",
     "SecretAccessKey": "enw...",
     "SessionToken": "Fwo...",
     "Expiration": "2021-01-07T19:06:23+00:00"
   },
   "FederatedUser": {
     "FederatedUserId": "185...:sam",
     "Arn": "arn:aws:sts::185...:federated-user/sam"
   },
   "PackedPolicySize": 0
  }'
  );

구성을 검증하려면 AWS의 Snowflake 계정에서 SYSTEM$GET_PRIVATELINK 함수를 호출해요. 이 함수는 Snowflake 계정을 승인하는 데 사용된 것과 같은 '*aws_id*' 및 '*federated_token*' 인자 값을 사용해요.

SYSTEM$GET_PRIVATELINK은 성공적인 승인의 경우 Account is authorized for PrivateLink.를 반환해요.

  • 선택 사항: Snowflake 계정에서 AWS PrivateLink를 비활성화해야 한다면 '*aws_id*' 및 '*federated_token*'에 대해 같은 인자 값을 사용해 SYSTEM$REVOKE_PRIVATELINK 함수를 호출해요.

보안 태세를 더욱 강화하기 위해 Snowflake는 Snowflake 계정의 개인 엔드포인트 고정(pinning)을 권장해요. 자세한 내용은 인바운드 트래픽용 개인 연결 엔드포인트 고정을 참고해요.

AWS VPC 환경 구성

주의(Attention): 이 섹션은 VPC 환경 구성에 대한 Snowflake 관련 세부사항만 다뤄요. Snowflake는 필요한 AWS VPC 엔드포인트, 보안 그룹 규칙, DNS(Domain Name System) 레코드의 실제 구성에 책임이 없어요. 이러한 구성 작업에서 문제가 발생하면 AWS Support에 문의해 주세요.

AWS VPC 엔드포인트 생성·구성

AWS VPC 환경에서 VPC 엔드포인트를 만들고 구성하려면 다음 단계를 완료해요.

  • Snowflake 계정에서 ACCOUNTADMIN 시스템 역할을 사용해 SYSTEM$GET_PRIVATELINK_CONFIG 함수를 호출한 다음 privatelink-vpce-id 값을 기록해요.
  • AWS 환경에서 이전 단계의 privatelink-vpce-id 값을 사용해 VPC 엔드포인트를 만들어요.

참고(Note): VPC 엔드포인트의 Snowflake 리전이 AWS VPC의 리전과 다르면 교차 리전 연결을 활성화하는 두 가지 선택을 해야 해요. AWS VPC 콘솔에서 Enable Cross Region endpoint를 선택한 다음 Service Settings » Service Region에서 서비스의 기본 리전을 선택해요.

전체 지침은 AWS 문서의 교차 리전 연결 구성을 위한 단계별 설정 절차를 참고해요.

계정의 리전 이름을 찾는 방법에 대한 지침은 계정을 호스팅하는 리전의 클라우드 제공자 이름 찾기를 참고해요.

  • AWS 환경에서 Snowflake 나가는 연결을 VPCE CIDR(Classless Inter-Domain Routing)의 포트 443과 80에 연결하는 서비스 보안 그룹을 승인해요.

자세한 내용은 AWS 문서의 다음 주제를 참고해요.

계정을 호스팅하는 리전의 클라우드 제공자 이름 찾기

Snowflake와 Snowflake 계정을 호스팅하는 클라우드 제공자는 Snowflake 서비스를 호스팅하는 리전에 대해 비슷하지만 다른 이름을 사용해요. 리전 간 연결을 설정하기 위해 사용하는 리전 이름을 찾으려면 시스템 함수를 사용할 수 있어요. Snowflake 계정을 호스팅하는 리전의 클라우드 제공자 이름을 확인하려면 다음 단계를 수행해요.

  • CURRENT_REGION 및 SHOW REGIONS 명령을 실행해요.
  • SHOW REGIONS가 반환한 출력에서 SELECT CURRENT_REGION()이 반환한 출력과 일치하는 값을 snowflake_region 열에 보여주는 행을 찾아요.
  • 이 행의 region 열의 값이 Snowflake 계정을 호스팅하는 리전의 클라우드 제공자 이름이에요.

다음 예시에서 us-west-2는 AWS_US_WEST라는 Snowflake 계정을 호스팅하는 리전의 클라우드 제공자 이름이에요.

SELECT CURRENT_REGION();

출력:

+------------------+
| CURRENT_REGION() |
|------------------|
| AWS_US_WEST_2    |
+------------------+
SHOW REGIONS;

출력:

+------------------+-------+-----------+-----------------+
| snowflake_region | cloud | region    | display_name    |
|------------------|-------|-----------|-----------------|
| AWS_US_WEST_2    | aws   | us-west-2 | US West (Oregon)|
+------------------+-------+-----------+-----------------+

VPC 네트워크 구성

AWS PrivateLink 엔드포인트로 Snowflake에 접근하려면 DNS에 CNAME(Canonical Name) 레코드를 만들어 SYSTEM$GET_PRIVATELINK_CONFIG 함수의 적절한 엔드포인트 값을 VPC 엔드포인트의 DNS 이름으로 확인해야 해요.

SYSTEM$GET_PRIVATELINK_CONFIG의 출력에서 얻을 값은 개인 연결로 접근하는 Snowflake 기능에 따라 달라져요. 가능한 값에 대한 설명은 반환 값을 참고해요.

regionless-snowsight-privatelink-url과 snowsight-privatelink-url 값은 개인 연결로 Snowsight와 Snowflake Marketplace에 접근을 허용한다는 점을 주목해요. 하지만 URL 리디렉션을 활성화하려면 추가 구성이 있어요. 자세한 내용은 Snowsight & 개인 연결을 참고해요.

DNS 구성에 대한 추가 도움이 필요하면 내부 AWS 관리자에게 문의해 주세요.

중요(Important): OCSP(Online Certificate Status Protocol) 캐시 서버 호스트 이름의 구조는 Snowflake 클라이언트 구성에서 설명하는 것처럼 설치된 클라이언트 버전에 따라 달라져요.

  • 나열된 버전 이상을 사용하면 Snowflake 클라이언트 구성에 표시된 형식을 사용해요. 이는 같은 리전에 여러 Snowflake 계정(예: dev, test, production)이 있을 때 더 나은 DNS 해석을 가능하게 해요. 클라이언트 드라이버를 업데이트하고 PrivateLink로 OCSP를 사용할 때는 OCSP 호스트 이름을 허용하도록 방화벽 규칙을 업데이트해요.
  • 이전 클라이언트 버전을 사용하면 OCSP 캐시 서버 호스트 이름은 계정 식별자 없이 ocsp.*region_id*.privatelink.snowflakecomputing.com 형식을 취해요.
  • DNS 레코드는 VPC 내의 개인 IP 주소로 확인되어야 해요. 공용 IP 주소로 확인되면 레코드가 올바르게 구성되지 않은 것이에요.

Amazon S3용 AWS VPC 인터페이스 엔드포인트 생성

이 단계는 Snowflake 클라이언트의 Amazon S3 트래픽이 AWS 백본에 머물러야 하므로 필요해요. Snowflake 클라이언트(Snowflake CLI, SnowSQL, JDBC 드라이버 등)는 다양한 런타임 작업을 수행하기 위해 Amazon S3에 접근해야 해요.

AWS VPC 네트워크가 공용 인터넷 접근을 허용하지 않는다면, 내부 스테이지에 대한 개인 연결 또는 Snowflake 클라이언트가 필요로 하는 Amazon S3 호스트 이름에 대한 추가 게이트웨이 엔드포인트를 구성할 수 있어요.

Amazon S3에 대한 접근을 구성하는 옵션은 세 가지가 있어요. 처음 두 옵션은 공용 인터넷을 회피하고 세 번째 옵션은 공용 인터넷을 사용해요.

  • Apache Iceberg 테이블을 Snowflake 관리 스토리지와 함께 사용한다면 내부 스테이지 또는 Snowflake 관리 스토리지 볼륨에 대한 AWS VPC 인터페이스 엔드포인트를 구성해요. 이 옵션을 권장해요.
  • Amazon S3 게이트웨이 엔드포인트를 구성해요. 자세한 내용은 아래의 Attention 섹션을 참고해요.
  • 인터페이스 엔드포인트나 게이트웨이 엔드포인트를 구성하지 않아요. 이 경우 공용 인터넷을 사용하는 접근이 발생해요.

주의(Attention): Amazon S3 버킷과 Snowflake가 있는 AWS VPC 사이의 통신이 공용 인터넷을 사용하지 않도록 하려면 Amazon S3 버킷과 같은 AWS 리전에 Amazon S3 게이트웨이 엔드포인트를 설정할 수 있어요. AWS PrivateLink는 VPC 간 통신만 허용하고 Amazon S3 버킷은 VPC에 포함되지 않기 때문에 이렇게 하면 공용 인터넷 통신이 방지돼요.

Amazon S3 게이트웨이 엔드포인트는 특정 사용자, Amazon S3 리소스, 라우트, 서브넷으로 접근을 제한하도록 구성할 수 있지만, Snowflake가 이 구성을 요구하지는 않아요. 자세한 내용은 Amazon S3용 게이트웨이 엔드포인트를 참고해요.

Amazon S3 게이트웨이를 Snowflake용 Amazon S3 리소스만 사용하도록 제한하려면 다음 옵션 중 하나를 선택해요.

  • AWS 엔드포인트 정책에서 Snowflake 계정이 사용하는 특정 Amazon S3 호스트 이름 주소를 사용해요. 계정이 사용하는 호스트 이름의 전체 목록은 SYSTEM$ALLOWLIST를 참고해요.
  • AWS 엔드포인트 정책에서 Snowflake S3 호스트 이름과 일치하는 Amazon S3 호스트 이름 패턴을 사용해요. 이 옵션에서는 VPC-to-VPC 또는 On-Premises-to-VPC 두 가지 유형의 Snowflake 연결이 가능해요.

연결 유형에 따라 다음 지침을 완료해요.

VPC-to-VPC: Amazon S3 게이트웨이 엔드포인트가 존재하는지 확인해요. 선택적으로 Amazon S3 게이트웨이 엔드포인트 정책을 다음 Amazon S3 Hostnames 표에 표시된 특정 호스트 이름 패턴과 일치하도록 수정해요.

On-Premises-to-VPC: Amazon S3 트래픽이 공용 게이트웨이에서 허용되지 않는 경우, 방화벽 또는 프록시 구성에 Amazon S3 호스트 이름 패턴을 포함하도록 설정을 정의해요.

게이트웨이 엔드포인트가 계정의 Snowflake 관리 S3 버킷과 명시적으로 일치할 것을 요구하지 않는다면 다음 표에 표시된 Amazon S3 호스트 이름 패턴을 사용해 게이트웨이 엔드포인트를 만들 수 있어요.

Amazon S3 Hostnames 비고
모든 리전
sfc-*-stage.s3.amazonaws.com:443 없음
US East 외부의 모든 리전
sfc-*-stage.s3-<region_id>.amazonaws.com:443 패턴은 리전 ID 앞에 하이픈(-)을 사용해요.
sfc-*-stage.s3.<region_id>.amazonaws.com:443 패턴은 리전 ID 앞에 마침표(.)를 사용해요.

게이트웨이 엔드포인트 생성에 대한 정보는 게이트웨이 VPC 엔드포인트를 참고해요.

Snowflake에 연결

Snowflake에 연결하기 전에 선택적으로 Snowflake Connectivity Diagnostic tool(SnowCD)을 사용해 Snowflake와 AWS PrivateLink와의 네트워크 연결을 평가할 수 있어요.

자세한 내용은 SnowCD와 SYSTEM$ALLOWLIST_PRIVATELINK을 참고해요.

그렇지 않으면 개인 연결 계정 URL로 Snowflake에 연결해요.

AWS PrivateLink로 Snowsight에 연결하려면 Snowsight 문서의 지침을 따르세요.

공용 접근 차단 — 권장

AWS PrivateLink로 Snowflake에 대한 개인 연결을 테스트한 후 선택적으로 Snowflake에 대한 공용 접근을 차단할 수 있어요. 이는 사용자 접근 요청이 Snowflake 네트워크 정책에 지정된 특정 CIDR 블록 범위 내의 IP 주소에서 시작할 때만 사용자가 Snowflake에 접근할 수 있다는 뜻이에요.

네트워크 정책으로 공용 접근을 차단하려면:

  • 새 네트워크 정책을 만들거나 기존 네트워크 정책을 편집해요.
  • 조직의 CIDR 블록 범위를 추가해요.
  • 조직이 IPv6를 사용하면 TYPE = IPV6인 추가 네트워크 규칙을 만들어 네트워크 정책에 추가해요. 자세한 내용은 네트워크 규칙을 참고해요.
  • 계정에 네트워크 정책을 활성화해요.

자세한 내용은 네트워크 정책으로 네트워크 트래픽 제어를 참고해요.

Snowflake 클라이언트 구성

다음 섹션은 특정 사용 사례에 맞게 Snowflake 클라이언트를 구성하는 방법을 설명해요.

Snowflake 클라이언트가 OCSP 캐시 서버를 지원하는지 확인

Snowflake OCSP 캐시 서버는 Snowflake 클라이언트와 서버 사이의 연결 문제를 완화해요. 설치된 Snowflake 클라이언트가 OCSP 서버 캐시를 사용하도록 하려면 다음 클라이언트 버전을 사용해야 해요.

  • Snowflake CLI 3.0.0(이상)
  • SnowSQL 1.1.57(이상)
  • Python Connector 1.8.2(이상)
  • JDBC Driver 3.8.3(이상)
  • ODBC Driver 2.19.3(이상)

참고(Note): Snowflake OCSP 캐시 서버는 포트 80에서 수신합니다. 그래서 AWS VPC 엔드포인트 생성·구성에서 AWS PrivateLink VPCE 보안 그룹이 다른 모든 Snowflake 트래픽에 필요한 포트 80과 443을 둘 다 수락하도록 구성하라고 지시했어요.

Snowflake 클라이언트의 호스트 이름 지정

각 Snowflake 클라이언트는 Snowflake 계정에 연결하기 위해 호스트 이름이 필요해요.

호스트 이름은 VPC 네트워크 구성에서 CNAME 레코드에 지정한 호스트 이름과 같아요.

이 단계는 Snowflake Marketplace 접근에는 적용되지 않아요.

예를 들어 xy12345라는 계정의 경우:

  • 계정이 미국 서부에 있으면 호스트 이름은 xy12345.us-west-2.privatelink.snowflakecomputing.com이에요.
  • 계정이 EU(프랑크푸르트)에 있으면 호스트 이름은 xy12345.eu-central-1.privatelink.snowflakecomputing.com이에요.

중요(Important): 호스트 이름을 지정하는 방법은 클라이언트에 따라 달라져요.

  • Spark 커넥터와 ODBC·JDBC 드라이버의 경우 전체 호스트 이름을 지정해요.
  • 다른 모든 클라이언트의 경우 전체 호스트 이름을 지정하지 않고, privatelink 세그먼트가 있는 계정 식별자(즉 <account_identifier>.privatelink)를 지정해요. Snowflake는 이 이름을 snowflakecomputing.com과 연결해 호스트 이름을 동적으로 구성해요.

Snowflake 클라이언트의 계정 이름 또는 호스트 이름 지정에 대한 자세한 내용은 각 클라이언트의 문서를 참고해요.

AWS PrivateLink와 함께 SSO 사용

Snowflake는 AWS PrivateLink와 함께 SSO 사용을 지원해요. 자세한 내용은 다음을 참고해요.

AWS PrivateLink와 함께 Client Redirect 사용

Snowflake는 AWS PrivateLink와 함께 Client Redirect 사용을 지원해요.

자세한 내용은 클라이언트 연결 리디렉션을 참고해요.

개인 연결을 사용한 복제와 Tri-Secret Secure

Snowflake는 대상 계정에서 Tri-Secret Secure 또는 이 기능을 활성화했는지 여부와 관계없이 소스 계정에서 대상 계정으로 데이터를 복제하는 것을 지원해요.

문제 해결

PrivateLink에서 접할 수 있는 문제를 해결하려면 다음 Snowflake 커뮤니티 문서를 참고해요.

더 알아보기 (Learn more)