SpringBoot中基于Java AWS SDK仅用IAM角色调用Amazon SES发邮件咨询
解决方案
完全可以仅通过IAM角色实现SES调用,不需要创建长期访问密钥。AWS Java SDK原生支持自动从IAM角色获取短期轮换的临时凭证,不需要手动配置密钥参数,适配以下两种部署场景:
场景1:SpringBoot应用部署在AWS服务内(EC2/ECS/Lambda/EKS/Elastic Beanstalk等)
这是最简便的场景,操作步骤如下:
- 创建自定义IAM角色,为角色附加允许SES发送操作的权限策略,示例策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ses:SendEmail", "ses:SendRawEmail" ], "Resource": "*" } ] }
- 配置该IAM角色的信任策略,允许你部署应用的对应AWS服务(如EC2、ECS任务执行服务等)代入该角色
- 将创建好的IAM角色直接绑定到应用运行的AWS资源上(比如EC2实例配置文件、ECS任务角色、Lambda执行角色等)
- 编写代码时无需手动配置访问密钥,直接使用SDK默认凭证链即可自动获取角色的临时凭证
场景2:SpringBoot应用部署在AWS外部(本地机房、其他云厂商服务器等)
可以使用AWS IAM Roles Anywhere服务实现外部 workload 代入IAM角色获取临时凭证,操作步骤如下:
- 提前在AWS IAM Roles Anywhere中创建信任锚,上传你的服务端证书作为身份信任依据
- 为之前创建的SES权限角色配置信任策略,允许IAM Roles Anywhere服务代入该角色
- 在Java SDK中配置IAM Roles Anywhere凭证提供者,SDK会自动通过证书身份获取临时SES调用凭证
SpringBoot代码实现示例(以AWS Java SDK v2为例)
- 首先在pom.xml中引入SES SDK依赖:
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>ses</artifactId> <version>2.20.0</version> <!-- 替换为对应最新稳定版即可 --> </dependency>
- 直接初始化SES客户端即可,不需要手动传入访问密钥:
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.ses.SesClient; import software.amazon.awssdk.services.ses.model.*; // 初始化客户端 SesClient sesClient = SesClient.builder() .region(Region.of("你的AWS区域,如us-east-1")) .build(); // 发送邮件示例代码 SendEmailRequest request = SendEmailRequest.builder() .destination(Destination.builder().toAddresses("收件人邮箱").build()) .message(Message.builder() .subject(Content.builder().data("邮件主题").build()) .body(Body.builder().text(Content.builder().data("邮件内容").build()).build()) .build()) .source("已验证的发件人邮箱") .build(); sesClient.sendEmail(request);
注意事项
- 若你的SES服务还处于沙箱环境,需要先验证所有收件人邮箱,或申请脱离沙箱
- IAM角色权限遵循最小够用原则,不要附加多余的服务权限
- 确保应用运行环境的网络可以正常访问AWS SES服务的公网/私网端点
内容的提问来源于stack exchange,提问作者jenny jenkins
相关产品推荐
相关产品推荐

