boto3 - AWS Lambda - 在存储桶之间复制文件

5
我正在尝试使用AWS Lambda将源存储桶中的多个文件复制到目标存储桶,但出现以下错误。 存储桶结构如下:

源存储桶

mysrcbucket/Input/daily/acctno_pin_xref/ABC_ACCTNO_PIN_XREF_FULL_20170926_0.csv.gz     mysrcbucket/Input/daily/acctno_pin_xref/ABC_ACCTNO_PIN_XREF_FULL_20170926_1.csv.gz     mysrcbucket/Input/daily/acctno_pin_xref/ABC_ACCTNO_PIN_XREF_count_20170926.inf

目标存储桶

mydestbucket/Input/daily/acctno_pin_xref/ABC_ACCTNO_PIN_XREF_FULL_20170926_0.csv.gz

mydestbucket/Input/daily/acctno_pin_xref/ABC_ACCTNO_PIN_XREF_FULL_20170926_1.csv.gz     mydestbucket/Input/daily/acctno_pin_xref/ABC_ACCTNO_PIN_XREF_count_20170926.inf

我编写了下面的Lambda函数,但是出现了以下错误。 请问我做错了什么。
{   "errorMessage": "expected string or bytes-like object",   "errorType": "TypeError",   "stackTrace": [
    [
      "/var/task/lambda_function.py",
      17,
      "lambda_handler",
      "s3.Object(dest_bucket,dest_key).copy_from(CopySource= { 'Bucket': obj.bucket_name , 'Key' : obj.key})"
    ],
    [
      "/var/runtime/boto3/resources/factory.py",
      520,
      "do_action",
      "response = action(self, *args, **kwargs)"
    ],
    [
      "/var/runtime/boto3/resources/action.py",
      83,
      "__call__",
      "response = getattr(parent.meta.client, operation_name)(**params)"
    ],
    [
      "/var/runtime/botocore/client.py",
      312,
      "_api_call",
      "return self._make_api_call(operation_name, kwargs)"
    ],
    [
      "/var/runtime/botocore/client.py",
      575,
      "_make_api_call",
      "api_params, operation_model, context=request_context)"
    ],
    [
      "/var/runtime/botocore/client.py",
      627,
      "_convert_to_request_dict",
      "params=api_params, model=operation_model, context=context)"
    ],
    [
      "/var/runtime/botocore/hooks.py",
      227,
      "emit",
      "return self._emit(event_name, kwargs)"
    ],
    [
      "/var/runtime/botocore/hooks.py",
      210,
      "_emit",
      "response = handler(**kwargs)"
    ],
    [
      "/var/runtime/botocore/handlers.py",
      208,
      "validate_bucket_name",
      "if VALID_BUCKET.search(bucket) is None:"
    ]   ] }

Lambda函数代码

import boto3
import json
s3 = boto3.resource('s3')



def lambda_handler (event, context):
 bucket = s3.Bucket('mysrcbucket')
 dest_bucket=s3.Bucket('mydestbucket')
 print(bucket)
 print(dest_bucket)

for obj in bucket.objects.filter(Prefix='Input/daily/acctno_pin_xref/ABC_ACCTNO_PIN_XREF',Delimiter='/'):

  dest_key=obj.key
  print(dest_key)
  s3.Object(dest_bucket,dest_key).copy_from(CopySource= { 'Bucket': obj.bucket_name , 'Key' : obj.key})

你的代码似乎格式不正确,缩进应该是 for obj in bucket.objects。这段代码必须放在 lambda_handler 下面。 - Bui Anh Tuan
1个回答

4
问题出在:
s3.Object(dest_bucket, dest_key).copy_from(CopySource= {'Bucket': obj.bucket_name, 
                                                        'Key': obj.key})

dest_bucket更改为dest_bucket.name

s3.Object(dest_bucket.name, dest_key).copy_from(CopySource= {'Bucket': obj.bucket_name,
                                                             'Key': obj.key})

dest_bucket 是一个资源,name 是其标识符。


下载文件时遇到同样的问题,不确定为什么之前可以正常工作... :( - Laxmikant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接