RedshiftでVPCルーティングを利用し、VPCエンドポイント経由でデータをロードする

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチハ、千葉です。

RedshiftのルーティングをVPCルーティングにて制御できるようになってました。以前は、RedshiftのルーティングはVPCルートテーブルでは制御できませんでした。

例えば、Redshiftをプライベートサブネットに配置、インターネットに接続できない環境でも、S3とインターネット経由にて通信できました。また、VPCエンドポイントを設定しても反映されずに、インターネット経由での通信となっていました。

今回のアップデートは、「Enhanced VPC Routing」という設定項目が追加され、こちらを有効にすることでVPCにて設定しているルートテーブルに従った通信を行うようになります。このパラメータは、新規作成時にも、既存のクラスタに対しても設定できます。

注意事項

注意いただきたいのですが、Enhanced VPC Routingを有効にする前にルートテーブルが意図した設定になっているかご確認ください。有効にしたタイミングで、通信ができなくなる可能性があります。ルートテーブル、VPCエンドポイント、ACL、VPCエンドポイントポリシー、インターネットゲートウェイ、S3バケットポリシーなど設定をご確認ください。

また、Enhanced VPC Routingを有効にしたタイミングにて一時的(数分)にReshiftへアクセスできない時間が発生しましたので、こちらも合わせてご注意ください。

嬉しいこと

まず、S3へはVPCエンドポイント経由にてプライベート接続が可能になります。

もう一つ、S3バケットポリシーでソースIPにてRedshiftのパブリックIPを指定している環境がありました。この環境に対して、Redshiftノード追加を行うとパブリックIPが全て書き変わってしまうので、毎度毎度、複数のバケットに対してポリシー変更を行う必要がありました。こちらを有効にすることで、バケットポリシーはIPベースではなくVPC単位でアクセス許可することができるようになりました。毎度毎度の変更が不要になりました!

やったね!

検証してみた方法

既存のRedshiftに対して、VPCルーティングが反映されるかを確認してみました。

ステップ1

20161020-redshift-enhanced-vpc-3

  • Redshift
    • プライベートサブネットに配置
  • S3
    • Reshiftからのアクセスを許可したS3バケットポリシーを設定

まずは、この環境でロードできることを確認します。

ステップ2

20161020-redshift-enhanced-vpc-4

  • VPC
    • プライベートサブネットに対してVPCエンドポイントを設定します。
  • Redshift
    • Enhanced VPC Routingを有効可

通信が、VPCエンドポイント経由になるので、IPアドレスで許可しているS3へアクセスできなくなることを想定。ロードが失敗するはず。

ステップ3

20161020-redshift-enhanced-vpc-5

  • S3
    • バケットポリシーをVPCでアクセス許可

VPCエンドポイント経由にてアクセスし、ロードが成功する

やってみた

ステップ1

Redshiftをプライベートサブネットに配置します。

S3バケットポリシーには以下を設定(RedshiftのパブリックIPアドレスのみ通信するように許可)

※RedshiftのIPに加え、自分の端末のソースIPも追加しましょう。でないと、操作できないバケットが誕生します。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "Allow-from-specific-IP",
			"Effect": "Deny",
			"Principal": "*",
			"Action": "s3:*",
			"Resource": [
				"arn:aws:s3:::redshift-test99",
				"arn:aws:s3:::redshift-test99/*"
			],
			"Condition": {
				"NotIpAddress": {
					"aws:SourceIp": [
          "xx.xx.xx.xx/32",
          "xx.xx.xx.xx/32"
					]
			}
		}
	]
}

S3からデータをロードしてみます。

chiba=# copy part from 's3://redshift-test99/load/part-csv.tbl'
CREDENTIALS 'aws_iam_role=arn:aws:iam::xxxxxxxxxxxx:role/redshift'
REGION 'ap-northeast-1'
csv
null as '\000';
INFO:  Load into table 'part' completed, 49999 record(s) loaded successfully.
COPY

ロードできました!

ステップ2

VPCエンドポイントを有効にします。

20161020-redshift-enhanced-vpc-2

Redshiftの設定Enhanced VPC Routingを有効にします。

設定変更中は、Redshiftに一時的にアクセスできなくなるのでご注意ください!

20161020-redshift-enhanced-vpc-1

設定が完了したので、VPCエンドポイント経由になり、S3にアクセスできず、ロードエラーになるはずです。

chiba=# copy part from 's3://redshift-test99/load/part-csv.tbl'
chiba-# CREDENTIALS 'aws_iam_role=arn:aws:iam::xxxxxxxxxxxx:role/redshift'
chiba-# REGION 'ap-northeast-1'
chiba-# csv
chiba-# null as '\000';

ERROR:  S3ServiceException:Access Denied,Status 403,Error AccessDenied,Rid 48A670758CE902FF,ExtRid GBu5y3l2X66UO2CayKe6d8fVQhQ8h1nAxPFeHMsNYA6xVXwzNMm1kXCmj9aJHNizE9Z0g5C2XzY=,CanRetry 1
DETAIL:
  -----------------------------------------------
  error:  S3ServiceException:Access Denied,Status 403,Error AccessDenied,Rid 48A670758CE902FF,ExtRid GBu5y3l2X66UO2CayKe6d8fVQhQ8h1nAxPFeHMsNYA6xVXwzNMm1kXCmj9aJHNizE9Z0g5C2XzY=,CanRetry 1
  code:      8001
  context:   Listing bucket=redshift-test99 prefix=load/part-csv.tbl
  query:     1599
  location:  s3_utility.cpp:532
  process:   padbmaster [pid=7837]
  -----------------------------------------------

エラーになりました!

ステップ3

S3バケットポリシーを変更し、VPCにて許可してみます。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "Allow-from-specific-IP",
			"Effect": "Deny",
			"Principal": "*",
			"Action": "s3:*",
			"Resource": [
				"arn:aws:s3:::redshift-test99",
				"arn:aws:s3:::redshift-test99/*"
			],
			"Condition": {
				"NotIpAddress": {
					"aws:SourceIp": [
						"xx.xx.xx.xx/32"
					]
				},
				"StringNotEquals": {
					"aws:sourceVpc": "vpc-xxxxxxxx"
				}
			}
		}
	]
}

これで、ロードできるようになっているはずです。

chiba=# copy part from 's3://redshift-test99/load/part-csv.tbl'
CREDENTIALS 'aws_iam_role=arn:aws:iam::xxxxxxxxxxxx:role/redshift'
REGION 'ap-northeast-1'
csv
null as '\000';
INFO:  Load into table 'part' completed, 49999 record(s) loaded successfully.
COPY

ロードできました!

まとめ

RedshiftがVPCルーティングに対応したため、EC2のようにACL、インターネットゲートウェイ、VPCに対応できます。また、S3バケットポリシーでのアクセス制御がとても楽になりました。

本番環境に設定を入れようっと。

参考

https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/enhanced-vpc-routing.html