2017-01-06 14 views
2

Я хочу использовать Java для доступа к Dynamodb в экземпляре Ec2. Этот экземпляр Ec2 получил роль IAM, с которой я могу напрямую обращаться к Dynamodb с помощью aws-CLI: aws dynamodb list-table. Теперь я пытаюсь получить доступ к Dynamodb через Java. Java-код должен быть способен принять на себя роль, но он не работает.Как использовать java для доступа к dynamodb без учетных данных доступа для экземпляра ec2 с ролью IAM

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)) 

Кто знает, как решить эту проблему? Спасибо.

ответ

0

После долгого изучения, наконец, выяснилось следующее решение.

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> 
1

Когда я это сделал, мне никогда не приходилось делать что-либо конкретно с ролью - действительно, я не знаю, какую роль я использую. Я использую что-то вроде:

AWSCredentialsProviderChain credentialsProvider; 
try { 
    credentialsProvider = new DefaultAWSCredentialsProviderChain(); 
} 
catch (Exception e) { 
    throw new RuntimeException("Error loading credentials", e); 
} 

AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentialsProvider); 

Преимущества использования поставщика по умолчанию является то, что если я разрабатываю локально с ~/.aws/учетными данными используются. Если я на EC2 с учетными данными IAM, то он используется.

+0

Благодарим Вас за проводка, stdunbar. – ouyeyu

 Смежные вопросы

  • Нет связанных вопросов^_^