如何获取SES模板ARN并授权AWS Lambda通过SES发送邮件?
问题与解决方案
问题
使用AWS CDK v2结合Golang编排基础设施,部署Lambda+SES发送邮件时遇到两个问题:
- 无法正确授权Lambda通过SES发送邮件
- 不知道如何从SES模板资源中提取ARN来配置IAM策略
解决方案
1. 提取SES模板ARN
AWS CDK中,awsses.CfnTemplate资源提供了AttrArn()方法,可直接获取模板的ARN,无需手动拼接。该属性由CDK自动生成,部署时会解析为实际的ARN值。
2. 完善IAM策略配置
- 显式设置策略
Effect为Allow(默认值虽为Allow,但显式配置更清晰) ses:SendTemplatedEmail操作除了需要模板ARN权限,还需允许对发送身份(已验证的邮箱/域名ARN)的访问;若测试环境可临时用*,生产环境建议限制到具体身份
修正后的完整代码
package main import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/aws-cdk-go/awscdk/v2/awsiam" "github.com/aws/aws-cdk-go/awscdk/v2/awsses" "github.com/aws/aws-cdk-go/awscdklambdagoalpha/v2" "github.com/aws/jsii-runtime-go" ) func main() { app := awscdk.NewApp(nil) stack := awscdk.NewStack(app, jsii.String("EmailSenderStack"), nil) // 创建SES模板,需指定模板名称及内容(示例配置) template := awsses.NewCfnTemplate(stack, jsii.String("EmailTemplate"), &awsses.CfnTemplateProps{ Template: &awsses.CfnTemplate_TemplateProperty{ TemplateName: jsii.String("WelcomeTemplate"), SubjectPart: jsii.String("Welcome to our service"), HtmlPart: jsii.String("<h1>Hello {{name}}!</h1>"), TextPart: jsii.String("Hello {{name}}!"), }, }) // 构建IAM策略:允许Lambda使用指定模板发送邮件 iamPolicy := awsiam.NewPolicyStatement(&awsiam.PolicyStatementProps{ Effect: awsiam.Effect_ALLOW, Actions: jsii.Strings("ses:SendTemplatedEmail"), Resources: jsii.Strings(template.AttrArn()), // 可选:限制发送身份(替换为你的验证邮箱/域名ARN) // Principals: []awsiam.IPrincipal{awsiam.NewArnPrincipal("arn:aws:ses:us-east-1:123456789012:identity/your-email@example.com")}, }) // 创建Go Lambda函数,补充代码路径等必要参数 lambda := awscdklambdagoalpha.NewGoFunction(stack, jsii.String("EmailSenderLambda"), &awscdklambdagoalpha.GoFunctionProps{ Runtime: awscdk.Runtime_GO_1_X(), Entry: jsii.String("./lambda"), // 你的Lambda代码所在目录 }) // 将策略添加到Lambda的执行角色 lambda.AddToRolePolicy(iamPolicy) // 输出模板ARN,方便后续查看 awscdk.NewCfnOutput(stack, jsii.String("TemplateArn"), &awscdk.CfnOutputProps{ Value: template.AttrArn(), }) app.Synth(nil) }
额外注意事项
- 确保SES模板中使用的发送邮箱/域名已在AWS控制台完成验证
- Lambda执行区域需与SES服务区域一致(部分区域SES需申请移出沙箱)
- 若要发送给未验证的邮箱,需先申请SES生产访问权限
内容的提问来源于stack exchange,提问作者Kahou
相关产品推荐
相关产品推荐

