如何使用 boto3 在 2 个不同帐户的 S3 存储桶之间复制文件

2023-11-23

我正在尝试使用 boto3 将文件从供应商 S3 存储桶传输到我的 S3 存储桶。我正在使用 sts 服务来承担访问供应商 s3 存储桶的角色。我能够连接到供应商存储桶并获取存储桶的列表。我遇到CopyObject operation: Access Denied复制到我的存储桶时出错。这是我的脚本

session = boto3.session.Session(profile_name="s3_transfer")
sts_client = session.client("sts", verify=False)
assumed_role_object = sts_client.assume_role(
    RoleArn="arn:aws:iam::<accountid>:role/assumedrole",
    RoleSessionName="transfer_session",
    ExternalId="<ID>",
    DurationSeconds=18000,
)

creds = assumed_role_object["Credentials"]
src_s3 = boto3.client(
    "s3",
    aws_access_key_id=creds["AccessKeyId"],
    aws_secret_access_key=creds["SecretAccessKey"],
    aws_session_token=creds["SessionToken"],
    verify=False,
)
paginator =src_s3.get_paginator("list_objects_v2")
# testing with just 2 items.
# TODO: Remove MaxItems once script works.
pages = paginator.paginate(
    Bucket="ven_bucket", Prefix="client", PaginationConfig={"MaxItems": 2, "PageSize": 1000}
)
dest_s3 = session.client("s3", verify=False)
for page in pages:
    for obj in page["Contents"]:
        src_key = obj["Key"]
        des_key = dest_prefix + src_key[len(src_prefix) :]
        src = {"Bucket": "ven_bucket", "Key": src_key}
        print(src)
        print(des_key)
        dest_s3.copy(src, "my-bucket", des_key, SourceClient=src_s3)

线路dest_s3.copy...这是我收到错误的地方。我的 aws 用户有以下政策,允许复制到我的存储桶

