使用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的两个版本,但它可以工作。