Не удается отправить электронную почту с помощью AWS SES: неправильно ли я его настроил?

Я пытаюсь отправить электронную почту из приложения NodeJS, запущенного на машине EC2, но получаю ошибку отказа в доступе, чего я не ожидал. Я следил за этой документацией, и теперь мой сценарий есть (изменены реальные домены, адреса и идентификаторы):

  • Домен example.com проверен и настроен в регионе us-east-1 для отправки электронной почты в AWS SES. Все еще в режиме песочницы, если это важно
  • [email protected] адрес подтвержден, поэтому я могу отправлять на него электронные письма. Я могу отправить электронное письмо с [email protected] на [email protected] с помощью Консоли AWS.
  • К MyEC2MachineRole прикреплена следующая политика, так что он может отправлять электронные письма только с использованием домена example.com. Эта политика аналогична пример в документации (кроме отсутствующего Principal):

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "VisualEditor0",
          "Effect": "Allow",
          "Action": [
            "ses:SendEmail",
            "ses:SendRawEmail"
          ],
          "Resource": "arn:aws:ses:us-east-1:111111111111:identity/example.com"
        }
      ]
    }
    

Когда я пытаюсь запустить следующий код, основанный на документация SDK:

const AWS = require('aws-sdk');
AWS.config.update({ region: 'us-east-1' });

async function main() {
  try {
    const client = new AWS.SES({ apiVersion: '2010-12-01' });
    const result = await client.sendEmail({
      Destination: {
        ToAddresses: ['[email protected]']
      },
      Message: {
        Body: {
          Text: {
            Charset: 'UTF-8',
            Data: 'Test',
          },
        },
        Subject: {
          Charset: 'UTF-8',
          Data: 'Test e-mail',
        },
      },
      Source: '[email protected]'
    }).promise();
    console.log('Sent', result);
  } catch (err) {
    console.error('Error', err);
  }
}
main();

Я получаю следующую ошибку:

Пользователь arn:aws:sts::111111111111:assumed-role/MyEC2MachineRole/i-0123456789abcdefg не авторизован для выполнения ses:SendEmail на ресурсе arn:aws:ses:us-east-1:111111111111:identity/[email protected]

Если я изменю адрес назначения на любой другой адрес электронной почты в домене example.com, это сработает. Также это сработает, если я изменю Resource в политике на *.

Разве Resource не тот адрес / домен, по которому отправляется электронная почта? Почему он пытается работать с ресурсом, связанным с адресом назначения? Связано ли это с тем, что конфигурация AWS SES все еще находится в режиме песочницы?


person Thiago Cardoso    schedule 19.03.2019    source источник


Ответы (2)


Теперь, когда учетной записи нет в песочнице, ошибка перестала происходить. В песочнице могут потребоваться дополнительные разрешения для отправки электронной почты, например разрешения на работу с целевым ресурсом.

person Thiago Cardoso    schedule 21.03.2019

Вы используете учетные данные, связанные с пользователем IAM? В этом случае вам необходимо назначить политику (AmazonSESFullAccess) пользователю IAM, которая разрешит эти конкретные действия в SES.

person Sagar M    schedule 13.07.2019
comment
Нет, приложение использовало учетные данные, определенные ролью, прикрепленной к экземпляру EC2, на котором оно выполнялось. - person Thiago Cardoso; 22.07.2019