[英]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.