{
    "Version": "2012-10-17",
   "Statement": [
    {
        "Sid": "VisualEditor1",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::my-bucket/*",
            "arn:aws:s3:::my-bucket/"
        ]
    }
    ]
}

运行上述脚本时出现以下错误。

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


The CopyObject()命令可用于在存储桶之间复制对象,而无需上传/下载。基本上,两个 S3 存储桶相互通信并传输数据。

此命令还可用于在不同区域和不同 AWS 账户的存储桶之间进行复制。

如果您想在之间复制属于不同AWS账户的存储桶,那么你将需要使用单组凭证具有:

  • GetObject源存储桶的权限
  • PutObject目标存储桶的权限

另请注意,CopyObject()命令是发送至目的地账户。目标桶有效从源存储桶中拉取对象.

根据你的描述,你的代码是承担其他帐户的角色获得源存储桶的读取权限。不幸的是,这对于CopyObject()命令,因为该命令必须发送到目标桶。 (是的,从文档中辨别这一点有点困难。这就是为什么专门命名源存储桶,而不是目标存储桶。)

因此,在您的情况下,为了能够复制对象,您将需要使用一组凭据Account-B(目的地)也有读取权限Bucket-A(来源)。这将要求供应商修改桶策略有关联Bucket-A.

如果他们不想这样做,那么您唯一的选择就是使用假定的角色下载对象然后使用您自己的凭据将文件分别上传到您自己的存储桶Account-B.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 boto3 在 2 个不同帐户的 S3 存储桶之间复制文件 的相关文章

随机推荐

  • “找不到 CFBundle/CFPlugIn 的可执行文件”错误

    找不到 CFBundle CFPlugIn 0x432bfa0 的可执行文件 未加载 在 CFBundle CFPlugIn 0x432bfa0 中找不到工厂 C5A4CE5B 0BB8 11D8 9D75 0003939615B6 的函数
  • jqGrid - 动态设置标题

    我有captionjqGrid 定义中的参数集 我想知道是否有一种方法可以根据情况动态设置它classjqGrid 插件所附加的表元素的属性 HTML 1 table class view table div div HTML 2 tabl
  • 在 Linux 机器上创建自解压 zip 存档

    由于许多我不会涉及的限制 我必须在 Linux 机器上创建一个自解压 ZIP 存档 生成的存档只能在 Windows 上执行 这是可能吗 如果是这样 什么工具可以完成这项工作 背景 当用户从我的 Linux 盒子下载安装包时 我需要使用某个
  • 如果在单独的类中定义异常子句,Camel 异常处理将不起作用

    我正在尝试构建一个具有多个骆驼路线的应用程序 这些路线在内部重用许多常见路线 因此 我尝试将路由分隔在几个不同的路由生成器类中 然后在需要的地方连接路由 例如 与发送电子邮件有关的所有路由都进入 EmailRouteBuilder 类 而处
  • 使用 Laravel (Localhost) 通过表单将文件发送到电子邮件

    Laravel 新手 所以要友善 哈哈 我的 mail php 配置是正确的 并且可以成功接收电子邮件以进行 gmail 的文本输入 但不确定如何完成文件任务 我希望得到一些帮助或参考链接 提前致谢 代码在routes php中 Route
  • iOS 8 CoreBluetooth 已弃用 RSSI 方法

    所以从阅读CBPeripheralDelegate文档 看来RSSI and peripheralDidUpdateRSSI error iOS 8 中已弃用 Xcode 警告 iOS 8 0 中已弃用 rssi 我注意到我的信号强度指示器
  • 测量 Cortex m7 上的时钟周期数

    我一直在测量 Cortex m4 上的时钟周期计数 现在想在 Cortex m7 上进行测量 我使用的板子是STM32F746ZG 对于 m4 一切都适用 volatile unsigned int DWT CYCCNT volatile
  • R光栅包将图像分割成多个

    我有一个如下图 它是2579 2388像素 假设它的左下角位于 0 0 我想从该图像创建多个图像 如下所示并将它们保存在工作文件夹中 每个图像的大小为 100 100 像素 每个图像将通过其左下角坐标保存 第一张图像的左下角位于 0 0 右
  • 将通用列表转换为 CSV 字符串

    我有一个整数值列表 List 并且想生成一串逗号分隔值 即列表中的所有项目输出到单个逗号分隔列表 我的想法 1 将列表传递给方法 2 使用stringbuilder迭代列表并追加逗号 3 测试最后一个字符 如果是逗号 则将其删除 你怎么看
  • 在 dataclass(slots=True) 子类中调用 super() 时出现类型错误

    我试图从数据类调用超类方法slots True在 Python 3 10 5 中 from dataclasses import dataclass dataclass slots True class Base def hi self p
  • TK框架双重实现问题

    我正在测试使用 Tkinter 模块创建 GUI 我试图使用 PIL 将图像添加到 GUI 我的代码如下所示 import Tkinter as tk from PIL import Image ImageTk root tk Tk roo
  • 未找到活动数据。使用谷歌分析 v4

    我收到此错误 I GAV4 7915 Thread GAThread 5 main 未找到活动数据 有人知道我出了什么问题吗 我正在使用 Android API 级别 20 谷歌分析 v4 安卓设备4 2 2 Constants TRACK
  • 对 HTML 实体进行编码但忽略 HTML 标签 - 在 PHP 中

    我有一个可能看起来像这样的字符串 str p Me Mrs Jones br live in strong style color FFF Espa a strong p htmlentities str ENT COMPAT UTF 8
  • 在node.js中使用formidable和express时如何更改上传路径

    实际上我遇到了两个问题 一 如何更改上传路径 我的文件夹结构是这样的 app js upload 我的节点代码位于 app js 中并从中启动 所以我想将上传图片上传到上传文件夹 我更改路径 var form new formidable
  • iOS 11 禁用密码自动填充附件视图选项?

    截至目前 我想选择退出 iOS 11 提供的新选项 即在应用程序中建议密码 当我在 iOS 11 上运行该应用程序时 我在键盘顶部看到自动填充选项 但我的用户名和密码文本字段甚至不显示 所以 我的问题是 如何一起禁用新密码自动填充功能 以便
  • WPF 中的 DialogResult 与FolderBrowserDialog

    我第一次在 WPF 中实现FolderBrowserDialog 但我一点也不喜欢它 除了我发现我的项目中没有引用 Windows Forms 的问题之外 现在我在尝试查看 DialogResult 返回值是什么时遇到了麻烦 对于 Open
  • MSBuild如何找到Delphi搜索路径?

    如果我启动 RAD Studio 命令提示符并运行 msbuild t Rebuild 在项目目录中 msbuild 将显示调用 dcc32 的完整命令行 包括所有路径设置 MSBuild 使用哪种魔法来根据 IDE 设置 存储在注册表中
  • 多次加密(MD5)可以提高安全性吗?

    我看到有人用 MD5 对用户密码进行多次加密以提高安全性 我不确定这是否有效 但看起来不太好 那么 这有意义吗 我们假设您使用的哈希函数是一个完美的单向函数 然后你可以像查看它的输出一样查看它的输出 随机神谕 其输出值在有限的值范围内 MD
  • Titanium appcelerator 是否值得在 ipad、iphone 和 android 上开发基于相机的应用程序? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我想构建一个手机 平板电脑应用程序 其核心功能是用相机拍照 查看图片和接收通知 我还想针对 iphone ipad 和 android 平台 Titanium appcelerator 因
  • 如何使用 boto3 在 2 个不同帐户的 S3 存储桶之间复制文件

    我正在尝试使用 boto3 将文件从供应商 S3 存储桶传输到我的 S3 存储桶 我正在使用 sts 服务来承担访问供应商 s3 存储桶的角色 我能够连接到供应商存储桶并获取存储桶的列表 我遇到CopyObject operation Ac