[英]Access Denied while sending email from AWS SES in Lambda function
我正在尝试在 AWS Lambda function 中使用 Amazon SES 发送 email,为此我面临以下错误。
AccessDenied:用户
arn:aws:sts::XXXXX:assumed-role/lambda_basic_execution/awslambda_XXXX' is not authorized to perform
ses:SendEmail' example.com'
我已授予权限
IAM 角色的“ses:SendEmail”、“ses:SendRawEmail”。
因此,我也遇到了 Rakesh 解释过的相同问题,但无法理解他所说的步骤,这里有详细的步骤说明。
您需要执行以下安全、身份和合规性 -> IAM -> 角色 -> 选择您的 lambda 函数 -> 然后编辑策略 -> 在 JSON 中打开它并添加以下部分
{
"Effect":"Allow",
"Action":[
"ses:SendEmail",
"ses:SendRawEmail"
],
"Resource":"*"
}
或者您可以按照这些策略示例中的要求进行操作https://docs.aws.amazon.com/ses/latest/DeveloperGuide/control-user-access.html#iam-and-ses-examples-email-sending-actions此外,您需要先验证电子邮件地址,所以不要忘记这一点。 希望这对每个人都有帮助。
经过长时间的调试后,我遇到了问题,需要授予“lambda_basic_execution”角色访问“ses:SendEmail”、“ses:SendRawEmail”的权限。
我试图为我创建的新 IAM 角色授予权限,但 lambda 函数映射到“lambda_basic_execution”,因此不匹配。
如果您正在为 SAM Lambda 配置策略或使用 YAML 配置文件,您将使用如下内容:
模板.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: 'your-email-lambda'
Resources:
YourEmailFunction:
Type: AWS:Serverless::Function
Properties:
Policies:
- Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- 'ses:SendEmail'
- 'ses:SendRawEmail'
Resource: '*'
正如其他人所说,您应该添加这两个权限:ses:SendEmail,ses:SendRawEmail
我只是想为那些使用 Serverless 框架的人添加解释
在 serverless.yml 中:
provider:
name: aws
stage: dev
runtime: nodejs10.x
region: us-west-1
iamRoleStatements:
- Effect: Allow
Action:
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
- lambda:InvokeFunction
- ses:SendEmail # add this
- ses:SendRawEmail # add this
Resource: '*' # add this
IAM 政策解决了这个问题。 策略摘要将显示是否有任何警告,即资源不存在等。
JSON需要遵循
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"ses:SendEmail",
"ses:SendRawEmail"
],
"Resource": "*"
}
对于无服务器组件 yaml:
...
inputs:
name: ${name}-${stage}
region: ...
service: lambda.amazonaws.com
policy:
- Effect: Allow
Action:
- ses:SendEmail
- ses:SendRawEmail
Resource: '*'
您必须创建一个策略才能将您的 IAM 用户与您的电子邮件发件人相关联。
首先,您必须创建 SMTP 凭据。 在您的 Account Dashboard 中向下并选择Create SMTP Credentials好吧,现在您有了 IAM 用户,您将使用它来使用 SES 发送电子邮件。 复制用户ARN (类似于:arn:aws:iam::601688880060:user/ses-smtp-user.20227405-2043453),下一步将需要它。
在您的 AWS SES 账户中,选择您将用于发送的已验证电子邮件。 转到授权选项卡。 使用策略生成器创建策略。 您必须在那里粘贴用户ARN 。 检查您想要的选项,应用策略。
最后,在您的代码中添加凭据。 (您也可以使用“.aws”根目录中名为“credentials”的文件)
$SesClient = new SesClient([
'version' => '2010-12-01',
'region' => 'us-east-2',
'credentials' => [
'key' => 'AKIAYYFKAU4OBNUT',
'secret' => '9B9fuJIQdPFTkq5ZwR4b3OF3NsIAOwYtCv',
],
]);
就是这样,祝你好运!
https://www.lazydeveloper.tech/aws/aws-using-ses-to-send-email-within-a-lambda-function/
解决方案:您收到权限错误。 您的 lambda iam 身份需要实现此缺失的 iam 策略 - 正确操作 ( ses:SendEmail
) 和正确效果 ( Allow
) 以获得对该资源的访问权限( verified domain - arn
)。 在 terraform 上,您可以添加以下 iam 策略:
statement {
actions = ["ses:SendEmail"]
effect = "Allow"
resources = ["arn:aws:ses:us-west-2:XXX:identity/example@example.com"]
sid = "emailFromAWSLambdaServerlessMachine"
}
结果 - 您的政策将如下所示:
{
"Effect":"Allow",
"Action":[
"ses:SendEmail"
],
"Resource":"arn:aws:ses:us-west-2:XXX:identity/example@example.com",
"Sid": "emailFromAWSLambdaServerlessMachine"
}
PS尽量避免将*
作为资源或操作应用,并尽可能限制访问以降低安全风险。
我发现@modsquadron 的 template.yaml 答案无效,但这个变体有效 - 如果您正在为 SAM Lambda 配置策略,请尝试:
template.yaml
Resources:
MyFunction:
Type: AWS::Serverless::Function
Properties:
Policies:
- Statement:
- Sid: SESSendEmailToAllPolicy
Effect: Allow
Action:
- 'ses:SendEmail'
- 'ses:SendRawEmail'
- 'ses:SendTemplatedEmail'
Resource: '*'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.