amazon-web-services - 无法制作 S3 对象,使用 Lambda 从另一个账户上的 S3 存储桶复制,公共(public)

标签 amazon-web-services go amazon-s3 aws-lambda

我使用以下“go”代码 (Lambda) 将文件“Sample.txt”从一个账户的 S3 存储桶复制到另一个账户的 S3 存储桶。它按预期工作,即它从源存储桶复制“Sample.txt”并在目标存储桶中上传“NewSample.txt”。但是,我无法在目标存储桶中创建“NewSample.txt”文件 公众 .因此,我无法打开/下载该文件。这是因为目标存储桶中“NewSample.txt”文件的所有者仍与源存储桶中“Sample.txt”文件的所有者相同。如果我手动在目标存储桶中上传另一个文件,我可以看到新文件有不同的所有者。您能否让我知道如何将文件从 S3 复制到另一个帐户中的 S3(目标存储桶中有所有者)?

package main

import (
    "fmt"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/awserr"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

// main comment
func main() {
    svc := s3.New(session.New())
    input := &s3.CopyObjectInput{
        Bucket:     aws.String("target-bucket"),
        CopySource: aws.String("/source-bucket/Sample.txt"),
        Key:        aws.String("NewSample.txt"),
    }
    result, err := svc.CopyObject(input)
    if err != nil {
        if aerr, ok := err.(awserr.Error); ok {
            switch aerr.Code() {
            case s3.ErrCodeObjectNotInActiveTierError:
                fmt.Println(s3.ErrCodeObjectNotInActiveTierError, aerr.Error())
            default:
                fmt.Println(aerr.Error())
            }
        } else {
            fmt.Println(err.Error())
        }
        return
    }

    fmt.Println(result)
}

更新#1:

NewSample.txt --> 概览选项卡 --> 服务器端加密 = 拒绝访问

更新#2:

我使用了以下存储桶策略
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Test",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<SourceAccountId>:role/<LambdaRole>"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::target-bucket/*",
                "arn:aws:s3:::target-bucket"
            ]
        }
    ]
}

更新#3:

- arn:aws:iam::<SourceAccountId>:role/<LambdaRole> 的政策摘要:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::source-bucket/*",
                "arn:aws:s3:::target-bucket/*"
            ]
        }
    ]
}

更新#4:

正如@John Rotenstein 在他的评论中所说,我在目标存储桶所在的账户中创建了一个 Lambda(使用完全相同的“go”代码但没有 ACL),并在源存储桶中添加了以下存储桶策略:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Test",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<TargetAccountId>:role/<LambdaRole>"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::source-bucket/*",
                "arn:aws:s3:::source-bucket"
            ]
        }
    ]
}

这一次,在不使用 ACL 的情况下,我可以从目标帐户访问对象,因为我们正在从另一个帐户“拉”出对象。此外,本地 AWS(目标)账户这次是 NewSample.txt 文件的所有者。

更新#5:

- arn:aws:iam::<TargetAccountId>:role/<LambdaRole> 的政策摘要:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::source-bucket/*",
                "arn:aws:s3:::target-bucket/*"
            ]
        }
    ]
}

最佳答案

我通过添加 ACL 解决了这个问题,如下所示:

input := &s3.CopyObjectInput{
        Bucket:     aws.String("target-bucket"),
        CopySource: aws.String("/source-bucket/Sample.txt"),
        Key:        aws.String("NewSample.txt"),
        ACL:        aws.String("bucket-owner-full-control"),
    }

关于amazon-web-services - 无法制作 S3 对象,使用 Lambda 从另一个账户上的 S3 存储桶复制,公共(public),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59408787/

相关文章:

amazon-web-services - 如何从 VSCode 更新我的 AWS Lambda 函数?

azure - Azure/AWS/IBM 虚拟机中的防火墙?

php - 如何在PHP中将图像从内存上传到AWS S3?

amazon-web-services - 使用 AWS EC2 实例提高上传速度

http-headers - 无法删除响应 header 中的服务器(Amazon AWS)

Python Flask-如何在将图像上传到 Amazon s3 之前读取图像的大小

go - 如何恢复循环中调用的多个go例程的输入

go - 为什么 go 方法接收者应该保持一致?

string - 将字符串转换为 Foo(类型字符串)

amazon-s3 - 将 Hive 表导出到 S3 存储桶