如何通过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:启动服务并测试
- 启动所有容器:
docker-compose up --build
- 调用Lambda API测试:
curl -X POST http://localhost:3000/send-email
- 查看模拟邮件记录:访问
http://localhost:8000即可看到发送的测试邮件内容。
3. 关键注意事项
- 本地SES模拟服务不需要真实AWS密钥,boto3中的密钥仅为占位符,可任意填写。
- Docker Compose会自动创建内部网络,Lambda容器可通过
local-ses服务名访问SES模拟容器。 - 原代码中
message_body变量未定义,必须先初始化才能正常运行。
内容的提问来源于stack exchange,提问作者TheSoldier
相关产品推荐
相关产品推荐

