使用boto3和python在S3存储桶中跨账户文件上传

use*_*443 1 python amazon-s3 amazon-web-services boto3

我有一个带有给定access_key和的 S3 存储桶secret_access_key。我使用以下代码成功将文件上传到我的 S3 存储桶中。

import boto3
import os

client = boto3.client('s3',
                        aws_access_key_id = access_key,
                        aws_secret_access_key = secret_access_key)

upload_file_bucket = 'my-bucket'
upload_file_key = 'my_folder/' + str(my_file)
client.upload_file(file, upload_file_bucket, upload_file_key)

Run Code Online (Sandbox Code Playgroud)

现在,我想将 my_file 上传到新团队拥有的另一个存储桶中。因此,我无权访问access_key和secret_access_key。使用 boto3 和 Python 进行跨账户文件上传的最佳实践是什么?

Joh*_*ein 7

您实际上可以使用相同的代码,但另一个 AWS 账户的所有者需要将存储桶策略添加到允许您的 IAM 用户访问的目标存储桶。它看起来像这样:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::their-bucket/*",
      "Principal": {
        "AWS": [
          "arn:aws:iam::YOUR-ACCOUNT-ID:user/username"
        ]
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

将对象上传到另一个 AWS 账户拥有的存储桶时,我建议添加ACL= bucket-owner-full-control ,如下所示:

client.upload_file(file, upload_file_bucket, upload_file_key, ExtraArgs={'ACL':'bucket-owner-full-control'})
Run Code Online (Sandbox Code Playgroud)

这会将对象的所有权授予存储桶所有者,而不是上传的帐户。