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

如何通过AWS SAM与Docker本地测试AWS SES Lambda函数?

问题:本地测试调用SES的Lambda函数(无AWS权限/密钥)

我是Docker和Lambda的新手,想在本地运行一个简单的Lambda函数(代码如下),用AWS SES发送邮件。但我只有AWS沙箱账户的受限权限,没有AWS访问密钥用来在账户内测试或本地连接,而且分配的角色也没附加SES相关策略。

请问能不能只通过AWS SAM和Docker在本地测试这个函数?如果可以的话,是要在本地SAM项目里配置模拟AWS环境的所有参数,还是可以基于现有Docker镜像构建容器?我试过bh42/aws-ses-local这类本地测试镜像,但不知道具体怎么操作。

import json
import boto3


def lambda_handler(event, context):

    ses = boto3.client('ses')
    body = message_body

    ses.send_email(Source='From_Address',
               Destination={'ToAddresses': ['To_Address']},
               Message={'Subject': {'Data': 'Test Message',
               'Charset': 'UTF-8'}, 'Body': {'Text': {'Data': body,
               'Charset': 'UTF-8'}}})


    return {'statusCode': 200,
        'body': json.dumps('Message successfully sent')}

回答

完全可以通过AWS SAM + Docker + 本地SES模拟服务实现本地测试,不需要真实AWS权限或密钥,具体操作如下:

1. 核心逻辑

用bh42/aws-ses-local镜像启动本地SES模拟服务,让SAM本地运行的Lambda函数连接这个模拟服务而非真实AWS SES。无需配置完整模拟AWS环境,只需修改Lambda代码里的boto3客户端指向本地服务地址即可。

2. 分步操作

步骤1:初始化SAM项目(若未创建)

sam init --name ses-lambda-test --runtime python3.11 --app-template hello-world

将你的Lambda代码替换到hello-world/app.py,同时修复原代码问题:

  • 补全未定义的message_body变量
  • 配置boto3客户端指向本地SES服务

修改后的代码:

import json
import boto3


def lambda_handler(event, context):
    # 连接本地SES模拟服务
    ses = boto3.client(
        'ses',
        region_name='us-east-1',
        endpoint_url='http://local-ses:8000',  # 对应Docker容器服务名
        aws_access_key_id='fake_key',  # 模拟密钥,任意填写即可
        aws_secret_access_key='fake_secret'
    )
    message_body = "这是测试邮件内容"

    ses.send_email(
        Source='sender@example.com',
        Destination={'ToAddresses': ['recipient@example.com']},
        Message={
            'Subject': {'Data': 'Test Message', 'Charset': 'UTF-8'},
            'Body': {'Text': {'Data': message_body, 'Charset': 'UTF-8'}}
        }
    )

    return {'statusCode': 200, 'body': json.dumps('Message successfully sent')}

步骤2:创建docker-compose.yml管理容器

在SAM项目根目录创建docker-compose.yml,同时启动SAM本地API和本地SES服务:

version: '3.8'
services:
  local-ses:
    image: bh42/aws-ses-local
    ports:
      - "8000:8000"
    environment:
      - SES_LOCAL_PORT=8000
      - SES_LOCAL_REGION=us-east-1
  lambda-local:
    build: .
    command: sam local start-api --host 0.0.0.0
    ports:
      - "3000:3000"
    depends_on:
      - local-ses
    environment:
      - AWS_REGION=us-east-1

步骤3:调整SAM模板(template.yaml)

确保Lambda运行时和API触发配置正确,无需添加真实IAM权限:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: SES Lambda本地测试项目

Resources:
  SesLambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello-world/
      Handler: app.lambda_handler
      Runtime: python3.11
      Events:
        SesApi:
          Type: Api
          Properties:
            Path: /send-email
            Method: post

步骤4:启动服务并测试

  1. 启动所有容器:
docker-compose up --build
  1. 调用Lambda API测试:
curl -X POST http://localhost:3000/send-email
  1. 查看模拟邮件记录:访问http://localhost:8000即可看到发送的测试邮件内容。

3. 关键注意事项

  • 本地SES模拟服务不需要真实AWS密钥,boto3中的密钥仅为占位符,可任意填写。
  • Docker Compose会自动创建内部网络,Lambda容器可通过local-ses服务名访问SES模拟容器。
  • 原代码中message_body变量未定义,必须先初始化才能正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:37:03