如何在具有IAM角色的ec2实例上使用Java访问dynamodb而无需访问凭据

ouyeyu

我想使用Java在Ec2实例上访问Dynamodb。此Ec2实例已被授予IAM角色,通过它我可以使用aws CLI直接访问Dynamodb:aws dynamodb list-table。现在,我尝试通过Java访问Dynamodb。Java代码应该可以担当角色,但是没有用。

public static void main(String[] args) throws Exception {

    String ROLE_ARN = "arn:aws:iam::....";

    AWSSecurityTokenServiceClient stsClient = new AWSSecurityTokenServiceClient();

    AssumeRoleRequest assumeRequest = new AssumeRoleRequest()
        .withRoleArn(ROLE_ARN)
        .withDurationSeconds(3600)
        .withRoleSessionName("demo");

    AssumeRoleResult assumeResult = stsClient.assumeRole(assumeRequest);

    BasicSessionCredentials temporaryCredentials = new BasicSessionCredentials(
                assumeResult.getCredentials().getAccessKeyId(),
                assumeResult.getCredentials().getSecretAccessKey(),
                assumeResult.getCredentials().getSessionToken());

    AmazonDynamoDBClient client = new AmazonDynamoDBClient(temporaryCredentials)

    DynamoDB dynamoDB = new DynamoDB(client);

    TableCollection<ListTablesResult> tables = dynamoDB.listTables();
    Iterator<Table> iterator_t = tables.iterator();
    System.out.println("Listing table names");
    while (iterator_t.hasNext()) {
        Table table = iterator_t.next();
        System.out.println(table.getTableName());
    }
}

当我在ec2实例上运行代码时,我得到了

Exception in thread "main" com.amazonaws.services.securitytoken.model.AWSSecurityTokenServiceException: Not authorized to perform sts:AssumeRole (Service: AWSSecurityTokenService; Status Code: 403; Error Code: AccessDenied; Request ID: 60313562-d462-11e6-a116-5bf8bb6a59ce)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1586)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1254)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1035)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:747)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:721)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:704)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:672)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:654)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:518)
    at com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClient.doInvoke(AWSSecurityTokenServiceClient.java:1188)
    at com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClient.invoke(AWSSecurityTokenServiceClient.java:1164)
    at com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClient.assumeRole(AWSSecurityTokenServiceClient.java:419)
    at com.spokeo.dynamo_elas.AccessAwsD.main(AccessAwsD.java:stsClient.assumeRole(assumeRequest))

有人知道如何解决这个问题吗?谢谢。

ouyeyu

经过长时间的探索,终于找到了以下解决方案。

    AWSCredentialsProvider provider = new InstanceProfileCredentialsProvider();

    AWSCredentials credential = provider.getCredentials();

    AmazonDynamoDBClient client = new AmazonDynamoDBClient(credential);

    client.setRegion(Region.getRegion(Regions.US_WEST_2));

    DynamoDB dynamoDB = new DynamoDB(client);

    TableCollection<ListTablesResult> tables = dynamoDB.listTables();

另外,还需要正确配置pom.xml中的依赖项以避免冲突,例如com.amazonaws aws-java-sdk 1.11.72

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.5</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-cbor -->
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-cbor</artifactId>
        <version>2.8.5</version>
    </dependency>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Boto3启动具有IAM角色的EC2实例?

Amazon EC2实例具有多个IAM角色

具有跨帐户IAM角色的EC2实例

具有附加 IAM 角色的 EC2 实例的 AccessDenied

无法从EC2访问具有IAM角色的S3文件

如何拒绝其他用户/角色创建具有IAM角色的EC2实例

限制从 EC2 实例访问 DynamoDB

如何自动创建具有公有IP的Ec2实例,而无需**在cloudformation中声明弹性IP?

AWS EC2以IAM角色访问S3

IAM 角色和 EC2 对用户身份的访问

如何从Lambda访问在EC2实例上运行的MySQL?

如何在cloudformation中访问EC2实例的IP

具有IAM角色的AWS EC2的静态内容

访问SQS从EC2 - 实例简介VS角色

AWS IAM策略以限制EC2实例上的读取访问权限

使用 Terraform 将现有 IAM 角色添加到 EC2 实例

我应该为S3存储桶分配什么权限,以使其只能使用IAM角色从EC2实例进行访问?

用于访问 DynamoDB 的 EC2 实例配置文件

如何从本地计算机brwoser的公司访问AWS EC2实例私有IP以访问在EC2上运行的应用程序

从带有 Spring 数据的 EC2 实例访问时,AWS DynamoDb 失败

具有 EC2 实例角色的规范用户 ID

无法使用EC2 IAM角色中的临时凭据启动EMR作业流

如何在没有密钥对/pem 文件的情况下访问 AWS EC2 实例的 SSH

使用 IAM 角色权限防止用户在没有密钥对的情况下在 CLI 中启动 EC2 实例

使用NAT实例提供对私有Ec2实例的Internet访问

是否可以在EC2实例上执行AWS CLI命令而无需在EC2上放置AWS凭证?

EC2 无法通过 IAM 角色访问 S3 对象

EC2中的AWS IAM角色以及从JupyterHub访问S3

在已承担角色的 ec2 实例上运行 ecr 命令需要哪些 iam 策略?