如何用C#实现S3触发AWS Lambda发送Twilio MMS消息
S3上传触发Lambda发送Twilio MMS(C#实现)
前置准备
- 拥有AWS账号并创建好目标S3存储桶
- 注册Twilio账号,获取Account SID、Auth Token,以及支持MMS的Twilio发送号码
- 安装AWS Toolkit for Visual Studio(推荐)或.NET CLI用于创建Lambda项目
创建Lambda项目
- 通过VS创建AWS Lambda项目,选择「S3触发器」模板;或使用CLI命令:
dotnet new lambda.S3 --name S3ToTwilioMMS - 项目自动包含S3事件的模型定义,无需手动编写
安装Twilio依赖
在项目中安装Twilio的NuGet包:
dotnet add package Twilio
编写Lambda函数代码
替换默认的Function.cs,核心逻辑为解析S3上传事件、生成图片预签名URL、调用Twilio API发送MMS:
using Amazon.Lambda.Core; using Amazon.Lambda.S3Events; using Amazon.S3; using Amazon.S3.Model; using Twilio; using Twilio.Rest.Api.V2010.Account; using Twilio.Types; [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace S3ToTwilioMMS; public class Function { private readonly IAmazonS3 _s3Client; private readonly string _twilioAccountSid; private readonly string _twilioAuthToken; private readonly string _twilioFromNumber; private readonly string _recipientNumber; public Function() { _s3Client = new AmazonS3Client(); // 从Lambda环境变量读取敏感信息,禁止硬编码 _twilioAccountSid = Environment.GetEnvironmentVariable("TWILIO_ACCOUNT_SID") ?? string.Empty; _twilioAuthToken = Environment.GetEnvironmentVariable("TWILIO_AUTH_TOKEN") ?? string.Empty; _twilioFromNumber = Environment.GetEnvironmentVariable("TWILIO_FROM_NUMBER") ?? string.Empty; _recipientNumber = Environment.GetEnvironmentVariable("RECIPIENT_NUMBER") ?? string.Empty; } public async Task FunctionHandler(S3Event evnt, ILambdaContext context) { var s3Record = evnt.Records.FirstOrDefault(); if (s3Record?.S3 == null) { context.Logger.LogError("未接收到有效S3事件"); return; } try { var bucketName = s3Record.S3.Bucket.Name; var objectKey = s3Record.S3.Object.Key; // 生成1小时有效期的预签名URL,供Twilio访问私有S3对象 var presignRequest = new GetPreSignedUrlRequest { BucketName = bucketName, Key = objectKey, Expires = DateTime.UtcNow.AddHours(1) }; var imageUrl = _s3Client.GetPreSignedURL(presignRequest); // 初始化Twilio客户端并发送MMS TwilioClient.Init(_twilioAccountSid, _twilioAuthToken); var message = await MessageResource.CreateAsync( to: new PhoneNumber(_recipientNumber), from: new PhoneNumber(_twilioFromNumber), mediaUrl: new List<Uri> { new Uri(imageUrl) }, body: "新图片已上传至S3存储桶" ); context.Logger.LogInformation($"MMS发送成功,消息SID: {message.Sid}"); } catch (Exception ex) { context.Logger.LogError($"处理S3事件失败: {ex.Message}"); throw; } } }
配置Lambda环境变量
在AWS Lambda控制台的「配置」→「环境变量」中添加以下变量:
TWILIO_ACCOUNT_SID:你的Twilio账号SIDTWILIO_AUTH_TOKEN:你的Twilio授权令牌TWILIO_FROM_NUMBER:Twilio发送号码(格式如+1234567890)RECIPIENT_NUMBER:接收MMS的目标号码(格式同上)
配置Lambda权限
- 进入Lambda函数的「配置」→「权限」,找到执行角色并跳转至IAM控制台
- 为该角色添加
AmazonS3ReadOnlyAccess策略(或更精细的权限,仅允许访问目标S3桶) - 若Lambda处于VPC内,需配置NAT网关以允许访问Twilio外部API;非VPC部署默认支持外网访问
配置S3触发器
- 在Lambda控制台「配置」→「触发器」中点击「添加触发器」
- 选择S3服务,指定目标存储桶
- 触发事件类型选择「所有对象创建事件」(或仅选
PUT),可设置前缀/后缀过滤(如仅触发.jpg/.png格式) - 启用触发器完成配置
测试与调试
- 在Lambda控制台「测试」页面,选择S3事件模板创建测试事件,修改bucket和key为测试对象信息
- 执行测试后,查看CloudWatch日志(「监控」→「日志」)排查问题,确认MMS发送状态
关键注意事项
- 敏感信息禁止硬编码,必须通过环境变量传递
- 私有S3桶的对象必须生成预签名URL,Twilio无法直接访问私有资源
- 确认Twilio发送号码和接收号码均支持MMS功能
- 可添加文件后缀检查,避免非图片文件触发MMS发送
内容的提问来源于stack exchange,提问作者DanScott0806
相关产品推荐
相关产品推荐

