2017-01-06 15 views
2

Javaを使用してEc2インスタンスのDynamodbにアクセスしたいとします。 このEc2インスタンスにはIAMロールが付与されています。これを使用して、aws CLI:aws dynamodb list-tableを使用してDynamodbに直接アクセスできます。 これでJavaを介してDynamodbにアクセスしようとしました。 Javaコードは役割を果たすことができるはずですが、機能しませんでした。私はEC2インスタンス上でコードを実行したときjavaを使用してIAMロールのec2インスタンスでアクセスクレデンシャルなしでDynamodbにアクセスする方法

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()); 
    } 
} 

、私は

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 /資格情報を使用してローカルで開発していた場合、それが使用されていることである:私はのようなものを使用します。 IAM資格を持つEC2を使用している場合、EC2が使用されます。

+0

をいただき、ありがとうございます、たとえば、競合を避けるために正しく設定する必要があります投稿、stdunbar。 – ouyeyu

関連する問題