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

能否通过AWS EventBridge输入转换器转义S3对象键字符生成有效URL?

问题:S3文件上传EventBridge通知的URL特殊字符转义需求

已配置AWS EventBridge规则,当文件上传至S3时向SNS主题发送通知,供无S3常规权限的相关方访问批处理生成的文件。但文件名包含日文、空格等特殊字符,当前输入转换器生成的URL会在邮件客户端中因特殊字符截断,无法正常识别。

示例事件

{
  "version": "0",
  "detail-type": "Object Created",
  "source": "aws.s3",
  "time": "2021-11-12T00:00:00Z",
  "region": "ap-northeast-1",
  "resources": ["arn:aws:s3:::example-bucket"],
  "detail": {
    "version": "0",
    "bucket": {
      "name": "example-bucket"
    },
    "object": {
      "key": "exampleテスト.zip",
      "size": 5,
      "etag": "b1946ac92492d2347c6235b4d2611184",
      "version-id": "IYV3p45BT0ac8hjHg1houSdS1a.Mro8e",
      "sequencer": "00617F08299329D189"
    },
    "request-id": "N4N7GDK58NMKJ12R",
    "requester": "123456789012",
    "source-ip-address": "1.2.3.4",
    "reason": "PutObject"
  }
}

当前输入转换器配置

{
  "message": "Batch job report has finished",
  "URL": "https://<bucket>.s3.ap-northeast-1.amazonaws.com/<objectKey>"
}

需要实现特殊字符转义,生成如下编码后的URL是否可行?

{
  "message": "Batch job report has finished",
  "URL": "https://example-bucket.s3.ap-northeast-1.amazonaws.com/example%E3%83%86%E3%82%B9%E3%83%88.zip"
}

解决方案

可行,有两种常用实现方式:

方式1:使用EventBridge输入转换器的内置编码函数

EventBridge输入转换器支持encodeURIComponent()内置函数,可直接对特殊字符进行URL编码,修改输入转换器配置即可:

修改后的输入转换器配置

{
  "message": "Batch job report has finished",
  "URL": "https://<detail.bucket.name>.s3.ap-northeast-1.amazonaws.com/${encodeURIComponent(<detail.object.key>)}"
}

注意:需使用完整路径引用detail.bucket.name和detail.object.key,通过${encodeURIComponent(...)}包裹对象键,自动完成URL编码。

方式2:通过Lambda中间处理

如果需要更复杂的编码逻辑,可通过Lambda中转处理:

  1. 调整EventBridge规则,将事件发送到Lambda函数
  2. 在Lambda中对S3对象键进行URL编码,拼接成合法URL
  3. 将处理后的消息发送到SNS主题

示例Lambda代码(Python):

import urllib.parse
import boto3

sns = boto3.client('sns')

def lambda_handler(event, context):
    bucket_name = event['detail']['bucket']['name']
    object_key = event['detail']['object']['key']
    encoded_key = urllib.parse.quote_plus(object_key)
    url = f"https://{bucket_name}.s3.ap-northeast-1.amazonaws.com/{encoded_key}"
    
    sns.publish(
        TopicArn='你的SNS主题ARN',
        Message=f"Batch job report has finished\nURL: {url}"
    )
    return {'statusCode': 200}

内容的提问来源于stack exchange,提问作者Charles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:20:20