【问题标题】:Access Denied while sending email from AWS SES in Lambda function在 Lambda 函数中从 AWS SES 发送电子邮件时访问被拒绝
【发布时间】:2016-04-29 04:58:39
【问题描述】:

我正在尝试在 AWS Lambda 函数中使用 Amazon SES 发送电子邮件,为此我面临以下错误。

AccessDenied:用户 arn:aws:sts::XXXXX:assumed-role/lambda_basic_execution/awslambda_XXXX' is not authorized to performses:SendEmail' 使用资源 `arn:aws:ses:us-west-2:XXX:identity/example@example.com'

我已授予权限

"ses:SendEmail"、"ses:SendRawEmail" 用于 IAM 角色。

【问题讨论】:

  • 能否包含您已应用于 lambda_basic_execution 角色的策略?
  • 请查看以下政策 - { "Version": "2012-10-17", "Statement": [ { "Sid": "StmtXXXXXXXXX", "Effect": "Allow", "行动”:[“ses:SendEmail”,“ses:SendRawEmail”],“资源”:[“*”]}]}
  • 对于仍有问题的任何人,您需要首先在 any 资源上授权 SendEmail 和 SendRawEmail 的 ec2/lambda 角色(请参阅 Rakesh 的评论/Nishith 的回答),此外设置 SES 身份策略以允许您的角色发送电子邮件。

标签: javascript email amazon-web-services aws-sdk aws-lambda


【解决方案1】:

所以,我也遇到了 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 此外,您需要先验证电子邮件地址,所以不要忘记这一点。希望对大家有所帮助。

【讨论】:

    【解决方案2】:

    经过长时间调试,我遇到了问题,需要授予“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

    【讨论】:

    • 您能否粘贴最适合您的政策?我仍然有这个问题。谢谢。
    【解决方案3】:

    如果您正在为 SAM Lambda 配置策略或使用 YAML 配置文件,您可以使用如下内容:

    template.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: '*'
    

    【讨论】:

      【解决方案4】:

      正如其他人所说,您应该添加这两个权限: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
      

      【讨论】:

        【解决方案5】:

        IAM 政策解决了这个问题。政策摘要将显示是否有任何警告,即资源不存在等。

        JSON 需要跟随

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

        【讨论】:

          【解决方案6】:

          对于无服务器组件 yaml:

          ...
          inputs:
            name: ${name}-${stage}
            region: ...
            service: lambda.amazonaws.com
            policy:
              - Effect: Allow
                Action:
                  - ses:SendEmail
                  - ses:SendRawEmail
                Resource: '*'
          

          【讨论】:

            【解决方案7】:

            您必须创建一个策略才能将您的 IAM 用户与您的电子邮件发件人关联起来。

            首先您必须创建 SMTP 凭据。在您的帐户仪表板中,向下选择创建 SMTP 凭据 好了,现在您有了 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'    => 'AKIAYYFKAU4OPBNUTIII',
                    'secret' => '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',
                ],  
            ]);
            

            就是这样,祝你好运!

            【讨论】:

              【解决方案8】:

              解决方案:您收到权限错误。您的 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"
              }
              

              P.S尽量避免将*用作资源或操作,并尽可能限制访问以降低安全风险。

              【讨论】:

              • 这是最好的答案,但必须知道 SES 最初在受限的“沙盒”模式下运行,因此对于指定精确 ARN 的策略,它会产生措辞不当的错误。为了使此策略生效,必须通过填写特殊表格将 SES 移出沙盒模式。 docs.aws.amazon.com/ses/latest/dg/…
              猜你喜欢
              • 2015-12-13
              • 2016-11-17
              • 1970-01-01
              • 1970-01-01
              • 2018-01-22
              • 1970-01-01
              • 2017-03-25
              • 2020-11-25
              • 1970-01-01
              相关资源
              最近更新 更多