PrivateLink 설정 방법

MJ Lee
Snowflake Korea
Published in
10 min readFeb 15, 2023

AWS PrivateLink 는 VPC 엔드포인트를 통해public 인터넷망을 타지 않고VPC 간 secure 한 커넥션을 맺을 수 있도록 하는 서비스입니다. 따라서 AWS PrivateLink 를 사용하면 같은 리전안에서 AWS VPC 와 Snowflake VPC 간에 public 인터넷망을 타지 않도록 네트워크를 구성할 수 있습니다.

https://www.snowflake.com/blog/privatelink-for-snowflake-no-internet-required/

VPN 환경에서 Snowflake 에 접속하고자 하는 사용자는 AWS PrivateLink 설정이 필수라고 할 수 있는데요. 이번 글에서는 Snowflake 를 위해 AWS PrivateLink 를 설정하는 방법을 자세히 안내하도록 하겠습니다.

  1. 아래 명령어를 실행합니다.
aws sts get-federation-token --name sam

결과는 대략 아래와 같을 것입니다.

{
...
"FederatedUser": {
"FederatedUserId": "185...:sam",
"Arn": "arn:aws:sts::185...:federated-user/sam"
},
"PackedPolicySize": 0
}

2. Snowflake 웹 화면에 로그인하고 ACCOUNTADMIN 역할로 전환해서 아래 명령어를 실행합니다. 여기서 <aws_id> 는 1번 실행 결과에서 185… 로 시작하는 12자리 숫자가 되며 <federated_token> 는 1번의 전체 실행 결과가 되도록 합니다.

use role accountadmin;
select SYSTEM$AUTHORIZE_PRIVATELINK ( '<aws_id>' , '<federated_token>' );

명령어는 다음과 같은 형식이 되어야 합니다.

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
}'
);

다음으로 아래 명령어를 실행해서 PrivateLink 사용을 enable 합니다.

alter account set enable_internal_stages_privatelink = true;

3. 아래 명령어를 실행하고 리턴 값을 기록해 둡니다. 이후 AWS VPC 엔드포인트 생성 및 DNS 설정에 사용할 값들 입니다.

select key, value from table(flatten(input=>parse_json(system$get_privatelink_config())));

4. AWS 콘솔로 이동하고 VPC 서비스 선택 -> 화면 좌측 Endoints -> 우측 상단Create endpoint 를 선택해서 VPC 엔드포인트를 생성합니다. Service settings 에는 3번에서 실행 결과 중 privatelink-vpce-id 값을 복사해서 넣으면 검색이 될 것입니다. VPC 에는 Snowflake 와 secure 한 연결을 해야 하는 VPC ,서브넷을 선택합니다. Security Group 의 경우 80, 443 포트를 허용하도록 설정한 Security Group 을 등록합니다.

5. 아래와 같이 vpc 엔드포인트가 만들어졌습니다. 여기서 DNS names 값 중 가장 상단에 위치한 값을 기록해 둡니다.

6. AWS PrivateLink 엔드포인트를 통해서 Snowflake 에 접근하려면 3번 실행결과 중 아래 값들과 5번에서 확인한 VPC 엔드포인트의 DNS 이름으로 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 place, snowsight help & support 페이지 접속 시 사용하는 URL

Route53 에서 snowflakecomputing.com 으로 private hosted zone 을 생성한 후 위 4개의 값을 CNAME 으로 등록합니다.

7. 이제 설정이 완료되었습니다. VPC 엔드포인트 생성 시 추가한 서브넷 대역에 EC2 인스턴스를 하나 띄워 private 한 URL 로 접속에 문제가 없는지 확인합니다.

8. Snowflake CLI 클라이언트인 SnowSQL 설치 후 private 한 URL 로 접속 가능한지도 확인합니다.

Snowflake UI 에서도 확인해봅니다. 로그인 후 화면좌측 -> Admin -> Security 에서 private IP 로 접근했음을 확인합니다.

