我需要使用 Apache Camel 从/复制到位于不同 aws 账户中的 s3 文件。
例如,我在账户 A 中运行 Camel,而账户 B 中存在 S3。 我创建了一个跨账户角色以从账户 A 访问 S3。
最初,我使用 STS 创建了一个 s3Client,并将其设置为从账户 B 访问 S3。由于这些是临时凭证,因此它们可能会在复制作业完成之前随时过期。在这种情况下,我该怎么办?有没有办法在运行路由时更新 Camel 注册表中的 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 中创建角色,并将此策略附加到新创建的角色。将此策略分配给部署了 Camel(适用于需要跨账户访问的任何应用程序(的 ec2 实例。
现在,我们可以通过任何 STS API 生成临时凭证,并使用这些凭证从跨账户访问资源(在本例中,我们可以从账户 B 访问 S3(。
由于这些凭据可能会在特定时间后过期,因此我们需要研究刷新它们的方法。AWS 提供了STSAssumeRoleSessionCredentialsProvider API,该 API 可自动刷新凭证。下面是代码片段
Builder builder = new STSAssumeRoleSessionCredentialsProvider.Builder(roleArn, roleSession).withRoleSessionDurationSeconds(900);
return AmazonS3ClientBuilder.standard()
.withCredentials(builder.build())
.withRegion(region)
.build();