能否通过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中转处理:
- 调整EventBridge规则,将事件发送到Lambda函数
- 在Lambda中对S3对象键进行URL编码,拼接成合法URL
- 将处理后的消息发送到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
相关产品推荐
相关产品推荐