9. 다음은 snowflake client 가 퍼블릭 망을 타지 않고 snowflake 의 internal stage (S3) 에 접근하도록 하기 위해 VPC interface endpoint 를 하나 더 만들 차례입니다. VPC 서비스 -> Endpoint 로 이동해서 아래와 같이 Interface Endpoint 를 생성합니다. Services 검색 시 S3 가 Interface 타입으로 선택되었는지 다시한번 확인합니다.

10. 다음과 같이 S3 엔드포인트가 생성되었습니다. DNS names 중 가장 상단에 있는 값을 기록해둡니다.

11. Route53 에서 Private hosted zone 을 아래와 같이 생성합니다.

12. 레코드를 추가할 차례입니다. Record name 은 3단계에서 privatelink-internal-stage 값을 참고해서 생성합니다. Value 는 10 번에서 확인한 값이 다음과 같다면

*.vpce-xxxxxxxxxfbb1-xxxxkow.s3.ap-northeast-2.vpce.amazonaws.com

이 값에서 * 를 3단계에서 확인한 버킷 이름 (sfc-kr-ds1–3-customer-stage) 으로 변경합니다. 아래와 같은 값이 되어야 합니다.

sfc-kr-xxx-x-customer-stage.vpce-xxxxxxxxxfbb1-xxxxkow.s3.ap-northeast-2.vpce.amazonaws.com

*기존에 생성되어 있던 s3 로 global public endpoint 를 사용해서 접근하고 있었다면 private hosted zone 을 s3.ap-northeast-2.amazoneaws.com으로 설정하면 안됩니다. 이때는 private hosted zone 이름을 “snowflake 의 internal stage 버킷이름.s3.ap-northeast-2.amazonaws.com”으로 설정하고 S3 private endpoint 의 IP 주소를 A 레코드로 등록하면 됩니다.

13. VPC 엔드포인트 생성시 추가한 서브넷 대역에 띄운 ec2 에서 private 한 connection 이 생성되는지 확인합니다. 아래와 같이 Private IP 가 리턴되는것을 확인할 수 있습니다.

* 참고로 AWS에 따르면 사용자의 S3 와 Snowflake 간의 커넥션은 AWS 의 사설 네트워크를 사용한다고 명시하고 있습니다.

When using public IP addresses, all communication between instances and services hosted in AWS use AWS’s private network. Packets that originate from the AWS network with a destination on the AWS network stay on the AWS global network, except traffic to or from AWS China Regions.

14. 이제 모든 설정이 완료되었습니다. 기존 퍼블릭 인터넷 환경에서 접속 가능한 URL을 통해 여전히 Snowflake 로 접근 가능하기 때문에 Public IP 로 접속이 불가능하도록 IP Whitelist 를 설정합니다.

Snowflake UI 로 접속 후 화면 좌측 Security -> 우측 상단 Network Policy -> 아래와 같이 허용할 Private IP 를 명시하고 Create network policy 를 클릭합니다.

이렇게 정책이 만들어 진 다음 Activate Policy 버튼을 클릭하면 정책에 의해 허용된 Private IP 를 통해서만 Snowflake 로 접속할 수 있으며 https://xxxxxxx.ap-northeast-2.aws.snowflakecomputing.com/ 이 URL 로는 더이상 접속이 불가능한 반면 3 단계에서 확인한 URL 인 https:// xxxxxxx.ap-northeast-2.privatelink.snowflakecomputing.com/ 로만 접속이 허용됩니다.

지금까지 Snowflake 를 위해 PrivateLink 를 설정하는 방법을 알아봤습니다. 클라우드 사용이 보편화 되면서 기업의 보안 요건 또한 강화되고 있습니다. 그렇지만 PrivateLink 를 통해 secure 한 환경에서 Snowflake 를 사용할 수 있으므로, 이를 활용하면 더이상 클라우드는 안전하지 않다는 막연한 두려움에서 벗어나 Snowflake 가 주는 이점들을 누릴 수 있을 것입니다.

--

--