将S3存储桶文件复制到辅助存储桶?

时间:2019-03-17 08:08:37

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

问题:运行以下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的目的是将上载到存储桶的文件复制到另一个存储桶。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

必须指定源,这是存储区名称/文件名

答案 2 :(得分:0)

copy_object()命令要求:

  • 源存储桶
  • 源密钥
  • 目的地桶
  • 目的地键

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

文档显示:

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

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