簡體   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