以下是我尝试过的,但它没有用。我认为问题是生成的密钥只是为EC2实例的范围生成的。因此,当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 :(得分:2)
您正在使用IAM角色(它会创建一组临时凭证+令牌)。
当您使用临时信誉(访问,秘密,令牌)执行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