2014-09-17 3 views
3

다른 계정의 s3에서 jar 파일 및 입출력 위치에 액세스하는 방법이 있는지 알고 싶습니다. 계정 1에서 실행중인 EMR 클러스터가 있습니다. 계정 2의 s3에서 File 및 jar 위치에 액세스하려고합니다. AWS SDK를 사용하여 AWS Simple 워크 플로를 시작합니다. 감사. http://docs.aws.amazon.com/IAM/latest/UserGuide/delegation-cross-acct-access.html다른 계정의 EMR 클러스터 및 s3 파일을 사용하여 작업 실행

당신은 IAM 역할을 사용하여 교차 계정 액세스를 설정할 수 있습니다 :

+0

이 간단한 솔루션으로 나타납니다 http://stackoverflow.com/questions/40364525/running-emr-spark-with-multiple-s3-accounts는하지만,이다 – vikas368

답변

1

당신은 크로스 계정 액세스를위한 역할을 만들어야합니다. 계정 1에서 사용자 (IAM 사용자 또는 페더레이션 사용자)가 맡을 수있는 계정 2에서 역할을 정의합니다. 계정 간 액세스에 역할을 사용하면 계정 2의 모든 리소스에 대한 액세스 권한을 부여 할 수 있습니다. S3)

편집 : 당신은 계정 2 S3 읽기 쓰기 액세스 할 수있는 역할을 만들 먼저해야 할

(의 그것을 이름을 보자 "S3-읽기 쓰기-역할") 및 계정 1에서 사용자에게 권한을 부여 역할 "S3-읽기 쓰기-역할"

확인이 링크를 사용하여, 그것을 수행하는 방법에 대해 설명합니다 : 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

다른 계정의 자격 증명을 추가하고 해당 계정의 데이터에서 작업을 수행하는 방법이 있습니다. 예를 들어, AwsCrediantials cred = new Aws Cred (Awskey, Awssecret id)를 사용하여 내 작업에서 s3에 액세스하고 있습니다. Simillary, 다른 계정의 계정 정보도 추가 할 수 있습니까? –

+0

이것은 정말 도움이되었습니다. 고마워. –

+0

그 답을 수락 된 것으로 표시 할 수 있습니까? – SelimN

관련 문제