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

如何用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账号SID
  • TWILIO_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:40:36