【问题标题】:The role defined for the function cannot be assumed by Lambda为函数定义的角色不能由 Lambda 承担
【发布时间】:2016-07-24 23:39:22
【问题描述】:

我在尝试使用 create-function 命令创建 lambda 函数时收到错误消息“Lambda 无法承担为函数定义的角色”。

aws lambda 创建函数
--region us-west-2
--function-name HelloPython
--zip-file 文件b://hello_python.zip
--role arn:aws:iam::my-acc-account-id:role/default
--handler hello_python.my_handler
--runtime python2.7
--timeout 15
--内存大小512

【问题讨论】:

  • 我遇到了同样的错误,运气好吗?
  • @ox.,请参阅下面的新答案。等待几秒钟对我来说是固定的。

标签: python amazon-web-services boto aws-sdk aws-lambda


【解决方案1】:

我收到错误“Lambda 无法承担为函数定义的角色”,因为我没有更新角色“信任关系”配置文件。我没有遇到 cmets 中链接答案中的超时问题。

上述答案中的cmets指出,需要添加以下内容。

  1. 转到“IAM > 角色 > YourRoleName”
    • (注意:如果您的角色未列出,则需要创建它。)
  2. 选择“信任关系”标签
  3. 选择“编辑信任关系”

我的结果如下所示。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      <your other rules>
    },
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

【讨论】:

  • 我有同样的问题,即使附加到此角色政策。我已经配置了 lambda 函数基本设置,转到 Lambda 控制台,编辑 Lambda 执行角色 -> 编辑基本设置 -> 现有角色 -> 选择为 lambda 创建的角色 -> 将角色重新附加到 lambda 函数 -> 保存 -> 它可以工作
  • 谢谢!这为我节省了很多时间!
  • 对于其他有类似问题的人,请检查您的“Principal.Service”,在我的情况下,我将其错误配置为“ec2.amazonws.com”,显然它不适用于 lambda。
【解决方案2】:

我也遇到了这个错误。 (还没有)得到明确的答案,但我想我会传递一些提示,可以帮助您和/或其他任何人解决这个问题。

A) 如果您通过将账户 ID 和角色名称放在一起来构建角色 ARN,我认为账户 ID 需要没有任何破折号

B) 如果您刚刚创建了角色,并且可能向其添加了策略,那么角色似乎会在一个(小)时间窗口内触发此错误。在角色的最后一次操作和 create-function 调用之间休眠 5 或 6 秒让我绕过了这个问题(当然,时间可能是可变的,所以这充其量是一种解决方法)。

【讨论】:

  • +1 "睡眠 5 或 6 秒" 是这里的解决方案。我在使用 JavaScript SDK 时遇到了同样的问题,正在等待为我修复。我已经发布了一个自我回答的question,其中包含 Node 的代码示例。
  • @Zanon - 感谢您的问答。如果我有时间,我会尝试将其传递给官方论坛,因为通常当资源需要时间准备好时,我们会得到一个可以查询的状态(如果您使用的是 boto3 ,甚至是服务员对象),所以这似乎就像一个奇怪的(无证的 afaik)不一致
  • retrying python 包是一个快速的救援 - 只是用以下内容装饰了创建函数:@retrying.retry(wait_exponential_multiplier=1000, wait_exponential_max=10000)
  • +1 用于睡觉。我不明白这是怎么回事。我必须用 aws sdk (nodejs) 来做这件事,并且睡 10 秒就可以了。如果我在 aws 控制台上创建一个新的内联策略,它会立即显示出来.. hmmhmm.
  • 我有时需要大约 5 分钟才能工作。其他时候它会立即生效,
【解决方案3】:

对我来说,问题是我的角色名称不完整。我设置了

--role arn:aws:iam::000000000000:role/MyRoleName

应该是什么时候

--role arn:aws:iam::000000000000:role/service-role/MyRoleName

(当然我的 aws id 实际上不是 000000000000)

我通过运行发现了这一点

aws iam get-role --role-name MyRoleName

并查看结果集中的"Arn" 属性。

【讨论】:

  • 谢谢,那是我失踪了。
  • 我的问题也是如此。谢谢!
  • 在我的情况下也可以工作,而无需添加“/service-role/”。
  • 为这个提示点赞:aws iam get-role --role-name my-lambda-demo-role
【解决方案4】:

我在测试 lambda 函数时遇到了这个问题。

