使用AWS IAM用户角色凭据调用AWS S3存储桶API:

时间:2017-02-04 00:18:19

标签: amazon-s3 apache-camel amazon-iam

使用AWS IAM用户角色的动机是让AWS自动处理每个服务调用的AWS密钥/凭证。这种方法正在Apache Camel背后使用,后者使用凭证安全地进行数据传输,即不在源代码中存储任何凭证。

我发现的问题是IAM工具中的凭据只能在aws cli中工作。

例如,我使用IAM自动生成的凭据成功运行它(在我的环境变量中设置它们):

aws s3 cp test.txt s3://x/test.txt

但是,当我尝试在API调用中模仿相同的操作(相同的凭据)时,我收到以下错误消息:

The AWS Access Key Id you provided does not exist in our records.
(Service: Amazon S3; Status Code: 403; Error Code: InvalidAccessKeyId;         
Request ID: 07A4FCDCA2E82F9E)

此外,使用我的AWS账户安全凭证(即制作安全密钥ID和密钥),我可以使上述API工作。所以API不是问题(考虑到我已经测试了2个全音阶凭据集)。

最后,我的AWS IAM用户角色设置为对S3存储桶具有完全访问权限,并且S3存储桶本身已配置为允许这样做。这是我开始迷失在潜在路线上的地方。

了解所有这些,我做了一些研究,发现有类似问题的人(1)(2)。每个来源都提出了不同的想法来解决问题,但似乎都不适用于我使用Apache Camel的用例。

有关我使用Apache Camel的知识,我的代码示例如下:

    String awsS3Connection = "aws-s3://x" + "?accessKey=" + accessId +
                             "&secretKey=" + accessKey;

    from(awsS3Connection)
            .to(importProcessingEndpoint);

2 个答案:

答案 0 :(得分:1)

临时凭证对服务API没有意义 - 并且无法识别 - 除非它们与其附带的会话/安全令牌一起使用。

正在准备签名的请求时......

  

将会话令牌添加到HTTP标头或名为X-Amz-Security-Token的查询字符串参数。您将会话令牌添加到HTTP标头或查询字符串参数,但不是两者都添加。

     

http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html#RequestWithSTS

但是,从Camel docs来看,如何传递令牌或者是否实现了对此的支持并不明显。

答案 1 :(得分:0)

经过深入研究后,我发现这是Camel不支持最新版AWS SDK的问题。它确实成功检索了凭据(请参阅this文档),但创建的客户端本身会破坏Camel。

我能找到的唯一解决方案是自定义AWS SDK,以便在构建客户端时返回凭据,然后使用所述凭据构建与使用较旧版本的AWS SDK兼容Camel的客户端...尽管这是非常不实际的,必须包含相同SDK的两个版本,它可以工作。