使用AWS Lambda中的Boto3将一个帐户中的S3存储桶复制到另一个帐户中的S3存储桶

时间:2018-08-08 03:55:41

标签: python python-3.x amazon-s3 aws-lambda boto3

我已经创建了一个S3存储桶,并在aws帐户下创建了一个文件。我的帐户与另一个帐户建立了信任关系,我可以使用Boto3将对象放入另一个帐户的存储桶中。如何使用Boto3将对象从帐户中的存储桶复制到另一个帐户中的存储桶?

使用以下代码时,我看到“访问被拒绝”-

source_session = boto3.Session(region_name = 'us-east-1')
    source_conn = source_session.resource('s3')
    src_conn = source_session.client('s3')
    dest_session = __aws_session(role_arn=assumed_role_arn, session_name='dest_session')
    dest_conn = dest_session.client ( 's3' )

    copy_source = { 'Bucket': bucket_name , 'Key': key_value }
    dest_conn.copy ( copy_source, dest_bucket_name , dest_key,ExtraArgs={'ServerSideEncryption':'AES256'}, SourceClient = src_conn )

就我而言,src_conn可以访问源存储桶,dest_conn可以访问目标存储桶。

我相信通过下载和上传文件来实现这一目标的唯一方法。

AWS会话

client = boto3.client('sts')
            response = client.assume_role(RoleArn=role_arn, RoleSessionName=session_name)
            session = boto3.Session(
                aws_access_key_id=response['Credentials']['AccessKeyId'],
                aws_secret_access_key=response['Credentials']['SecretAccessKey'],
                aws_session_token=response['Credentials']['SessionToken'])

1 个答案:

答案 0 :(得分:0)

另一种方法是将策略附加到目标存储桶,以允许从托管源存储桶的帐户进行访问。例如。如下所示的内容应该可以工作(尽管您可能需要适当地加强权限):

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<source account ID>:root" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::dst_bucket", "arn:aws:s3:::dst_bucket/*" ] } ] }

然后,在源AWS账户中托管的Lambda写入目标AWS账户中的存储桶应该没有问题。