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



使用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)。每个源代码都提供了不同的想法来解决问题,但似乎都不适用于我的ApacheCamel用例。

为了了解我对ApacheCamel的使用,我的代码示例如下:

String awsS3Connection = "aws-s3://x" + "?accessKey=" + accessId +
"&secretKey=" + accessKey;
from(awsS3Connection)
.to(importProcessingEndpoint);

临时凭据对服务API来说没有意义,也无法被服务API识别,除非它们与附带的会话/安全令牌一起使用。

当准备签名请求时。。。

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

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

然而,从Camel文档中,还不清楚如何传递令牌,也不清楚他们是否实现了对此的支持。

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

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

相关内容

  • 没有找到相关文章

最新更新