2017-12-22 25 views
0

s3 및 역할이 계정에서 어떻게 작동하는지에 관한 질문이 있습니다.역할을 가정하여 람다를 시도 할 때 다른 계정에서 s3 버킷에 액세스하려고했습니다. GetObject 작업을 얻습니다. 액세스가 거부되었습니다.

계정 A의 역할을 가진 람다 함수와 람다 함수가 액세스해야하는 계정 B의 버킷이있는 상황이 있습니다. 계정 A의 역할에는 계정 B의 버킷에 대한 s3 : * 권한이 있습니다. 계정 A의 역할을 수락하기 위해 계정 B의 버킷에 주체를 설정합니다. 버킷 정책은 또한 버킷에서 s3 : *를 허용합니다. 아래처럼.

A 계정 역할 :

{ 
    "Action": [ 
     "s3:*" 
    ], 
    "Resource": [ 
     "arn:aws:s3:::bucket/*", 
     "arn:aws:s3:::bucket" 
    ], 
    "Effect": "Allow" 
} 

계정 B 버킷 정책 :

{ 
    "Effect": "Allow", 
    "Principal": { 
     "AWS": "arn:aws:iam::account:role/role" 
    }, 
    "Action": "s3:*", 
    "Resource": ["arn:aws:s3:::bucket/*","arn:aws:s3:::bucket"] 
} 

우리가로 실행하는 문제는 계정 A의 역할은 버킷의 모든 LIST 작업을 할 수 있다는 것이다 계정 B에 있지만 GET 작업을 시도 할 때 액세스가 거부됩니다. 우리가 양쪽에 s3 : * 권한을 가지고 있기 때문에 어떤 의미가 없습니다.

기대했던대로 작동하도록하는 버킷 또는 IAM 정책 설정에서 놓친 부분이 있습니까? 계정 A의 역할과 동일한 정책으로 가정 역할을 시도했지만 계정 B에서는 계정 B의 버킷에 대한 LIST 또는 GET 작업에 문제가 없었습니다. 따라서 해결 방법이 있지만 우리는 원래 설정이 작동하도록 할 수 있습니다.

이것은 내가받는 오류 메시지입니다.

botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the GetObject operation: Access Denied 
+0

올바른 일을하고있는 것 같습니다. 액세스에서 DENY를 유발할 수있는 정책 (두 계정 중 어느 하나)이 있습니까? 따라서 ALLOW를 무시합니다. 작동중인 LIST 코드와 작동하지 않는 GET 코드를 보여줄 수 있습니까? 수신중인 정확한 오류 메시지도 포함시킬 수 있습니까? (질문을 수정하여 세부 정보를 추가 할 수 있습니다.) –

답변

0

여기에 버킷을 소유하고 객체를 소유 소유자 객체 내가 AWS에서 가져온 응답 ....

S3에서, 우리는이 버킷 소유자이다. 개체 소유자가 개체에 대한 사용 권한을 부여하지 않는 한 개체 소유자와 떨어져있는 사람은 아무에게도 액세스 할 수 없습니다. 버킷 소유자 또는 버킷에 대한 권한을 부여받은 사용자는 버킷을 나열 할 수 있지만 읽기/쓰기 작업으로 인해 객체에 대한 액세스가 거부 될 수 있습니다. 객체 소유자는 문제의이 S3 객체에서 볼 수있는 --acl bucket-owner-full-control을 사용하여 버킷 소유자에게 권한을 부여 할 수 있습니다.

버킷 소유자가 소유하지 않은 개체는 버킷 정책이 상속하지 않습니다. 이 경우 버킷 소유자는 소유권을 얻기 위해 객체를 복사 할 수 있습니다. 이 작업이 완료되면 버킷 정책에 의해 액세스 권한이 부여 된 계정 C 또는 X는 개체에 액세스 할 수 있습니다.

여기에 대한 제 작품이 있습니다. 계정 B에서 역할 "XXX"를 만들고 계정 B의 s3 버킷에서 읽을 수있는 권한을 부여하십시오.

import boto3 
sts_client = boto3.client('sts') 
assumed_role_object = sts_client.assume_role(
     RoleArn="<ARN of role XXX>", 
     RoleSessionName="AssumeRoleSession1" 
    ) 
# From the response that contains the assumed role, get the temporary 
# credentials that can be used to make subsequent API calls 

credentials = assumed_role_object['Credentials'] 
s3_client = boto3.client(
    service_name='s3', 
    aws_access_key_id=credentials['AccessKeyId'], 
    aws_secret_access_key=credentials['SecretAccessKey'], 
    aws_session_token=credentials['SessionToken'] 
) 
response = s3_client.get_object(Bucket=self.bucket, Key=file_name) 
file_content = response['Body'].read().decode('utf-8')