部署时出现 AWS Lambda 和 IAM 错误:Lambda 无法承担为函数定义的角色
AWS Lambda and IAM error on deploy: The role defined for the function cannot be assumed by Lambda
在我的 AWS 项目中,我使用无服务器框架来部署 lambda 函数和 IAM 角色。
所以我创建了 6 个 lambda 函数,都使用下面相同的 IAM 角色:
functions:
auto-delete-identity:
handler: src/auto-delete-identity.handler
role: arn:aws:iam::123456789012:role/lambdaIAMRole
name: auto-delete-identity
auto-move-to-user-group:
handler: src/auto-move-to-user-group.handler
role: arn:aws:iam::123456789012:role/lambdaIAMRole
name: auto-move-to-user-group
auto-validate-user-creation:
handler: src/auto-validate-user-creation.handler
role: arn:aws:iam::123456789012:role/lambdaIAMRole
name: auto-validate-user-creation
auto-validation-user-email-modification:
handler: src/auto-validation-user-email-modification.handler
role: arn:aws:iam::123456789012:role/lambdaIAMRole
name: auto-validation-user-email-modification
hello-demo:
handler: src/hello-demo.handler
role: arn:aws:iam::123456789012:role/lambdaIAMRole
name: hello-demo
reset-user-password:
handler: src/reset-user-password.handler
role: arn:aws:iam::123456789012:role/lambdaIAMRole
name: reset-user-password
resources:
Resources:
lambdaIAMRole:
Type: "AWS::IAM::Role"
Properties:
RoleName: lambdaIAMRole
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Action:
- "sts:AssumeRole"
Effect: "Allow"
Principal:
Service:
- "lambda.amazonaws.com"
Policies:
- PolicyDocument:
Version: "2012-10-17"
Statement:
- Action:
- "logs:CreateLogGroup"
- "logs:CreateLogStream"
- "logs:PutLogEvents"
Effect: "Allow"
Resource:
- !Sub "arn:aws:logs:eu-central-1:123456789012:log-group:/aws/lambda/*:*"
PolicyName: "myLambdaPolicy"
当我使用无服务器部署命令进行部署时,有时会出现以下错误:
An error occurred: HelloDashdemoLambdaFunction - The role defined for the function cannot be assumed by Lambda. (Service: AWSLambdaInternal; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: 4099072a-809d-4f1c-b83e-7f4f5dd5170b).
这看起来像是一个随机错误,因为它并非每次都会发生。此外,当它发生时,它并不总是发生在同一个函数上。
我是不是做错了什么?我该如何解决?
感谢您的帮助。
我认为问题在于您在 Lambda 函数声明中将 IAM 角色称为 role: arn:aws:iam::123456789012:role/lambdaIAMRole
。这是一个 absolute ARN,您将如何指示在 serverless.yml 之外创建和管理的 IAM 角色(或其他资源) =]模板。
对于您的情况,最快的解决方法是将 role: arn:aws:iam::123456789012:role/lambdaIAMRole
替换为 role: lambdaIAMRole
。后者指的是在模板内声明的 AWS 资源。
假设您的所有 Lambda 函数都具有相同的角色,一个更好的解决方法是完全删除您的 lambdaIAMRole
声明,然后从 Lambda 函数中删除所有 role: arn:aws:iam::123456789012:role/lambdaIAMRole
属性。角色声明不会在无服务器框架将为您隐式生成并分配给 Lambda 函数的默认 IAM 角色上添加任何内容。这是使该框架有价值的原因之一——它提供了良好的默认设置以节省您的时间和精力。示例 here.
在我的 AWS 项目中,我使用无服务器框架来部署 lambda 函数和 IAM 角色。
所以我创建了 6 个 lambda 函数,都使用下面相同的 IAM 角色:
functions:
auto-delete-identity:
handler: src/auto-delete-identity.handler
role: arn:aws:iam::123456789012:role/lambdaIAMRole
name: auto-delete-identity
auto-move-to-user-group:
handler: src/auto-move-to-user-group.handler
role: arn:aws:iam::123456789012:role/lambdaIAMRole
name: auto-move-to-user-group
auto-validate-user-creation:
handler: src/auto-validate-user-creation.handler
role: arn:aws:iam::123456789012:role/lambdaIAMRole
name: auto-validate-user-creation
auto-validation-user-email-modification:
handler: src/auto-validation-user-email-modification.handler
role: arn:aws:iam::123456789012:role/lambdaIAMRole
name: auto-validation-user-email-modification
hello-demo:
handler: src/hello-demo.handler
role: arn:aws:iam::123456789012:role/lambdaIAMRole
name: hello-demo
reset-user-password:
handler: src/reset-user-password.handler
role: arn:aws:iam::123456789012:role/lambdaIAMRole
name: reset-user-password
resources:
Resources:
lambdaIAMRole:
Type: "AWS::IAM::Role"
Properties:
RoleName: lambdaIAMRole
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Action:
- "sts:AssumeRole"
Effect: "Allow"
Principal:
Service:
- "lambda.amazonaws.com"
Policies:
- PolicyDocument:
Version: "2012-10-17"
Statement:
- Action:
- "logs:CreateLogGroup"
- "logs:CreateLogStream"
- "logs:PutLogEvents"
Effect: "Allow"
Resource:
- !Sub "arn:aws:logs:eu-central-1:123456789012:log-group:/aws/lambda/*:*"
PolicyName: "myLambdaPolicy"
当我使用无服务器部署命令进行部署时,有时会出现以下错误:
An error occurred: HelloDashdemoLambdaFunction - The role defined for the function cannot be assumed by Lambda. (Service: AWSLambdaInternal; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: 4099072a-809d-4f1c-b83e-7f4f5dd5170b).
这看起来像是一个随机错误,因为它并非每次都会发生。此外,当它发生时,它并不总是发生在同一个函数上。
我是不是做错了什么?我该如何解决?
感谢您的帮助。
我认为问题在于您在 Lambda 函数声明中将 IAM 角色称为 role: arn:aws:iam::123456789012:role/lambdaIAMRole
。这是一个 absolute ARN,您将如何指示在 serverless.yml 之外创建和管理的 IAM 角色(或其他资源) =]模板。
对于您的情况,最快的解决方法是将 role: arn:aws:iam::123456789012:role/lambdaIAMRole
替换为 role: lambdaIAMRole
。后者指的是在模板内声明的 AWS 资源。
假设您的所有 Lambda 函数都具有相同的角色,一个更好的解决方法是完全删除您的 lambdaIAMRole
声明,然后从 Lambda 函数中删除所有 role: arn:aws:iam::123456789012:role/lambdaIAMRole
属性。角色声明不会在无服务器框架将为您隐式生成并分配给 Lambda 函数的默认 IAM 角色上添加任何内容。这是使该框架有价值的原因之一——它提供了良好的默认设置以节省您的时间和精力。示例 here.