RedshiftとSpectrumとS3とVPCで組み合わせた場合のネットワーク経路が複雑だったので整理してみた

VPC絡みでRedshiftのネットワークが複雑でハマって整理したので、そのまとめです。

あくまで2019/02/09現在の仕様なので、仕様変わっていることもあると思います。

全体図

色々調べてまとめた図です。検証しているつもりなのですが、間違いあったら教えて欲しいです。

RedshiftやRedshift Spectrum(赤)のアイコンから出ている線はAWSのマネージドネットワークを通っているものです。VPCを通っているものはENIのアイコンから出ています。

f:id:yomon8:20190220224818p:plain

以下のドキュメントにもあるように、RedshiftはVPC使えるには使えます。

ただ、一言で「使える」と言ってしまうにはハマりどころがありすぎる仕様です。今現在。

docs.aws.amazon.com

 2019/02/20追記

上でIP制限のあるバケットにはUser Agentで例外を設けると書きましたが、以下の方法でRoleで例外を設けることも可能です。

aws.amazon.com

Redshift SpectrumからS3への接続はVPC外を通る

上記の図を見てもらってもわかるように、RedshiftってあくまでAWS Managedのサービスなので、EC2などと比べネットワーク経路を意識しないといけないと感じました。

Spectrumもそうで、ドキュメントにちゃんと書いてあるのですがVPCは使えません。サポートに問い合わせたら、「今現在の仕様」と強調されたので仕様変わるのかも。VPC使えるようになってほしいけど。

VPC使えないけど、AWSのプライベートなネットワーク通るよと明示はしてあるのでインターネット出たりはしないのかもしれません。

docs.aws.amazon.com

少なくとも今は、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回目)