AWS sam SES sendEmail возвращает InvalidClientTokenId (nodejs / lambda)

надеюсь, вы можете мне помочь с этим:

Я использую AWS sam для создания API-шлюза AWS с nodejs. пока все работает нормально, но когда я пытался отправлять электронные письма через AWS SES, я получаю следующую ошибку:

ERROR   Invoke Error    {"errorType":"InvalidClientTokenId","errorMessage":"The security token included in the request is invalid.","code":"InvalidClientTokenId","message":"The security token included in the request is invalid."

я использую следующий код:

const AWS = require("aws-sdk");
const SESConfig = {
        accessKeyId: process.env.AWS_ACCESS_KEY_ID_SES,
        secretAccesskey: process.env.AWS_SECRET_ACCESS_KEY_SES,
        apiVersion: "2010-12-01",
        region: process.env.AWS_REGION
      };

var params = {
        Destination: {
         ToAddresses: [
          userDataObject.email
         ]
        }, 
        Message: {
         Body: {
          Html: {
           Charset: "UTF-8", 
           Data: "This message body contains HTML formatting. It can, for example, contain links like this one: <a class=\"ulink\" href=\"https://docs.aws.amazon.com/ses/latest/DeveloperGuide\" target=\"_blank\">Amazon SES Developer Guide</a>."
          }, 
          Text: {
           Charset: "UTF-8", 
           Data: "This is the message body in text format."
          }
         }, 
         Subject: {
          Charset: "UTF-8", 
          Data: "Test email"
         }
        }, 
        ReplyToAddresses: [
        ], 
        ReturnPath: "", 
        ReturnPathArn: "", 
        Source: "[email protected]", 
        SourceArn: ""
       };

 await new AWS.SES(SESConfig).sendEmail(params).promise().then((response) => {
         console.log(response);
       })
  • Я дважды проверил, что токены для пользователя IAM в порядке и не содержат специальных символов.
  • Я также проверил, что учетная запись SES не находится в режиме песочницы.
  • Я проверил, что переменные в SESConfig действительно доступны для чтения и содержат необходимые данные.
  • Я попытался использовать полный доступ SES для политики пользователей. Я также пробовал с полными правами администратора
  • aws-sdk обычно работает в этом проекте: я могу загружать данные, например, в s3
  • отправка электронной почты через smtp с помощью nodemailer, вероятно, сработает, но я не пробовал этого, потому что я действительно хочу опробовать aws-sdk

Я был бы очень рад, если бы кто-нибудь мог указать, делаю ли я что-то не так в целом или у кого-то есть представление о том, что я могу попытаться решить эту проблему

См. также:  Невозможно заставить вспомогательную функцию работать в AWS lambda nodejs
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Aku

    Для всех, у кого есть одна и та же проблема, я решил ее следующим образом:

    1. удаление accessKeyId и secretAccesskey из функции
    2. удаление accessKeyId и secretAccesskey из моего .gitlab-ci.yml
    3. удаление accessKeyId и secretAccesskey из sam template.yaml
    4. переход к управлению идентификацией и доступом (IAM) в консоли aws
    5. направляясь к ролям
    6. поиск роли лямбда-функции (которая обычно является arn лямбда-функции)
    7. прикрепляя правильную политику ses. вы также можете создать новый, если хотите. для примера читайте дальше

    политика ses:

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Resource": "*"
        }
    ]
    

    }

    обновленный и рабочий код:

    const AWS = require("aws-sdk");
    const ses = new AWS.SES({ region: process.env.AWS_REGION });
          
          const params = {
            Destination: {
              ToAddresses: [userDataObject.email],
            },
            Message: {
              Body: {
                Text: { Data: "Test" },
              },
        
              Subject: { Data: "Test Email" },
            },
            Source: "[email protected]",
          };
         
          await ses.sendEmail(params).promise();
    

    я узнал из этого три вещи:

    1. документация по aws неплохая: https://aws.amazon.com/de/premiumsupport/knowledge-center/lambda-send-email-ses/
    2. установка ролей для лямбда-функций через консоль aws IAM выглядит элегантно по сравнению с созданием нового пользователя IAM и размещением информации о доступе (accessKey и т. д.) в процессе развертывания.
    3. я должен более внимательно прочитать документацию aws, прежде чем отправлять в stackoverflow
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: