【问题标题】:AWS Execution failed due to configuration error: Authorizer error由于配置错误,AWS 执行失败:授权者错误
【发布时间】:2016-11-21 01:04:32
【问题描述】:

我为 API 网关端点创建了 2 个授权方。一个手动使用控制台,另一个使用 boto3。 手动创建的效果很好,但是使用脚本创建的会出现主题行中提到的错误。如果你检查这两个授权人的内容,它们是相同的。

可能缺少的部分是什么?我不认为这是对 lambda 的无效权限,因为它在手动配置时对一个授权方起作用。

The code for the same is as below:
response = client.create_authorizer(
               restApiId=apiid,
               name=authName,
               type='TOKEN',
               authType='custom',
               authorizerUri=authorizerUri,
               ##arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:<AcctId>:function:CustomAuthorizer/invocations
               identitySource='method.request.header.Authorization',
               identityValidationExpression= '.*',
               authorizerResultTtlInSeconds=300
           )

出现错误: 2016 年 7 月 18 日星期一 11:53:04 UTC:由于配置错误,执行失败:Lambda 函数的权限无效 2016 年 7 月 18 日星期一 11:53:04 UTC:由于配置错误,执行失败:授权者错误 2016 年 7 月 18 日星期一 11:53:04 UTC:AuthorizerConfigurationException

【问题讨论】:

    标签: amazon-web-services aws-lambda


    【解决方案1】:

    刚刚进入这个兔子洞,遇到了一个解决方案(使用 boto3 和 python,希望它在不同的 sdk 中是相似的)。

    问题在于,当您通过控制台手动创建它时,会出现一个弹出窗口,要求启用 api 网关(确切地说是这个特定的授权方)作为您用作授权方的 lambda 函数的触发器。通过 sdk 执行此操作时,显然没有弹出窗口,因此授权者无权调用该 lambda。

    您可以通过两种方式启用权限:

    1. 在 lambda 中,在 Designer 面板中为您的授权人创建一个新触发器。指定一个 api 和阶段应该可以解决问题
    2. 创建将处理此权限的角色。授予它调用 lambda 的权限(您可以使用 AWSLambdaRole 模板角色)并确保将 api-gateway 添加为可信实体以在信任关系选项卡中使用此角色。您的政策应如下所示:

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

    现在,当使用 sdk 创建自定义授权方时,您必须提供一个 authorizerCredentials 参数,该参数描述为“(字符串)指定所需的凭证作为 API 网关调用授权方的 IAM 角色。指定 IAM API Gateway 要承担的角色,请使用该角色的 Amazon 资源名称 (ARN)。要对 Lambda 函数使用基于资源的权限,请指定 null。"。

    复制您新创建的角色的 arn 并将其用作 authorizerCredentials 参数的值。

    维奥拉!您现在有一个自定义授权者,可以使用允许它调用 lambda 函数的角色!

    (抱歉格式不好,我不经常发表评论:D)

    【讨论】:

      【解决方案2】:

      首先,使用 API Gateway 中的测试按钮确认您是否可以从其中调用您的 Lambda 函数。这将确保 API Gateway 到 Lambda 的连接正常工作。

      要评估您的资源策略,您需要调用 GetPolicy API;执行角色控制您的代码在 Lambda 中执行的操作,而不是谁可以调用它。这将是一个很好的下一次检查。

      您还可以在 API Gateway 中启用日志记录,这是一种更好地了解它代表您所做的事情的好方法。这些日志随后会显示在 Amazon CloudWatch Logs 中,您可以在其中查看您的请求流。

      如果您使用的是 CORS,则可能会错过一个设置(或两个 :),所以我也会仔细检查一下。在将 API 直接“连接”到网站或其他应用程序之前,直接 CURL 到您的端点(您可以使用其 HTTP 端点蓝图从 Lambda 轻松测试)是一个很好的第一步。

      【讨论】:

      • 我创建了 2 个授权人 A 和 B。A 从 AWS 控制台创建,B 从 boto3 api 创建。两者都指向同一个 lambda。测试按钮适用于 A 但不适用于 B
      • 您还可以在 API Gateway 控制台中测试授权方本身。 YourApi -> 授权者 -> 测试
      【解决方案3】:

      您需要将基于资源的语句添加到您的 Lambda 权限中,以允许您的网关调用它。正如@MichaelJoy 指出的那样,当您在弹出窗口中单击“创建”时,这会在控制台中得到解决。以编程方式执行此操作需要在您的授权人创建后执行第二步。

      要通过 CLI 执行此操作,您可以执行以下操作(大概 boto3 具有所有相应的命令):

      aws lambda add-permission --function-name 'arn:aws:lambda:us-west-2:<AcctId>:function:CustomAuthorizer' \
              --action lambda:InvokeFunction --statement-id 'api_gateway' \
              --principal apigateway.amazonaws.com --output text \
              --source-arn "AUTHORIZER_ARN"
      

      其中 AUTHORIZER_ARN 是您刚刚创建的授权方的 ARN。注意 'api_gateway' 的语句 id 是任意的。

      您可以通过以下方式在您的 Lambda 上查看所有基于资源的策略。这可能会有所帮助,尤其是如果您想通过控制台检查您添加的权限,作为您需要以编程方式影响以获得相同结果的工作示例:

      aws lambda get-policy --function-name XXXX
      

      如果您要更新现有的基于资源的权限,您需要先通过remove-policy 命令将其删除

      【讨论】:

        【解决方案4】:

        如果您检查您的 CloudWatch Logs Insights,将会很有帮助。

        转到您的 lambda 函数,打开“监视器”部分。阅读最后收到的日志。

        在我的例子中,我在 lambda 方法处理程序地址上打错了字。这就是引发错误的原因。

        【讨论】:

          猜你喜欢
          • 2017-01-11
          • 2019-04-15
          • 2020-09-29
          • 2023-03-05
          • 1970-01-01
          • 2018-07-12
          • 2019-02-12
          • 2019-09-16
          • 2020-04-19
          相关资源
          最近更新 更多