Snowflake

[1] AWS PrivateLink를 이용한 Secure한 Snowflake 액세스

heed159 2024. 10. 15. 16:09

AWS PrivateLink란?

AWS PrivateLink는 Public(공용) 인터넷망을 타지 않고 AWS VPC와 Snowflake VPC 사이에서 직접 보안 연결을 할 수 있도록 비공개 VPC 엔드포인트를 생성하는 AWS 서비스이다. 따라서 AWS PrivateLink를 이용하면 같은 리전 안에서 AWS VPC와 Snowflake VPC 간에 Public(공용) 인터넷망을 타지 않도록 네트워크를 구성할 수 있다. VPN 환경에서 Snowflake에 접속하려면 AWS PrivateLink 설정이 필수적이다. 이번 글에서는 Snowflake에 필요한 AWS PrivateLink 설정 방법을 알아보자. 최종 목표 아키텍처는 아래와 같다.

 

Snowflake 계정의 AWS PrivateLink 활성화 (Business Critical Edition)

1. AWS CLI STS 명령 실행

aws sts get-federation-token --name sam

 

아래와 같은 내용이 출력되며 이는 다음 단계의 <federated_token> 인자 값으로 사용된다.

{
    "Credentials": {
        "AccessKeyId": "ASI.....WLQN",
        "SecretAccessKey": "FZYdtCqgz+C........HuBhB6bY1/6pZaWN",
        "SessionToken": "IQoJb3JpZ2luX2VjEIr//////////wEa....Dh3nqCk/KSIESAaL9i5wi1Z5m08cxwo1X1Aeg==",
        "Expiration": "2024-10-15T13:52:51+00:00"
    },
    "FederatedUser": {
        "FederatedUserId": "99...00329:sam",
        "Arn": "arn:aws:sts::99..00329:federated-user/sam"
    },
    "PackedPolicySize": 0
}

 

2. Snowflake 계정에 대해 AWS PrivateLink 활성화

ACCOUNTADMIN 역할로 전환하여 아래 명령어를 실행한다. SYSTEM$AUTHORIZE_PRIVATELINK 함수를 호출하여 Snowflake 계정에 대해 AWS PrivateLink를 인증한다. 여기서 <aws_id>는 1번 실행 결과의 99로 시작하는 12자리 숫자가 되며 <federated_token>은 1번 실행 결과 전체가 된다.

USE ROLE ACCOUNTADMIN;
SELECT SYSTEM$AUTHORIZE_PRIVATELINK('<aws_id>', '<federated_token>');

 

아래와 같이 실행한다.

SELECT SYSTEM$AUTHORIZE_PRIVATELINK('99...00329','{
    "Credentials": {
        "AccessKeyId": "ASIA6OD...X7DP6T",
        "SecretAccessKey": "w7n+jsjW7Sv...SphkRSNLTyD",
        "SessionToken": "IQoJb3JpZ2luX2VjEFQaDmFwLW5v...d//////////8BEAAaDDk5MjM4MjgwMDMyOSIMxoTrl...rGxDk32sQvnpbD6FlzT...W3MNXIkFVWrYit3EUiSPssf4p/+fjg0pA41oQAqZ3+IbKG+AzVb+CABtpaE/td+b9oeFye8HqNe5wu3/w0UuJ1qHzRTswySHbCxf3BT7utcDmuLOcPkDhmNOmPt8PGoYTyKVvKMUq6hBu0W+gkwsKJahcsNhpGwB1hIII/EMCeiR0D2wKOBrlvxOzvvwM/if9S5uMb0lxDtRdak3bTl5XOM8fD9MXKZN9N1Cl2zD6k/O3Bjq...x2FrrEOWsa/sBS6jNZFW3...vNIBJ309QSbSH9hcsG/dJgXl86a1MN4w+lJd8+k732j84IXDtuhzhyC/DreMFoRo/prfwZI18J/bBltXRTrg0QkLilytA==",
        "Expiration": "2024-10-02T16:20:10+00:00"
    },
    "FederatedUser": {
        "FederatedUserId": "99...00329:sam",
        "Arn": "arn:aws:sts::99...00329:federated-user/sam"
    },
    "PackedPolicySize": 0
}');

 

이후 아래 명령어를 실행하여 PrivateLink 사용을 활성화한다.

ALTER ACCOUNT SET ENABLE_INTERNAL_STAGES_PRIVATELINK = TRUE;

 

마지막으로 아래 명령어를 실행하고 출력 결과를 기록한다. 이는 이후 AWS VPC 엔드포인트를 생성 및 DNS 설정에 사용하게 된다.

