#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
}