在 API Gateway 的 lambda 集成中使用 stageVariables 会引发验证错误

zac*_*ach 7 api lambda gateway stage amazon-web-services

我的 API 网关有两个阶段(开发和生产)。我希望每个分别指向 dev 和 prod lambda 别名。我尝试在 lambda 集成中使用 stageVariables,但这会引发验证错误,并且 API Gateway 无权调用 lambda。我也无法从 lambda 仪表板更改权限策略以包含 stageVariables。

首先,我向每个阶段添加了一个阶段变量 (LAMBDA_ALIAS),并具有适当的值。我尝试附加:${stageVariables.LAMBDA_ALIAS}到 lambda ARN。当我保存此内容时,更改仍然存在,但仪表板顶部出现验证错误:

1 validation error detected: Value 'arn:aws:lambda:us-east-2:xxx:function:auth:${stageVariables.LAMBDA_ALIAS}' at 'functionName' failed to satisfy constraint: Member must satisfy regular expression pattern: (arn:(aws[a-zA-Z-]*)?:lambda:)?([a-z]{2}((-gov)|(-iso(b?)))?-[a-z]+-\d{1}:)?(\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\$LATEST|[a-zA-Z0-9-_]+))?
Run Code Online (Sandbox Code Playgroud)

此外,我在点击 API 路由后注意到 CloudWatch 日志中出现集成错误:“在集成或 API 网关上配置的 IAM 角色没有调用集成的权限。请检查权限并重试。”

我已按照本指南创建了与完整调用 ARN 的新集成,但这也不起作用(它解析为 lambda ARN)。最后,我尝试通过 cli ( aws lambda add-permissions) 发出 JSON 语句,但返回了与上面所示相同的正则表达式错误。

这是我使用的 JSON 语句:

{
  "StatementId": "xxx",
  "Action": "lambda:InvokeFunction",
  "FunctionName": "arn:aws:lambda:us-east-2:xxx:function:auth:${stageVariables.LAMBDA_ALIAS}",
  "Principal": "apigateway.amazonaws.com",
  "SourceArn": "arn:aws:execute-api:us-east-1:xxx:xxx/*/*/auth"
}
Run Code Online (Sandbox Code Playgroud)

我偶然发现了几个视频/博客教程,它们使用阶段变量将 API Gateway 阶段指向不同的 lambda 版本/别名,所以我的问题有三个:(1) AWS 是否仍然支持此功能?(2) 如果支持,如何实现是否实施?(3)如果没有,替代方法是什么?

小智 1

您设法解决问题了吗?

我想我的问题有点相似,我试图设置一个 HTTP API,其中包含devprod的阶段,并且在定义集成时(通过 UI)无法让 stageVariables 工作。

经过一番挖掘后,我设法通过以下方式解决了这个问题:

  1. API 网关创建IAM 角色
  2. Lambda创建 2 项IAM 策略(允许调用函数),一项用于 DevPolicies,一项用于 ProdPolicies,如下所示:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": [
                "arn:aws:lambda:<region>:<id>:function:do-something-one:<prod/dev>",
                ...
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

<region>将,替换<id>为您的相关值以及<prod/dev>您想要与此策略关联的函数的别名。

  1. 然后,我将这两个策略添加到角色中,并使用此 IAM 角色进行 API 网关路由集成(我必须取消选中默认的“授予 API 网关权限以调用您的 Lambda 函数”,然后它允许手动输入要使用的角色): UI 部分的屏幕截图

这使我能够成功保存集成,并根据我访问的阶段 URL 对 lambda 函数使用不同的别名。

我假设可以创建 2 个角色 - 一个用于生产,一个用于开发,并且可能使用 stageVariables.iamRole 来进一步拆分基于权限的调用,但这对我不起作用,因为它抱怨不允许 iamPassRole。