VPC絡みでRedshiftのネットワークが複雑でハマって整理したので、そのまとめです。
あくまで2019/02/09現在の仕様なので、仕様変わっていることもあると思います。
全体図
色々調べてまとめた図です。検証しているつもりなのですが、間違いあったら教えて欲しいです。
RedshiftやRedshift Spectrum(赤)のアイコンから出ている線はAWSのマネージドネットワークを通っているものです。VPCを通っているものはENIのアイコンから出ています。
以下のドキュメントにもあるように、RedshiftはVPC使えるには使えます。
ただ、一言で「使える」と言ってしまうにはハマりどころがありすぎる仕様です。今現在。
2019/02/20追記
上でIP制限のあるバケットにはUser Agentで例外を設けると書きましたが、以下の方法でRoleで例外を設けることも可能です。
Redshift SpectrumからS3への接続はVPC外を通る
上記の図を見てもらってもわかるように、RedshiftってあくまでAWS Managedのサービスなので、EC2などと比べネットワーク経路を意識しないといけないと感じました。
Spectrumもそうで、ドキュメントにちゃんと書いてあるのですがVPCは使えません。サポートに問い合わせたら、「今現在の仕様」と強調されたので仕様変わるのかも。VPC使えるようになってほしいけど。
VPC使えないけど、AWSのプライベートなネットワーク通るよと明示はしてあるのでインターネット出たりはしないのかもしれません。
少なくとも今は、S3側のバケットポリシーでIPやエンドポイント制限を入れているとSpctrumは弾かれてしまうので、以下のようにUserAgentに AWS Redshift/Spectrum
の例外設定入れることでバケットアクセスすることもできます。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:Get*", "s3:List*"], "Resource": "arn:aws:s3:::myBucket/*", "Condition": {"StringEquals": {"aws:UserAgent": "AWS Redshift/Spectrum"}} }] }
ParquetのCOPYはJSONのCOPYと経路が違う
一番びっくりした仕様はこちらです。バケットポリシーにS3 エンドポイント制限を入れたS3バケットに対して、COPYコマンドを実行した際に、
COPY FROM S3 iam_role 'roleA' format as json 'auto';
->成功
COPY FROM S3 iam_role 'roleA' format as parquet;
->エラー発生
IAMロールの権限はS3全権限付いています。S3バケットポリシーで弾かれている可能性が高い。まさかと思って以下のように AWS Redshift/Spectrum
を例外設定入れてみたら通りました。
"StringNotEquals": { "aws:sourceVpce": "vpce-xxxxxxxxxx", "aws:UserAgent": "AWS Redshift/Spectrum" },
サポートに確認したらドキュメントには記載が無いのですが、S3からParquetをCopyする場合は Redshift/Spectrum
として権限制御してあげる必要があります。
これも「今現在の仕様」と強調されたので仕様変わるのかも。VPC使えるようになってほしいけど。(2回目)