【问题标题】:AWS Lambda: How to access other account's bucket using IAM Roles in JavaAWS Lambda:如何在 Java 中使用 IAM 角色访问其他账户的存储桶
【发布时间】:2016-04-23 20:40:48
【问题描述】:

我有 2 个帐户

账户 A 和账户 B

在账户 A 中,我已部署 (Amazon S3) 我的 Lambda 函数。

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class LambdaFunctionHandler implements RequestHandler<Request, Response> {

    public Response handleRequest(Request request, Context context) {
        String greetingString = String.format("Hello %s %s.",
                request.firstName, request.lastName);
        //Here I need to get the Account B's bucket info
        return new Response(greetingString);
    }

}

在账户 A 中,我正在创建 IAM 角色“my-lambda”,并将其映射到用户 X

在帐户 B 中,我创建了授予具有角色“my-lambda”的用户权限的策略 如何通过用户 X 的 IAM 角色获取账户 B 的存储桶信息???

注意:如果我直接提供凭据,我可以获得账户 B 的存储桶信息

AWSCredentials longTermCredentials_ = new PropertiesCredentials(LambdaFunctionHandler .class.getResourceAsStream("/resources/"+"AwsCredentials.properties"));
AWSSecurityTokenServiceClient stsClient = new AWSSecurityTokenServiceClient(longTermCredentials_);
GetSessionTokenRequest getSessionTokenRequest = new GetSessionTokenRequest();
GetSessionTokenResult sessionTokenResult = stsClient.getSessionToken(getSessionTokenRequest);
Credentials sessionCredentials = sessionTokenResult.getCredentials();
BasicSessionCredentials basicSessionCredentials = new BasicSessionCredentials(sessionCredentials.getAccessKeyId(),sessionCredentials.getSecretAccessKey(),sessionCredentials.getSessionToken());
AmazonS3Client s3Client = new AmazonS3Client(basicSessionCredentials);
ListObjectsRequest listObjectsRequest = new ListObjectsRequest().withBucketName("bucketName");
ObjectListing objectListing;
 do {
            objectListing = s3.listObjects(listObjectsRequest);
            for (S3ObjectSummary objectSummary : objectListing
                    .getObjectSummaries()) {
                String key = objectSummary.getKey();

            }
            listObjectsRequest.setMarker(objectListing.getNextMarker());
        } while (objectListing.isTruncated());

【问题讨论】:

    标签: java amazon-web-services amazon-s3 aws-lambda


    【解决方案1】:

    您可以使用 STSAssumeRoleSessionCredentialsProvider 类根据您的长期凭证帮助承担该角色并获取 S3 客户端的临时凭证。

    AWSCredentials longTermCredentials_ =  ...
    STSAssumeRoleSessionCredentialsProvider roleCredsProvider = 
        new STSAssumeRoleSessionCredentialsProvider(
            longTermCredentials_, 
            "my_lambda", 
            "BucketListSession");
    AmazonS3Client s3Client = new AmazonS3Client(roleCredsProvider);
    

    【讨论】:

    • 不使用 longTermCredentials_ 就不能使用 s3Client 吗?
    • 有可能。您可以在 S3 存储桶策略中直接授予跨账户权限,也可以允许您的 Lambda 执行角色直接为跨账户角色调用 Assume Role。
    猜你喜欢
    • 2020-06-24
    • 2021-04-25
    • 2016-02-27
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    相关资源
    最近更新 更多