[新機能] Amazon Redshift PrivateLinkによる Cross-VPCアクセスを試してみました

2021.04.13

データアナリティクス事業本部コンサルティングチームの石川です。先日、Redshiftクラスタに接続するための VPCエンドポイント (Redshift-managed VPC endpoints) をサポートするようになりました。早速試してみます。

AWS PrivateLinkによるCross-VPCアクセスとは

AWSアカウントを問わず別のVPCのクライアントアプリケーションから別のVPCのRedshiftにプライベートにアクセスできるようになります。これまで別のVPCのRedshiftにアクセスするのに必要であったVPC-Peering接続やパブリックIPによるインターネット接続する必要がなくなります。

下記の例では、PublicサブネットのSQL Workbench/JからPrivateサブネットのVPC endpointを経由して、異なるAWSアカウントのVPCのRedshiftクラスタにアクセスしています。

引用:Enable private access to Amazon Redshift from your client applications in another VPC

この機能は、RA3インスタンス (ra3.xlplus、ra3.4xlarge、ra3.16xlarge) で、クラスタ再配置(Cluster relocation)が有効になっているRedshiftクラスターでのみサポートされています。クラスタ再配置については、以下のブログをご覧ください。

今回は、異なるAWSアカウント間でCross-VPCアクセスを試します。ターゲットアカウント(下図の右)でVPCエンドポイント経由して、ソースAWSアカウント(下図の左)のRedshiiftクラスタにpsqlコマンドで接続できる環境を構築します。

手順は、ソースAWSアカウントのRedshiiftクラスタ設定した後、ターゲットアカウントでVPCエンドポイントを作成します。

ソースAWSアカウントのRedshiiftクラスタ設定

ソースAWSアカウントは、RedshiftクラスタがあるAWSアカウントです。Redshiiftクラスタで、クラスタ再配置を有効に設定した後、アクセスを承認するAWSアカウントやそのVPCを設定します。

Redshiiftクラスタのクラスタ再配置を有効にする

Redshiiftクラスタのクラスタ再配置を有効にします。設定は数分でで適用されます。

アクセスを承認するAWSアカウントやそのVPCの設定(オプション)

異なるAWSアカウント間でCross-VPCアクセスする場合は、AWSアカウントやVPCへのアクセスを承認が必要になります。今回は、AWSアカウントからアクセスするので、Granted accountsに承認するAWSアカウントを設定します。

なお、エンドポイントがクラスタと同じアカウントにある場合はデフォルトで許可されているため、この設定は不要です。

すべてのVPCの接続を許可するか否かを設定し、接続を許可するVPCを制限する場合は、許可するVPC IDを指定します。今回は、VPC IDを指定して制限します。

ターゲットアカウントでVPCエンドポイントを作成

VPCエンドポイントの設定として、ターゲットサブネットグループを作成します。ターゲットサブネットグループに基づいて、VPCエンドポイントを作成します。

ソースアカウントでターゲットアカウントを承認すると、ターゲットアカウントのRedshiftコンソールの[From other accounts]タブにクラスタが追加されます。

ターゲットサブネットグループを作成する

ターゲットアカウントのRedshiftコンソール左の[設定]を選び、画面下の[サブネットグループ]を選択、[サブネットグループの作成]を押します。

「サブネットを追加」にVPCエンドポイントをデプロイするVPCやサブネットを指定します。

VPCエンドポイントを作成

Redshiftコンソールの[設定]から、[Create endpoint]を選択します。

[エンドポイント設定]セクションで、ターゲットアカウントを指定し、エンドポイントをデプロイする適切なVPCとサブネットグループを選択します。 この手順の一部として、VPCエンドポイントに対してセキュリティグループを設定できます。一般的なRedshiftのエンドポイントを保護するのと同じように、VPCエンドポイントの利用を許可する接続先を制限できます。

Redshift-managed VPC endpointsが追加されました。私の環境では、約5分程度で「状態」がCreatingからActiveに更新され、VPCエンドポイントの作成が確認できました。

ターゲットアカウントからソースアカウントのRedshiftクラスタに接続する

ターゲットアカウントでVPCエンドポイントを作成すると、Redshiftコンソールの[設定]のRedshiftへのEndpoint name(VPCエンドポイント名)のリンクをクリックすると、VPCエンドポイントURLなど、接続に必要となる情報が参照できます。

psqlコマンドを使ってターゲットアカウントVPCエンドポイントに接続すると、ソースアカウントのRedshiftクラスタに接続できました。

[ec2-user@ip-10-0-0-134 ~]$ psql -h cross-vpc-redshift-endpoint-endpoint-sdkfjhsdkfhs. mbonsfofjsodi4t1.ap-northeast-1.redshift.amazonaws.com -U awsuser -d dev -p 5439
ユーザ awsuser のパスワード:
psql (9.2.24, サーバー 8.0.2)
注意: psql バージョン 9.2, サーバーバージョン 8.0.
         psql の機能の中で、動作しないものがあるかもしれません。
SSL 接続 (暗号化方式: ECDHE-RSA-AES256-GCM-SHA384, ビット長: 256)
"help" でヘルプを表示します.

dev=# \d
リレーションがありません。
dev=# \d
           リレーションの一覧
 schema |   名前    |   type   |  owner
--------+-----------+----------+---------
 public | cross_vpc | テーブル | awsuser
(1 行)

dev=# \dn
      スキーマ一覧
      名前       | owner
-----------------+-------
 catalog_history | rdsdb
 public          | rdsdb
(2 行)

まとめ

今回の検証では、ターゲットアカウントのVPCとソースアカウントのVPCともに同じCIDR(10.0.0.0/16)を指定して、本来ならVPC-Peeringができない環境にRedshift-managed VPC endpointsを導入することでプライベートアクセスをスマートに実現しました。NAT GatewayとPrivetelinkではなく、クラスタ再配置(Cluster relocation)とRedshift-managed VPC endpointsとして提供されているため、シンプルで安全なプライベート接続が可能になりました。

先日、Redshift Datasharingでデータを移動なしに複数のクラスタ間で共有できるようになりましたが、今後は、更にVPC間でクラスタを共有できるようになるわけです。素晴らしいですね。

合わせてAWS利用費について調べてみましたが、執筆時点では料金ページに記載がありませんでした。クラスタ再配置(Cluster relocation)が有効になっているRedshiftクラスタが前提なので、Privetelinkの料金だけでこの機能が利用できると嬉しいなと妄想したりしています。

合わせて読みたい