SELECT KEY, VALUE FROM TABLE(FLATTEN(INPUT=>PARSE_JSON(SYSTEM$GET_PRIVATELINK_CONFIG())));

이로써 AWS PrivateLink를 사용하기 위한 Snowflake 상에서의 모든 설정이 끝났다. 나머지 작업은 대부분 AWS 작업이니 잘 따라오기 바란다.


AWS VPC 환경 구성하기

VPC 엔드포인트를 생성하기에 앞서 VPC 생성, 서브넷 생성, 라우팅 테이블, 네트워크 구성 등의 사전 작업은 본 글에서는 생략하도록 한다.

1. VPC 엔드포인트(VPCE) 생성 및 구성하기

VPC 엔드포인트는 VPC 내의 Resource들이 VPC 외부의 서비스 등에 접근할 때 Internet Gateway, Nat Gateway 등 외부 인터넷 전송 서비스를 타지 않고 내부 네트워크를 통해 접근할 수 있도록 지원하는 서비스이다. 본 글에서는 VPC 내의 Private Subnet에 위치한 EC2 인스턴스에서 Snowflake로 접근하려고 하기 때문에 이를 위해 VPC 엔드포인트를 생성해 줄 것이다.

서비스 설정 값으로는 앞서 Snowflake 콘솔에서 얻은 결과 값 중 privatelink-vpce-id 값을 넣으면 검색이 된다.

다음으로는 Snowflake와 Secure한 연결을 해야 하는 VPC와 Private Subnet을 선택하고 80, 443 포트를 허용하도록 설정한 보안 그룹을 선택한다. 

 

 2. VPC 엔드포인트 DNS 이름 확인

아래와 같이 VPC 엔드포인트가 생성되었다. 빨간 박스로 체크되어 있는 DNS 이름을 기록한다. 이는 추후 VPC 엔드포인트의 DNS 이름으로 CNAME 레코드를 생성할 때 사용한다.

 

3. VPC 네트워크 구성하기

AWS PrivateLink 엔드포인트를 통해  Snowflake에 액세스하려면 DNS에 CNAME 레코드를 생성하여 SYSTEM$GET_PRIVATELINK_CONFIG 함수의 엔드포인트 값을 VPC 엔드포인트의 DNS 이름으로 확인해야 한다.

  • privatelink-account-url: PriaveteLink 설정 시 사용하게 될 Secure한 URL로 외부에서는 접속할 수 없는 URL
  • privatelink-ocsp-url: Snowflake client(SnowSQL, ODBC, JDBC driver 등)을 통해 접속할 때 인증서의 유효성을 확인하기 위해 사용하는 URL
  • snowsight-privatelink-url: snowsight 접속 시 사용하는 URL
  • regionless-snowsight-privatelink-url: market palce, snowsight help&support 페이지 접속 시 사용하는 URL

이를 위해 AWS Route 53을 통해 도메인 등록을 진행한다. AWS Route 53은 도메인 구입부터 네임서버 등록까지 DNS에 필요한 모든 기능이 있고 가용성과 확장성이 뛰어난 클라우드 Domain Name System(DNS) 웹 서비스이다.

아래와 같이 Route 53에서 snowflakecomputing.com 으로 private hosted zone을 생성한다. VPC는 앞서 선택한 VPC를 선택한다.

 

호스팅 영역이 생성되면 VPC 엔드포인트의 DNS 이름을 사용하여 CNAME 레코드를 추가한다.

 

아래 4개의 값을 CNAME으로 등록한다.

  • privatelink-account-url: PrivateLink 설정 시 사용하게 될 Secure한 URL로 외부에서는 접속할 수 없는 URL
  • privatelink-ocsp-url: Snowflake client(SnowSQL, ODBC, JDBC driver 등)을 통해 접속할 때 인증서의 유효성을 확인하기 위해 사용하는 URL
  • snowsight-privatelink-url: snowsight 접속 시 사용하는 URL
  • regionless-snowsight-privatelink-url: market palce, snowsight help&support 페이지 접속 시 사용하는 URL

 

4. Snowflake PrivateLink URL 접속 확인

이렇게 Snowflake PrivateLink URL 도메인 등록까지 생성하였다. VPC 엔드포인트를 생성한 Private 서브넷에 EC2 인스턴스를 하나 생성하여 Private한 URL로 접속이 되는지 확인한다.

 

Snowflake CLI 클라이언트인 Snowsql을 설치한 후 private한 URL로 Snowflake에 접속이 가능한지 확인한다.

 

Snowflake에서 LOGIN_HISTORY 뷰를 조회하여 private IP로 접근했음을 확인할 수 있다.