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

AWS S3 bucket API calls using AWS IAM User Role credentials:

使用 AWS IAM 用户角色的动机是让 AWS 为每个服务调用自动处理 AWS keys/credentials。这种方法在 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);

临时凭证对服务 API 没有意义,也无法被服务 API 识别,除非它们与随附的 session/security 令牌一起使用。

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

You add the session token to an HTTP header or to a query string parameter named X-Amz-Security-Token. You add the session token to the HTTP header or the query string parameter, but not both.

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

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

经过深入研究,我发现这是 Camel 不支持最新版本 AWS SDK. It does successfully retrieve the credentials (see this 文档的问题),但创建的客户端本身会破坏 Camel。

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