You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lambda报错:Bucket名称不符合正则规则,请求协助排查

解决S3到DynamoDB Lambda复制的ParamValidationError错误

问题现象

执行Lambda将S3中的JSON文件写入DynamoDB时,触发如下参数验证错误:

{
  "errorMessage": "Parameter validation failed:\nInvalid bucket name \"s3://cleandataemr/data_EMR/df_annonceur5.json/\": Bucket name must match the regex \"^[a-zA-Z0-9.\\-_]{1,255}$\" or be an ARN matching the regex \"^arn:(aws).*:(s3|s3-object-lambda):[a-z\\-0-9]*:[0-9]{12}:accesspoint[/:][a-zA-Z0-9\\-.]{1,63}$|^arn:(aws).*:s3-outposts:[a-z\\-0-9]+:[0-9]{12}:outpost[/:][a-zA-Z0-9\\-]{1,63}[/:]accesspoint[/:][a-zA-Z0-9\\-]{1,63}$\"",
  "errorType": "ParamValidationError"
}

错误原因

测试事件中的s3.bucket.name字段填写错误:你填入了带s3://前缀和对象路径的完整地址s3://cleandataemr/data_EMR/df_annonceur5.json/,但AWS要求S3桶名只能是纯名称(如cleandataemr),不能包含协议前缀或路径,该值不符合boto3的参数验证规则。

同时测试事件中的s3.bucket.arn格式也错误,正确的S3桶ARN格式为arn:aws:s3:::bucket-name,对象路径属于对象key的部分,不应包含在桶ARN里。

解决方案

1. 修正测试事件

将测试事件中的s3.bucket.name改为纯桶名cleandataemr,并修正s3.bucket.arn为正确格式。修正后的测试事件如下:

{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventSource": "aws:s3",
      "awsRegion": "eu-west-3",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "responseElements": {
        "x-amz-request-id": "EXAMPLE123456789",
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "testConfigRule",
        "bucket": {
          "name": "cleandataemr",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          },
          "arn": "arn:aws:s3:::cleandataemr"
        },
        "object": {
          "key": "data_EMR/df_annonceur5.json/part-00000-19cabb09-baed-4015-9b3a-0d9422720b82-c000.json",
          "size": 1024,
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901"
        }
      }
    }
  ]
}

2. Lambda代码优化(可选)

原代码中使用ast.literal_eval解析JSON字符串,建议替换为json.loads,后者是专门用于JSON解析的标准方法,安全性和兼容性更好:

import boto3
import json

s3_client = boto3.client('s3')
dynamodb_client = boto3.resource('dynamodb')

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    json_file_name = event['Records'][0]['s3']['object']['key']
    
    json_object = s3_client.get_object(Bucket=bucket, Key=json_file_name)
    file_reader = json_object['Body'].read().decode("utf-8")
    # 替换ast.literal_eval为json.loads
    file_reader = json.loads(file_reader)
    
    table = dynamodb_client.Table('Annonceur')
    table.put_item(Item=file_reader)
    return 'success'

内容的提问来源于stack exchange,提问作者Inès Boucher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:24:30