Используйте лямбда-функцию для запуска SES в другом регионе

#aws-lambda #amazon-ses

#aws-lambda #amazon-ses

Вопрос:

У меня включена лямбда-функция ap-southeast-1 . Изначально я настроил адрес электронной почты в изолированной среде в том же регионе, и мой код сработал.

Теперь мне нужно использовать подтвержденный адрес электронной почты SES на eu-west-1 для запуска уведомлений. введите описание изображения здесь

Как я могу этого добиться?

Мой serverless.yml файл выглядит следующим образом (несвязанные части опущены):

 custom: ${file(env.yml)}

provider:
  name: aws
  runtime: go1.x
  stage: ${opt:stage, 'dev'}
  region: ${self:custom.REGION, 'ap-southeast-1'}
  environment: ${file(env.yml)}
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:DescribeTable
        - dynamodb:Query            
      Resource: "arn:aws:dynamodb:*:*:*"
    - Effect: Allow
      Action:
        - ses:SendEmail
        - ses:SendRawEmail
      Resource: "arn:aws:ses:${env:SES_REGION}:${env:ACCOUNT_ID}:identity/*"


functions:
  notify:
    handler: bin/notify
    events:
      - http:
          path: notify
          method: post
          cors: true
          authorizer:
            arn: "arn:aws:cognito-idp:${self:provider.region}:${self:custom.ACCOUNT_ID}:userpool/${self:custom.USER_POOL_ID}"  

    
  

файл env.yml (SES_REGION= eu-west-1):

 AWS_PROFILE: ${env:AWS_PROFILE}
RELEASE_STAGE: ${env:RELEASE_STAGE}
REGION: ${env:REGION}
SES_REGION: ${env:SES_REGION}
ACCOUNT_ID: ${env:ACCOUNT_ID}
USER_POOL_ID: ${env:USER_POOL_ID}
MAIL_SENDER: ${env:MAIL_SENDER}
  

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

 "error_message":"AccessDenied: User `arn:aws:sts::41310816xxxx:assumed-role/xxx-remarks-api-dev-ap-southeast-1-lambdaRole/xxx-remarks-api-dev-notify' is not authorized to perform `ses:SendEmail' on resource `arn:aws:ses:ap-southeast-1:41310816xxxx:identity/noreply@xxx'
  

Я замечаю, что в ошибке упоминается ресурс ses на ‘ap-southeast-1’. Это причина ошибки? Как я могу принудительно обновить свой код, если это так?

Ответ №1:

Похоже, что ваш lambda не имеет необходимых привилегий для запуска SES

Шаг 1: Перейдите в роль обмена мгновенными сообщениями и отредактируйте политику, затем откройте JSON и добавьте следующий код

   {
   "Effect":"Allow",
   "Action":[
   "ses:SendEmail",
   "ses:SendRawEmail"
    ],
    "Resource":"*"
    }
  

Шаг 2: В дополнение к следующему коду вашего лямбда-вызова SES недоступен во всех регионах, поэтому, пожалуйста, убедитесь, что ваш регион поддерживает SES.

         var aws = require('aws-sdk');
        var lambda = new aws.Lambda({
         region: 'eu-west-1' //change to your region
        });
  

Комментарии:

1. Спасибо, указание региона решило мою проблему. Я добавляю свой ответ ниже с кодом, который я изменил.

Ответ №2:

Это благодаря принятому ответу выше. Мне нужно было указать регион при вызове моей лямбда-функции в ap-southeast-1 .

бессерверный.yml:

 provider:
  name: aws
  runtime: go1.x
  stage: ${opt:stage, 'dev'}
  region: ap-southeast-1
  environment: ${file(env.yml)}
  iamRoleStatements:
    - Effect: Allow
      Action:
        - ses:SendEmail
        - ses:SendRawEmail
      Resource: "arn:aws:ses:*:*:*"
  

В коде укажите регион, в котором работает служба ses, вместо региона по умолчанию:

     // Send notification
    func (n *Notification) Notify() error {
        // svc := ses.New(session.New())
        svc := ses.New(session.New(), aws.NewConfig().WithRegion("eu-west-1"))
        htmlFile := "notify.html"
        txtFile := "notify.txt"
        : bla bla
}