【问题标题】:Copying S3 bucket file to secondary bucket?将 S3 存储桶文件复制到辅助存储桶?
【发布时间】:2019-08-07 20:36:28
【问题描述】:

问题:当我运行以下 AWS Lambda 代码时,我的访问被拒绝:

require 'json'
require "aws-sdk-s3"

def lambda_handler(event:, context:)
    client = Aws::S3::Client.new(region: 'us-east-2')

    record = event["Records"][0]
    key = record.dig *%w(s3 object key)

    client.copy_object({
      bucket: "bucket-name", 
      copy_source: "#{key}", 
      key: "#{key}", 
    })

end

错误:

"errorType": "Function<Aws::S3::Errors::AccessDenied>",

我的 IAM 角色:

  • AmazonS3FullAccess:AWS 托管策略

  • AWSLambdaBasicExecutionRole-e41b74ba-3cef-4470-8f1c-3f900591016c:托管策略

  • AWSConfigRulesExecutionRole

这不是很好吗?

lambda 的目的是获取上传到存储桶的文件并将它们复制到另一个存储桶。

【问题讨论】:

  • 两个存储桶是否属于同一个 AWS 账户?
  • 是的,我实际上刚刚更新了它并且它可以工作。在下面检查我的答案:)

标签: ruby amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

由于代码在 AWS Lambda 中运行,因此您的 IAM 角色权限不会影响代码执行。在这种情况下,Lambda 执行角色需要具有 S3 权限。

您需要创建一个具有所需权限的新角色,并将 Lambda 执行角色更新为新创建的角色。

【讨论】:

  • 我添加了 AmazonDMSRedshiftS3Role AWS 托管策略 AWSLambdaFullAccess AWS 托管策略 AmazonS3FullAccess AWS 托管策略 QuickSightAccessForS3StorageManagementAnalyticsReadOnly AWS 托管策略 AmazonS3ReadOnlyAccess AWS 托管策略 AWSLambdaBasicExecutionRole-e41b74ba-355-4470-8f1c-3f91134655016c 托管策略 AWSConfigRules
  • 还是没有通过!
  • Lambda 函数的执行角色是什么?那有 S3 权限吗?
  • 欢迎吉丘。 @jeechu duka 这是你上面的评论。我什至完成了角色权限,它仍然无法正常工作。代码本身没问题吗?
  • 这只是对存储桶的访问。如果我将存储桶的名称更改为不存在的名称,它会让我知道存储桶不存在。我不知道为什么它不允许我进去。我已经清除了几乎所有东西。
【解决方案2】:
require 'json'
require "aws-sdk-s3"

def lambda_handler(event:, context:)
    client = Aws::S3::Client.new(region: 'us-east-2')

    record = event["Records"][0]
    key = record.dig *%w(s3 object key)

    client.copy_object({
      bucket: "bucket-name", 
      copy_source: "#{key}", 
      key: "#{key}", 
    })

end

需要:

require 'json'
require "aws-sdk-s3"

    def lambda_handler(event:, context:)
        client = Aws::S3::Client.new(region: 'us-east-2')

        record = event["Records"][0]
        key = record.dig *%w(s3 object key)

        client.copy_object({
          bucket: "bucket-name", 
          copy_source: "/bucketname/#{key}", 
          key: "#{key}", 
        })

    end

必须指定存储桶名/文件名的来源

【讨论】:

    【解决方案3】:

    copy_object() 命令需要:

    • 源存储桶
    • 来源键
    • 目标存储桶
    • 目标键

    您的代码仅引用一个存储桶名称并且使用相同的密钥。

    文档显示:

    resp = client.copy_object({
      bucket: "destinationbucket", 
      copy_source: "/sourcebucket/HappyFace.jpg", 
      key: "HappyFaceCopyjpg", 
    })
    

    您会注意到copy_source 包含源存储桶名称。

    【讨论】:

      猜你喜欢
      • 2017-11-23
      • 2022-01-07
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2018-01-01
      • 1970-01-01
      相关资源
      最近更新 更多