2015-10-16 28 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

相关问题