AWS Lambda:Lambda 函数 S3 到 S3 复制的跨账户策略

2024-04-01

我们正在尝试实现 lambda 函数,该函数将根据源 S3 存储桶事件将对象从一个 S3 复制到跨账户中的另一个 S3 存储桶。目前,我们能够在同一 SAG 内的源和目标之间复制文件。但是当我们尝试跨账户实现相同的逻辑时,得到了 CopyObject 操作:Access Denied 问题。我已经给出了以下存储桶策略。您能否帮助我获取正确的 IAM 和存储桶策略来解决此问题。

{
    "Version": "2012-10-17",
    "Id": "Policy1603404813917",
    "Statement": [
        {
            "Sid": "Stmt1603404812651",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::6888889898:role/Staff"
            },
            "Action": [
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::source-bucktet-testing-lambda/*",
                "arn:aws:s3:::source-bucktet-testing-lambda"
            ]
        }
    ]
}

基于https://www.lixu.ca/2016/09/aws-lambda-and-s3-how-to-do-cross_83.htmllink ,是的,我们可以借助源和目标的访问 ID 和访问密钥来实现相同的逻辑。但我尝试实现相同的逻辑,而不是源和目标的访问 ID 和访问密钥,通过适当的策略授予源存储桶和目标存储桶的访问权限,并使其像同一帐户一样工作。


为了重现您的情况,我执行了以下操作:

  • In Account-A:
    • 创建了一个亚马逊 S3 存储桶 (Bucket-A)
    • 创建了一个IAM Role (Role-A)
    • 创建了一个AWS Lambda 函数 (Lambda-A)并分配Role-A到函数
    • 配置了一个亚马逊 S3 事件 on Bucket-A引起Lambda-A对于“所有对象创建事件”
  • In Account-B:
    • 创建了一个亚马逊 S3 存储桶 (Bucket-B)与存储桶策略(见下文)

IAM Role

Role-AAWSLambdaBasicExecutionRole托管策略,以及分配 Lambda 函数读取权限的内联策略Bucket-A并写信给Bucket-B:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket-a/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::bucket-b/*"
        }
    ]
}

目标存储桶的存储桶策略

桶政策Bucket-B允许从Role-AIAM 政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT-A:role/role-a"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::bucket-b/*"
        }
    ]
}

拉姆达函数

Lambda-A当对象被创建时触发Bucket-A,并将其复制到Bucket-B:

import boto3
import urllib

TARGET_BUCKET = 'bucket-b'

def lambda_handler(event, context):
    
    # Get incoming bucket and key
    source_bucket = event['Records'][0]['s3']['bucket']['name']
    source_key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'])

    # Copy object to different bucket
    s3_resource = boto3.resource('s3')
    copy_source = {
        'Bucket': source_bucket,
        'Key': source_key
    }
    target_key = source_key # Change if desired

    s3_resource.Bucket(TARGET_BUCKET).Object(target_key).copy(copy_source, ExtraArgs={'ACL': 'bucket-owner-full-control'})

I grant ACL=bucket-owner-full-control因为将对象复制到不同帐户拥有的存储桶有时会导致对象仍然由原始帐户“拥有”。使用此 ACL 向拥有目标存储桶的账户授予所有权。

Testing

我上传了一个文件到Bucket-A in Account-A.

文件已正确复制到Bucket-B in Account-B.

Comments

该解决方案确实NOT要求:

  • 存储桶策略Bucket-A, since Role-A授予必要的权限
  • 关闭S3 阻止公共访问,因为分配的权限不授予“公共”访问权限
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AWS Lambda:Lambda 函数 S3 到 S3 复制的跨账户策略 的相关文章

  • 输出和导出之间的区别

    在 CloudFormation 中 我们能够从模板输出一些值 以便其他进程 堆栈等可以检索它们 这通常是某个名称 可能是 URL 或在堆栈创建 部署 过程中生成的名称等 我们还能够从模板 导出 返回值作为 输出 与 导出 之间有什么区别
  • 在 RedShift 中声明变量

    SQL Server能够声明一个变量 然后在查询中调用该变量 如下所示 DECLARE StartDate date SET StartDate 2015 01 01 SELECT FROM Orders WHERE OrderDate g
  • 如何使用对象标记上传到 AWS S3

    有没有办法使用标签将文件上传到AWS S3 不将标签添加到S3中的现有文件 对象 我需要让该文件与我的 Tags 一起出现在 S3 中 即在单个 API 调用中 我需要这个 因为我使用 Lambda 函数 使用这些 S3 对象标签 由 S3
  • 如何在 PuTTY 中保存并运行 Java 文件?

    我是 AWS 亚马逊网络服务 的新手 所以这可能是一个基本问题 我在 AWS 上创建了一个 EC2 实例 我有一台 Windows 计算机 因此我使用 PUTTY 来连接 Linux 实例 连接到我的 EC2 实例后 我使用以下命令编写 J
  • 将 Django 部署到 AWS;傻瓜静态文件

    我对这个项目的最后一步完全迷失了 到目前为止 我已经能够开发一个 Django 应用程序 它可以在本地主机上按照我想要的方式工作 我已经能够将网站部署到 AWS EC2 但我一定错过了有关提供静态文件的一些基本知识 我什至还没有尝试过媒体文
  • 如何使用 AWS Glue 开始处理从 Web 服务终端节点提取的数据?

    更多源数据来自我需要定期轮询的 Web 服务端点 获得数据后 我可以使用 pyspark 执行传统的 ETL 并最终将数据写入 S3 和 Redshift 我不确定如何进行初始提取 甚至不确定我应该在 AWS Glue 文档中查找什么内容
  • 将密钥对添加到现有 EC2 实例

    我被给予AWS控制台访问正在运行 2 个实例的帐户 但我无法关闭 在生产中 但是 我想获得对这些实例的 SSH 访问权限 是否可以创建一个新的密钥对并将其应用到实例 以便我可以通过 SSH 访问 获取现有的pem当前无法选择创建实例所用的密
  • Amazon S3:静态网站:自定义域或子域

    Amazon com 刚刚宣布可以在 S3 存储桶中托管静态网站 我访问了他们的设置页面http docs amazonwebservices com AmazonS3 latest dev index html WebsiteHostin
  • X-Amz-Expires 是向 AWS 发出的请求所需的标头/参数吗?

    Is X Amz Expires必需的标头 参数 官方文档不一致 用在一些例子 http docs aws amazon com AmazonS3 latest API sigv4 query string auth html 虽然不在ot
  • AWS Lambda 提前结束(没有任何显式返回或回调)

    我在放入 AWS Lambda 中的一些 Node js 代码时遇到了一些问题 我需要进行几个异步调用 虽然第一个调用的行为符合我的预期 但 lambda 函数在第二个调用完成之前终止 返回值为 null 这让我认为 lambda 正在执行
  • 如何使用具有自定义身份验证的 AWS cognito 创建临时 s3 上传安全令牌

    因此 我对 Cognito 的 Amazon 文档中有关其声明的用例之一的内容感到有点困惑 使用您自己的身份系统 允许您的应用程序将数据保存到 AWS 云 就我而言 我想给他们 aws 令牌 以便他们从移动客户端直接上传到 s3 而无需将我
  • 在 Azure 上运行 .NET 应用程序

    我拥有在 Amazon EC2 上运行应用程序的丰富经验 它需要一台低端服务器 我目前为该服务器支付大约 90 美元 月 是的 我知道我并不真正需要可扩展性 但我仍然使用 EC2 我想知道将这个纯粹的 NET 应用程序迁移到 Microso
  • 今天从 GitHub 操作构建 SAM 突然失败:模块“lib”没有属性“OpenSSL_add_all_algorithms”

    昨天 我的 SAM 构建正在使用以下 GitHub 操作 今天突然开始失败并出现错误 AttributeError 模块 lib 没有属性 OpenSSL add all algorithms 经我验证 SAM 模板没有任何错误 还有其他人
  • 无法使用 aws 无服务器离线从另一个 lambda 调用 lambda

    我想从 serverless offline 内的另一个 lambda 调用 lambda 我想创建一个无服务器离线 Web 应用程序 但我收到此错误 UnknownError 不支持的媒体类型 在 Object extractError
  • 如何在 Elastic Beanstalk 上添加 PATH

    我想将 PATH 添加到包上eb deploy 软件包安装到 var www html vendor bin 可以通过SSH手动添加 但是如何使用配置文件添加PATH 我有这样的配置文件 ebextensions ec2 config 01
  • AWS cognito 用户迁移池触发器不适用于登录流程

    我正在使用带有认知执行角色的 Lambda 函数进行 AWS 认知池迁移 以下是我的新池应用程序客户端设置 or AWS doc says 用户迁移身份验证流程 用户迁移 Lambda 触发器 允许从旧用户管理系统轻松迁移用户 进入您的用户
  • 从 S3 提供 Django 的静态文件和媒体文件

    我遇到了一个奇怪的问题 我不知道是什么原因造成的 这是我当前的配置 使用Heroku MEDIA URL media STATIC URL static STATICFILES DIRS os path join PROJECT DIR s
  • kafka 连接 s3 源无法与 Minio 一起使用

    我已经验证了与 minio 的连接 确保凭据工作正常并且可以访问 minio 另外 如果我尝试任何其他值store url http minio 9000我无法保存配置 所以我猜想在可见性方面不存在问题卡夫卡连接容器和minio容器 我不确
  • AWS Cloudfront 作为具有自定义域的 Heroku 站点的 CDN

    最近 我从 AWS Route 53 brianpatrickhummel com 购买了一个域来托管个人投资组合 该投资组合网站已启动并正在运行 使用 S3 存储桶和 Cloudfront 作为 CDN 在作品集网站上 访问者可以预览我构
  • 从 AWS lambda 函数更新 Amplify 数据存储

    在我的应用程序中 有一个功能 当我们在 s3 中上传文件时 会调用相关的 AWS Lambda 触发器 当 Lambda 函数触发时 我想将文件相关数据存储在 AWS Amplify 数据存储中 是否可以在 Lambda 函数中访问 AWS

随机推荐