繁体   English   中英

在 Lambda function 中从 AWS SES 发送 email 时访问被拒绝

[英]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”,因此不匹配。

参考 - http://docs.aws.amazon.com/ses/latest/DeveloperGuide/control-user-access.html#iam-and-ses-examples-email-sending-actions

如果您正在为 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',
    ],  
]);

就是这样,祝你好运!

  1. 创建策略以授予资源发送电子邮件操作。
  2. 将策略附加到 lambda 执行角色

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM