使用 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.
但是,对于 Camel docs,如何传递令牌或者他们是否实现了对此的支持并不明显。
经过深入研究,我发现这是 Camel 不支持最新版本 AWS SDK. It does successfully retrieve the credentials (see this 文档的问题),但创建的客户端本身会破坏 Camel。
我能找到的唯一解决方案是在构建客户端时将 AWS SDK 自定义为 return 凭据,然后使用所述凭据构建与使用旧版本的 Camel 兼容的客户端AWS SDK...虽然这非常不切实际并且有必要包含同一 SDK 的两个版本,但它可以工作。
使用 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.
但是,对于 Camel docs,如何传递令牌或者他们是否实现了对此的支持并不明显。
经过深入研究,我发现这是 Camel 不支持最新版本 AWS SDK. It does successfully retrieve the credentials (see this 文档的问题),但创建的客户端本身会破坏 Camel。
我能找到的唯一解决方案是在构建客户端时将 AWS SDK 自定义为 return 凭据,然后使用所述凭据构建与使用旧版本的 Camel 兼容的客户端AWS SDK...虽然这非常不切实际并且有必要包含同一 SDK 的两个版本,但它可以工作。