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
支持多种资源类型。如果您未将资源指定为通配符 ('*'),则需要指定您的操作所需的所有适用资源。
我创建了一个将 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
支持多种资源类型。如果您未将资源指定为通配符 ('*'),则需要指定您的操作所需的所有适用资源。