2017-12-22 28 views
0

s3とロールがアカウント間でどのように機能するかに関する質問があります。私は自分のラムダを想定してみると、別のアカウントのs3バケットにアクセスしようとしました。私はGetObjectオペレーションを取得します:アクセスが拒否されました

私は、アカウントAの役割を持つラムダ機能と、ラムダ機能がアクセスする必要があるアカウントBのバケットを持っている状況があります。アカウントAの役割は、アカウントBのバケットに対するs3:*権限を持っています。アカウントBのバケットにプリンシパルを設定して、アカウントAの役割を受け入れるようにしました。バケットポリシーでは、バケットのs3:*も可能です。以下のようなもの。

アカウント役割:

{ 
    "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では、アカウントBのバケツでLISTまたはGETの動作に問題はありませんでした。回避策はありますが、元のセットアップが動作するようになります。

これは私が得ているエラーメッセージです。ここで

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

あなたは正しいことをしているようです。アクセスの拒否を引き起こす可能性のあるポリシーが(どちらのアカウントでも)存在するため、ALLOWをオーバーライドしていますか?動作しているLISTコードと動作していないGETコードを表示できますか?受け取っている正確なエラーメッセージも含めることができますか? (これらの詳細を追加するには質問を編集できます) –

答えて

0

は、私がAWSから得た応答が.... S3で

で、我々はオブジェクトを所有するバケットとオブジェクトの所有者を所有しているバケット所有者を持っています。オブジェクト所有者がオブジェクトへのアクセス権を与えない限り、オブジェクト所有者以外の誰もそのオブジェクトにアクセスできません。バケツの所有者またはバケットに許可を与えられた人はバケツをLISTできますが、読み取り/書き込み操作ではオブジェクトに対して403アクセスが拒否されます。 オブジェクト所有者は、問題のこの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') 
関連する問題