2015-10-16 47 views
0

以下是我所嘗試的,但它不起作用。我認爲問題是生成的密鑰只是針對EC2實例的範圍生成的。因此,當Redshift嘗試使用該命令調用COPY命令時,則無法識別它。如何使用非硬編碼密鑰的Redshift COPY

AWSCredentialsProvider credentialProvider = new DefaultAWSCredentialsProviderChain(); 
     return new StringBuilder("COPY ").append(tmpPrefix) 
       .append(tableName) 
       .append(" FROM '") 
       .append(filePath) 
       .append("' WITH CREDENTIALS 'aws_access_key_id=") 
       .append(credentialProvider.getCredentials().getAWSAccessKeyId()) 
       .append(";aws_secret_access_key=") 
       .append(credentialProvider.getCredentials().getAWSSecretKey()) 
       .append("' JSON 'auto' GZIP ACCEPTINVCHARS ' ' TRUNCATECOLUMNS TRIMBLANKS;") 
       .toString(); 

以下是我得到

[Amazon](500310) Invalid operation: S3ServiceException:The AWS Access Key Id you provided does not exist in our records.,Status 403,Error InvalidAccessKeyId.... 

任何想法如何得到這個工作的錯誤?

+0

看看你有IAM角色設置你試圖執行COPY命令的地方使用ec2實例嗎? – Vor

+0

EC2具有訪問特定存儲桶的IAM角色。但紅移是通過JDCB命令(通過JBOSS)訪問的,用戶使用Redshift憑證。 – dinesh707

回答

2

您正在使用IAM角色(它創建了一組臨時憑證+令牌)。

當您使用臨時creds(接入,祕密令牌),你必須提供令牌以及執行COPY命令: credentials 'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;token=<temporary-token>';

在文檔http://docs.aws.amazon.com/redshift/latest/dg/t_loading-tables-from-s3.html