2014-09-17 4 views
3

Я хотел бы знать, есть ли способ доступа к файлам jar и местоположению ввода и вывода из s3 другой учетной записи. У меня есть кластер EMR, работающий на учетной записи 1. Я хочу получить доступ к файлам и банкам из s3 учетной записи 2. Я использую AWS SDK для запуска AWS Simple workflow. Благодарю.Выполнение заданий с использованием кластера EMR и файлов s3 из другой учетной записи

+0

Это, как представляется, простое решение: http://stackoverflow.com/questions/40364525/running-emr-spark-with-multiple-s3-accounts – vikas368

ответ

1

Вам нужно создать роль для доступа к кросс-счета: http://docs.aws.amazon.com/IAM/latest/UserGuide/delegation-cross-acct-access.html

Вы можете установить доступ кросс-счета с помощью IAM ролей. Вы определяете роль в учетной записи 2, которую пользователь может использовать (пользователь IAM или федеративный пользователь) в учетной записи 1. Использование ролей для доступа к кросс-аккаунту позволяет вам предоставлять доступ к любому ресурсу на учетной записи 2 (в вашем случае это S3)

EDIT:

Вы должны сначала создать роль с READWRITE доступа к S3 в Счет 2 (назовем его «S3-ReadWrite-роль») и дать разрешение на пользователей со счета 1 использовать роль «S3-ReadWrite-роли»

Проверить эту ссылку, он объяснит вам, как это сделать: http://blogs.aws.amazon.com/security/post/TxC24FI9IDXTY1/Delegating-API-Access-to-AWS-Services-Using-IAM-span-class-matches-Roles-span

После того, как вы закончите первый шаг, вы можете использовать этот код (не тестировалось): Используя ваши учетные данные, вы получите временные учетные данные безопасности для использования «S3-ReadWrite-role», затем вы будете использовать временные учетные данные безопасности для доступа к S3;)

import java.util.HashMap; 

import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClient; 
import com.amazonaws.services.securitytoken.model.AssumeRoleRequest; 
import com.amazonaws.services.securitytoken.model.AssumeRoleResult; 
import com.amazonaws.services.dynamodb.AmazonDynamoDBClient; 
import com.amazonaws.services.dynamodb.model.*; 
import com.amazonaws.auth.*; 

public class AssumeRoleDemo { 
    private static final String ROLE_ARN = 
    "arn:aws:iam::111122223333:role/S3-ReadWrite-role"; 

    private static AWSCredentials longTermCredentials_; 

    private static void init() throws Exception { 
    // acquire long term credentials from the properties file (you should use this method) 
    //longTermCredentials_ = new PropertiesCredentials(AssumeRoleDemo.class.getResourceAsStream("AwsCredentials.properties")); 

    // or you can use this one 
    longTermCredentials = new BasicAWSCredentials(access_key_id, secret_access_key); 
} 

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

     // Step 1. Use Joe.s long-term credentials to call the 
     // AWS Security Token Service (STS) AssumeRole API, specifying 
     // the ARN for the role S3-RW-role in account2. 

     AWSSecurityTokenServiceClient stsClient = new 
      AWSSecurityTokenServiceClient(longTermCredentials_); 

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

     AssumeRoleResult assumeResult = 
      stsClient.assumeRole(assumeRequest); 

     // Step 2. AssumeRole returns temporary security credentials for 
     // the IAM role. 

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

    // Step 3. Make S3 service calls to read data from a 
    // S3, stored in account2, using the 
    // temporary security credentials from the S3-ReadWrite-role 
    // that were returned in the previous step. 

    AmazonS3 s3Client = new AmazonS3Client(temporaryCredentials); 
    S3Object object = s3Client.getObject(
       new GetObjectRequest(bucketName, key)); 
    InputStream objectData = object.getObjectContent(); 
    // Process the objectData stream. 
    objectData.close(); 

    } 
} 
+0

Но это существует способ добавления учетных данных другой учетной записи и выполнения заданий по данным в этой учетной записи. Например, я получаю доступ к s3 в своих работах, используя AwsCrediantials cred = new Aws Cred (Awskey, Awssecret id). Simillary, Могу ли я добавить учетную запись другой учетной записи. – 2014-09-18 15:13:51

+0

Это действительно помогло. Спасибо .. – 2014-09-19 22:19:45

+0

Не могли бы вы отметить ответ, как принято? – SelimN