我需要使用 Apache Camel 从/到位于不同 aws 帐户中的 s3 复制文件。
例如,我在账户 A 中运行 Camel,而账户 B 中存在 S3。我创建了一个跨账户角色以从账户 A 访问 S3。
最初,我使用 STS 创建了一个 s3Client 并将其设置在骆驼注册表中以从帐户 B 访问 S3。由于这些是临时凭据,它们可以在完成复制作业之前的任何时间过期。在这种情况下我该怎么办?有没有办法在运行路线时更新骆驼注册表中的 s3 客户端?
我需要使用 Apache Camel 从/到位于不同 aws 帐户中的 s3 复制文件。
例如,我在账户 A 中运行 Camel,而账户 B 中存在 S3。我创建了一个跨账户角色以从账户 A 访问 S3。
最初,我使用 STS 创建了一个 s3Client 并将其设置在骆驼注册表中以从帐户 B 访问 S3。由于这些是临时凭据,它们可以在完成复制作业之前的任何时间过期。在这种情况下我该怎么办?有没有办法在运行路线时更新骆驼注册表中的 s3 客户端?
Apache Camel 支持使用 s3client 连接 AWS S3。由于这里的问题是从跨账户访问 S3,首先我们必须在账户 B 中创建一个角色,账户 A 作为受信任的账户。确保通过策略为该角色提供所需的 S3 访问权限。
现在在账户 A 中创建一个策略,如下所示来承担角色。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"sts:AssumeRole",
"sts:GetSessionToken"
],
"Resource": "arn:aws:iam::Account_B:role/Cross-account-s3-access"
}
]
}
在账户 A 中创建一个角色并将此策略附加到新创建的角色。将此策略分配给部署骆驼(适用于任何需要跨账户访问的应用程序)的 ec2 实例。
现在我们可以通过任何 STS API 生成临时凭证,并使用这些凭证从跨账户访问资源(在这种情况下,我们可以从账户 B 访问 S3)。
由于这些凭据可能会在特定时间后过期,因此我们需要寻找一种方法来刷新它们。AWS 提供了STSAssumeRoleSessionCredentialsProvider API,可以自动刷新凭证。下面是代码片段
Builder builder = new STSAssumeRoleSessionCredentialsProvider.Builder(roleArn, roleSession).withRoleSessionDurationSeconds(900);
return AmazonS3ClientBuilder.standard()
.withCredentials(builder.build())
.withRegion(region)
.build();