Lambda 使用假定角色而不是执行角色

Lambda using assumed-role instead of execution role

我创建了一个将 DynamoDB 和 SES 与 amplify 结合使用的 lambda。

该资源已具有适用于 dynamoDB 的此工作策略:

{
              "Effect": "Allow",
              "Action": [
                "dynamodb:DescribeTable",
                "dynamodb:GetItem",
                "dynamodb:Query",
                "dynamodb:Scan",
                "dynamodb:PutItem",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteItem"
              ],
              "Resource": [
                {
                  "Ref": "storageuserArn"
                },
                {
                  "Fn::Join": [
                    "/",
                    [
                      {
                        "Ref": "storageuserArn"
                      },
                      "index/*"
                    ]
                  ]
                }
              ]
            },

并且我添加了以下内容以使用 SES(ARN 正确且电子邮件已验证):

{
              "Effect": "Allow",
              "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail",
                "ses:SendTemplatedEmail"
              ],
              "Resource": [
                "arn:aws:ses:region:xxxx:identity/email"
              ]
            }

这会正确添加访问权限,我可以在 Roles-Summary 的 lambda-execution-policy 中看到授权。

但是当我尝试执行该函数时出现以下错误:

"User `arn:aws:sts::x:assumed-role/lambdanamexxx-dev/lambdaname-dev' is not authorized to perform `ses:SendTemplatedEmail' on resource `arn:aws:ses:region:xxxx:configuration-set/email'"

现在,在代码中我没有使用任何关于假定角色的信息,我只是在函数中调用 SES:

async function sendConfirmationCode(email, code) {
  const ses = new AWS.SES({ region: "region" });

  const templateDate = {
    "code": code
  };

  // Create sendTemplatedEmail params 
  const params = {
    Destination: { /* required */
      ToAddresses: [email]
    },
    Source: 'source-email', /* required */
    Template: 'reset-password', /* required */
    TemplateData: JSON.stringify(templateDate),
  };
  const result = await ses.sendTemplatedEmail(params).promise();
}

此 lambda 使用代入角色而不是执行角色的原因是什么? DynamoDB 调用没有任何问题。

我该怎么办?授予此假定角色对 ses 的访问权限(以及我该怎么做)或更改 SES 参数中的某些内容?

"User `arn:aws:sts::x:assumed-role/lambdanamexxx-dev/lambdaname-dev` is not authorized to perform `ses:SendTemplatedEmail' on resource `arn:aws:ses:region:xxxx:configuration-set/email'"

当您将执行角色分配给 Lambda 函数时,它只会在幕后对该角色进行 AssumeRole API 调用,因此主体是 arn:aws:sts::x:assumed-role/lambdanamexxx-dev/lambdaname-dev

您收到错误消息是因为您的 IAM 策略未提供所需的访问权限。

{
  "Effect": "Allow",
  "Action": [
    "ses:SendEmail",
    "ses:SendRawEmail",
    "ses:SendTemplatedEmail"
  ],
  "Resource": [
    "arn:aws:ses:region:xxxx:identity/email"
  ]
}

此 IAM 策略仅允许 ses:SendTemplatedEmail 访问资源 arn:aws:ses:region:xxxx:identity/email

但是,除了上述资源之外,ses:SendTemplatedEmail 还需要访问该资源 arn:aws:ses:region:xxxx:configuration-set/email,如错误所述。

SES IAM 密钥的 documentation 指出 ses:SendTemplatedEmail 支持多种资源类型。如果您未将资源指定为通配符 ('*'),则需要指定您的操作所需的所有适用资源。