AWS SES 在 spring boot java 中实现而不使用凭证

AWS SES implement In spring boot java without using credential

我是一名后端开发人员(Spring 启动),DevOps 团队希望我实施 AWS 的 SES 和 SNS 服务,但不使用凭据,因为它们在 aws 中存储了与 IAM 角色相同的凭据,所以他们想让我传递代码中唯一的主机并将凭据部分留空,它将向特定收件人发送电子邮件。(根据他们的关注)

正如他们所说,我确实在 java 中尝试使用空凭据,但没有成功,它说身份验证无效

我不知道怎么做,但他们确实用 PHP SDK 实现了同样的事情,他们将凭据部分留空,它与 IAM 角色凭据一起工作得很好

这是我的代码,其中我将凭据部分留空

private boolean sendAwsMail() {
        String result = null;
        boolean flag = true;
        try {
            Properties props = System.getProperties();
            props.put("mail.transport.protocol", varMap.get("protocol"));
            props.put("mail.smtp.port", Integer.parseInt(varMap.get("port")));
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.auth", "true");
            Session session = Session.getDefaultInstance(props);
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress("no-reply@lottoweaver.com", "lottoweaver.com"));
            msg.setRecipient(Message.RecipientType.TO, new InternetAddress(varMap.get("destinationMailId")));
            msg.setSubject(varMap.get("subject"));
            msg.setContent(varMap.get("content"), "text/html");
            Transport transport = session.getTransport();
            transport.connect("email-smtp.us-west-2.amazonaws.com", "", "");
            transport.sendMessage(msg, msg.getAllRecipients());
            AppLogger.writeLog("INFO", "MAIL_SEND", "send_mail", this.getClass().getName(),
                    Thread.currentThread().getStackTrace()[1].getMethodName(),
                    "toMailId:" + varMap.get("destinationMailId"), "subject:" + varMap.get("subject"), "", "", null,
                    null, "");
            result = varMap.get("content");
            transport.close();
        } catch (Exception ex) {
            AppLogger.writeLog("WARNING", "Issue_In_Connection", "send_mail", this.getClass().getName(),
                    Thread.currentThread().getStackTrace()[1].getMethodName(),
                    "toMailId:" + varMap.get("destinationMailId"), "subject:" + varMap.get("subject"), "", "", null, ex,
                    "");
            flag = false;
            result = ex.toString();
        } finally {
            this.flag = flag;
            dumpList.add(new MessageDataDump(varMap.get("destinationMailId"), result, varMap, "AWS-EMAIL"));
            return flag;
        }
    }

我替换了msg.setFrom(new InternetAddress(varMap.get("fromEmail"), varMap.get("fromName"))); msg.setFrom(new InternetAddress("no-reply@lottoweaver.com", "lottoweaver.com"));

并且还在 transport.connect(varMap.get("HOST"), varMap.get("SMTP_USERNAME"), varMap.get("SMTP_PASSWORD")); 的 credentail 部分替换为 transport.connect("email-smtp.us-west-2.amazonaws.com", "", "");

请指出实现此目标的正确方法。

提前致谢

当您执行代码时,AWS SDK 将使用凭证链查找您的凭证: https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html

SDK 将沿此链向下工作,尝试查找凭据。对于在本地计算机上工作的开发人员,您的凭据通常通过 a) aws 凭据文件或 b) 将 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 设置为环境变量来获取。

当您在服务器上 运行 您的代码时,情况会略有不同。在这种情况下,凭证将应用于实例角色。基本上,不需要传递任何凭据,因为代码在 AWS 服务器上,AWS 知道它有什么权限,通过 IAM 实例角色设置。

简而言之,您在本地时需要传递凭据,但请放心,如果您的同事正确设置了服务器,则您在服务器上时不需要传递凭据.

编辑:您将需要使用 Java SDK 来访问凭证链 https://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-using-sdk-java.html