对我有用的是格式化 JSON。

【讨论】:

  • 我在从 AWS 控制台调用函数时也遇到了这个问题。我只是重新创建了测试事件,它有所帮助。
【解决方案5】:

我刚刚学习使用 AWS CLI 并遇到了这个问题。

我正在使用一系列 PowerShell 脚本来部署整个 AWS 架构。我的 createRole.ps1 脚本包含:

aws iam create-role `
--role-name $roleName `
--assume-role-policy-document file://myRoleTrustPolicy.json

文件 myRoleTrustPolicy.json 包含:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "elasticmapreduce.amazonaws.com",
          "datapipeline.amazonaws.com",
          "lambda.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

服务列表中缺少 "lambda.amazonaws.com" 行导致问题。

一旦我解决了这个问题,aws lambda create-function 的调用就非常有效。

aws lambda create-function `
--function-name $fn `
--runtime java8 `
--role $currentRoleARN `
--handler "handleRequest" `
--memory-size 128 `
--zip-file $jarFile 

【讨论】:

    【解决方案6】:

    对我来说,问题是我设置了错误的默认区域环境键。

    【讨论】:

      【解决方案7】:

      尽管我的 IAM 角色确实有正确的政策和信任关系,但遇到了同样的问题。 通过 CLI 完成 Lambda 创建工作正常,问题是在创建 IAM 角色后使用 lambda 模块。

      我也尝试“暂停”几秒钟,但没有帮助。

      最终添加了重试和延迟,直到定义了 registerdLambda.code。通常在尝试 1-2 次后它会起作用。

      示例:

       - name: creating lambda function
         lambda:
           state: present
           name: "{{ lambdaName }}"
           zip_file: "{{ lambdaZipFile }}"
           runtime: "{{ lambdaRuntime }}"
           role: "{{ lambdaRole }}"
           description: "{{ lambdaDescription }}"
           handler: "{{ lambdaHandler }}"
         register: lambdaFunc
         retries: 3
         delay: 10
         until: "{{ lambdaFunc.code is defined }}"
      

      【讨论】:

      • 我遇到了类似的错误...所有依赖项都已正确声明,但 IAM 角色将被报告为不存在或无法由 lambda 承担,即使它在函数之前显示为已创建开始在 cloudformation 事件日志中创建。我解决这个问题的方法是声明对 lambda 函数不需要但会“浪费时间”创建它的资源的另一个依赖关系,这足以让 IAM 角色进入不需要的状态成为函数使用的问题。它是一个黑客,它似乎是一个 AWS 问题。顺便说一句,这是 w/SAM。
      【解决方案8】:

      我遇到此错误仅仅是因为我在角色 ARN 中有错字。我真的希望这个错误更明确,并说一些类似于“这个角色不存在”的东西,但是唉。

      【讨论】:

        【解决方案9】:

        大多数人最终会出现此错误,因为在创建 Lambda 函数时在 CloudFormation 中提供了错误的角色 ARN。

        确保首先使用 "DependsOn" 完成角色并使用内部函数 """{ "Fn::GetAtt" : [ "your-role-logical-name", "Arn" ] }"""

        【讨论】:

          【解决方案10】:

          我在使用 terraform 时遇到了这个错误,需要添加一个承担角色策略并将其应用于 lambda 承担的角色。

          data "aws_iam_policy_document" "lambda_assume_role_policy" {
          
            statement {
              actions = ["sts:AssumeRole"]
          
              principals {
                type        = "Service"
                identifiers = [
                  "lambda.amazonaws.com"
                ]
              }
            }
          
          resource "aws_iam_role" "lambda_rotation_role" {
            name               = "lambda-rotation-role"
            assume_role_policy = "${data.aws_iam_policy_document.lambda_assume_role_policy.json}"
          }
          

          【讨论】:

            【解决方案11】:

            可能是 Lambda 缺少执行角色。或者此角色已被删除。

            在控制台中,您可以在 Lambda > Functions > YourFunction > Permissions 查看状态。即使是没有策略的 IAM 空角色也足以让它发挥作用。

            【讨论】:

              猜你喜欢
              • 2023-04-06
              • 2016-09-26
              • 1970-01-01
              • 2017-05-12
              • 2021-08-30
              • 2019-12-17
              • 2021-10-24
              • 2021-09-17
              • 1970-01-01
              相关资源
              最近更新 更多