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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:30:24