Amazon Redshift での UNLOAD に関する問題のトラブルシューティング方法を教えてください。

最終更新日: 2020 年 9 月 25 日

Amazon Redshift クラスターから Amazon Simple Storage Service (Amazon S3) にデータをアンロードしようとしています。しかし、エラーが発生します。これを解決するにはどうすればよいですか?

簡単な説明

Amazon Redshift クラスターから Amazon S3 バケットにデータをアンロードすると、以下のエラーが発生することがあります。

DB ユーザーに AWS ID および AWS Identity and Access Management (IAM) ロールを引き受ける権限がない旨のエラー

error:  User arn:aws:redshift:us-west-2:<account-id>:dbuser:<cluster-identifier>/<dbuser username> is not authorized to assume IAM Role arn:aws:iam::<account-id>:role/<Role name> 4

403 アクセス拒否エラー

[Amazon](500310) Invalid operation: S3ServiceException:Access Denied,Status 403,Error AccessDenied,

注意: S3 バケットにデータをアンロードする場合は、SELECT ステートメントで UNLOAD コマンドを使用します。(ロード中に使用されるデータ形式にかかわらず) テキストデータを区切り文字または固定長形式でアンロードします。圧縮された Gzip ファイルを保存するかどうかを指定することもできます。

解決方法

DB ユーザーに AWS IAM ロールを引き受ける権限がない旨のエラー

データベースユーザーが IAM ロールを引き受ける権限がない場合は、以下を確認してください。

403 アクセス拒否エラー

S3 バケットから 403 アクセス拒否エラーが表示された場合は、S3 API オペレーションに適切なアクセス許可が付与されていることを確認します。

  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",       
        "s3:List*",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::your_bucket",
        "arn:aws:s3:::your_bucket/*"
      ]
    }
  ]
}

S3 で管理される暗号化キーでサーバー側の暗号化を使用している場合、S3 バケットは固有のキーで各オブジェクトを暗号化します。追加の保護手段として、キー自体も定期的にローテーションされるマスターキーで暗号化されます。 

保存時にアンロードされたデータを暗号化するには、S3 バケットポリシーの s3:x-amz-server-side-encryption パラメータが「true」に設定されていることを確認します。

 "Condition": {
   "Null": {
           "s3:x-amz-server-side-encryption": "true"
           }

暗号化されたデータを S3 バケットに UNLOAD できるように、KMS_KEY_ID が暗号化されていることを確認します。

unload ('select * from a') to 's3://mybucket/test/varchar/' iam_role 'arn:aws:iam::xxxxxx:role/RedshiftS3Access' ALLOWOVERWRITE CSV
KMS_KEY_ID '11111111111111111111111111'
encrypted;

S3 バケットが AWS Key Management Service (AWS KMS) のマスターキーで暗号化されている場合は、以下のアクセス許可を IAM ポリシーに追加します。

"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
]