AWSからPrivateLinkでSnowflakeに接続にする

## <検証したいこと>
AWSのVPCからPrivateLinkを経由でSnowflakeに接続します。

現場業務でAWSのVPCからSnowflakeへ接続するためのPrivateLinkを構築しました。
手順が複雑であったことから復習を兼ねて自分が持っているアカウントで構築してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/39c2f775-9c76-3270-f3c8-13ea325ffa94.png)

## <前提条件>
1.Snowflakeのエディションは、Business Criticalであること。
2.AWS環境には、VPCが作成されていること。
3.AWS CLIをローカル端末にインストールしていること。

## <作業手順>
①システム関数「SELECT SYSTEM$AUTHORIZE_PRIVATELINK」でSnowflakeのPrivateLinkを有効化します。
②AWSのVPCにInterface型のVPCエンドポイントを作成します。
③AWSのRoute53のPrivate Hosted Zoneに「ap-northeast-1.privatelink.snowflakecomputing.com」のドメインを作成します。
④「ap-northeast-1.privatelink.snowflakecomputing.com」のドメインにVPCエンドポイントの名前解決するためのCNAMEレコードを作成します。

## ① システム関数「SELECT SYSTEM$AUTHORIZE_PRIVATELINK」でSnowflakeのPrivateLinkを有効化します。
①-1 ローカル端末にインストールしているAWS CLIを開き、以下のコマンドを実行します。
```
aws sts get-federation-token --name <IAMユーザーの名前>
```
①-2 aws sts get-federation-tokenの実行結果から以下の値を取得し、メモ帳に控えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/e295f17d-cce1-3e38-3d85-b3302870f757.png)

①-3 SnowflakeのWebインターフェイスにログインして、システム関数「SELECT SYSTEM$AUTHORIZE_PRIVATELINK」を実行します。
```
SELECT SYSTEM$AUTHORIZE_PRIVATELINK(
  'AWSのアカウントID',
  'aws sts get-federation-tokenで取得したJSONの値'
);
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/8bc1d555-59a4-aa06-91a2-b45da74af454.png)

## ② AWSのVPCにInterface型のVPCエンドポイントを作成します。

②-1 SELECT SYSTEM$GET_PRIVATELINK_CONFIG()を実行します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/0199c615-50b9-e20f-f777-11071a5e93af.png)

②-2 SELECT SYSTEM$GET_PRIVATELINK_CONFIG()の実行結果から以下の値を取得します。
<実行結果>
{
 "privatelink-account-name":"ef87670.ap-northeast-1.privatelink",
 "privatelink-vpce-id":"com.amazonaws.vpce.ap-northeast-1.vpce-svc-04feb508c997b211e",
 "privatelink-account-url":"ef87670.ap-northeast-1.privatelink.snowflakecomputing.com",
 "regionless-privatelink-account-url":"razbyzh-vb70850.privatelink.snowflakecomputing.com",
 "privatelink_ocsp-url":"ocsp.ef87670.ap-northeast-1.privatelink.snowflakecomputing.com",
 "privatelink-connection-urls":"[]"
}

|取得する値|説明|
|:--|:--|
|privatelink-vpce-id|VPCエンドポイントを作成するための必要。VPCエンドポイントからの接続先エンドポイント。|
|privatelink-account-url|Route53にCNAMEレコードを登録する時に必要。PrivateLink経由でSnowflakeのWebインターフェイスにログインする際のURL。|
|privatelink_ocsp-url|Route53にCNAMEレコードを登録する時に必要。Snowflakeクライアントが HTTPS を介してSnowflakwに接続する時に証明書が取り消されるかどうかを判断するために使用。|

②-3 AWSコンソールを開き、「エンドポイント」の作成を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/8e20434a-89f2-2b03-2582-c0f5d78968c0.png)

②-4 手順②-2で取得した「privatelink-vpce-id」を使って、Interface型VPCendpointを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/cf3de077-1d7e-c6fd-fcc7-7aef8c829c87.png)


②-5 完成したVPCエンドポイントの「DNS名」を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/981d1844-ecaa-35d9-5d09-2cddc6737c08.png)

## ③ Route53にVPCエンドポイントの名前解決をするための「Private Hosted Zone」を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/65bc12b2-554d-8958-43cc-6d51fde58ed0.png)

## ④ 「ap-northeast-1.privatelink.snowflakecomputing.com」のドメインにVPCエンドポイントの名前解決するためのCNAMEレコードを作成します。
以下３つのCNAMEレコードを作成します。
|登録するレコード名|目的|
|:--|:--|
|ef87670|SnowflakeのWebインターフェイスにログインするために使用。|
|app|SnowsightやSnowflake Data Marketplaceに接続するために使用。|
|ocsp.ef87670|Snowflakeクライアントが HTTPS を介してSnowflakwに接続する時に証明書が取り消されるかどうかを判断するために使用。|

④-1 Route53コンソールから「レコード作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/be0af4ee-67f1-cf60-f5bf-919c38ad95d5.png)

④-2 SnowflakeのWebインターフェイスにログインするためのCNAMEレコードを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/84da3b5f-cdec-60c0-17db-10408d42e554.png)

④-3 SnowsightやData Marketplaceに接続するためのCNAMEレコードを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/8e3e99ee-4a72-c278-5e85-eea0d62b598a.png)

④-4 HTTPSを介してSnowflakwに接続する時に証明書が取り消されるかどうかを判断するためのCNAMEレコードを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/c24b165e-abf4-51a0-f8bf-3301ce9ecc98.png)

## <検証>
VPCエンドポイントを作成したVPCのPublic SubnetにEC2(Windowsサーバー)を立てます。
リモートデスクトップでEC2に接続します。
EC2上でブラウザを立ち上げ、PrivateLinkを経由でSnowflakeにログインできることを確認します。

PrivateLink経由でログインする場合のURLは以下となります。

https://ef87670.ap-northeast-1.privatelink.snowflakecomputing.com
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/d314ee95-11a9-eafd-b69d-3c67b8b15a4d.png)

EC2上のブラウザでログイン画面が表示されたことから、VPCからPrivateLink経由でSnowflakeに接続できることを確認できました。

## おわりに
VPCからPrivateLinkでSnowflakeに接続できるようになりました。

現場業務でもSnowflakeに対してETLを行います。今度は勉強のためにもAWS GlueからSnowflakeに対するETLを検証してみたいと思います。

# ご案内
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area