配置跨账户 Lambda 授权方 - Amazon API Gateway

配置跨账户 Lambda 授权方

您现在还可以使用其他 AWS 账户中的 AWS Lambda 函数作为 API 授权方函数。每个账户都可以位于 Amazon API Gateway 可用的任何区域中。Lambda 授权方函数可使用持有者令牌身份验证策略,如 OAuth 或 SAML。这样便可轻松地跨多个 API Gateway API 集中管理和共享重要的 Lambda 授权方函数。

在本节中,我们将介绍如何使用 Amazon API Gateway 控制台配置跨账户 Lambda 授权方函数。

这些说明假设您已经在一个 AWS 账户中有 API Gateway API,在另一个账户中有 Lambda 授权方函数。

使用 API Gateway 控制台配置跨账户 Lambda 授权方

在您拥有 API 的账户中登录 Amazon API Gateway 控制台,然后执行以下操作:

Old REST API console
注意

我们重新设计了 API Gateway 控制台。从 2023 年 12 月开始,旧的控制台体验将不再可用。

  1. 找到您的 API,然后选择 Authorizers (授权方)

  2. 选择 Create New Authorizer (创建新授权方)

  3. 对于 Create Authorizer (创建授权方),在名称输入字段中键入授权方名称。

  4. 对于类型,选择 Lambda 选项。

  5. 对于 Lambda 函数,复制/粘贴您第二个账户中的 Lambda 授权方函数的完整 ARN。

    注意

    在 Lambda 控制台中,您可以在控制台窗口的右上角找到函数的 ARN。

  6. Lambda 调用角色留空,以允许 API Gateway 控制台设置基于资源的策略。创建授权方后,此策略将作为 AWS CLI 命令显示在弹出窗口中。此策略授予 API Gateway 调用授权方 Lambda 函数的权限。您还可选择键入 IAM 角色的名称,以允许 API Gateway 调用授权方 Lambda 函数。有关此类角色的示例,请参阅创建一个可代入的 IAM 角色

    如果您选择让 API Gateway 控制台设置基于资源的策略,则将显示将权限添加到 Lambda 函数对话框。选择 OK(确定)

  7. 对于 Lambda Event Payload(Lambda 事件负载),请选择 Token(令牌)(对于 TOKEN 授权方)或 Request(请求)(对于 REQUEST 授权方)。

  8. 根据上一步作出的选择,执行下列操作之一:

    1. 对于令牌选项,执行下列操作:

      1. Token Source (令牌来源) 中键入标头的名称。API 客户端必须包括此标头名称才能将授权令牌发送到 Lambda 授权方。

      2. (可选)在令牌验证输入字段中提供正则表达式语句。API Gateway 将针对此表达式执行对输入令牌的初始验证并在成功验证后调用授权方。这有助于降低无效令牌产生费用的几率。

      3. 对于 Authorization Caching (授权缓存),根据您是否要缓存授权方生成的授权策略,选择或清除 Enabled (已启用) 选项。在启用策略缓存后,您可选择从默认值 (300) 修改 TTL 值。设置 TTL=0 将禁用策略缓存。在启用策略缓存后,Token Source (令牌来源) 中指定的标头名称将成为缓存键。

    2. 对于 Request (请求) 选项,执行以下操作:

      1. 对于 Identity Sources (身份来源),键入所选参数类型的请求参数名称。支持的参数类型为 HeaderQuery StringStage VariableContext。要添加更多身份来源,请选择 Add Identity Source (添加身份来源)

        API Gateway 将使用指定的身份来源作为请求授权方缓存键。在启用缓存后,API Gateway 将仅在成功确认所有指定的身份来源在运行时存在后才调用授权方的 Lambda 函数。如果指定的身份来源缺失、为 null 或为空,则 API Gateway 将返回 401 Unauthorized 响应,而不调用授权方 Lambda 函数。

        如果定义了多个身份来源,则它们都将用于派生授权方的缓存键。更改缓存键的任意部分将导致授权方丢弃缓存的策略文档并生成新的文档。

      2. 对于授权缓存,保持已启用选项处于选中状态。将 TTL 值保留设置为默认值 (300)。

  9. 选择 Create(创建)为所选 API 创建新的 Lambda 授权方。

  10. 您将看到一个包含 aws lambda add-permission 命令字符串的弹出窗口。此策略授予 API Gateway 调用授权方 Lambda 函数的权限。复制命令并保存,以供稍后使用。您可在创建授权方后运行该命令。

  11. 选择 Create Anyway (仍然创建)

  12. 将您在上一步中复制的 aws lambda add-permission 命令字符串粘贴到为第二个账户配置的 AWS CLI 窗口中。使用您的授权方 ID 替换 AUTHORIZER_ID。这将向您的第一个账户授予对第二个账户的 Lambda 授权方函数的访问权限。

New REST API console
  1. 选择您的 API,然后在主导航窗格中选择授权方

  2. 选择 Create Authorizer(创建授权方)。

  3. 对于授权方名称,输入授权方名称。

  4. 对于授权方类型,选择 Lambda

  5. 对于 Lambda 函数,输入您第二个账户中的 Lambda 授权方函数的完整 ARN。

    注意

    在 Lambda 控制台中,您可以在控制台窗口的右上角找到函数的 ARN。

  6. 此时将显示警告并带有 aws lambda add-permission 命令字符串。此策略授予 API Gateway 调用授权方 Lambda 函数的权限。复制命令并保存,以供稍后使用。您可在创建授权方后运行该命令。

  7. Lambda 调用角色留空,以允许 API Gateway 控制台设置基于资源的策略。此策略授予 API Gateway 调用授权方 Lambda 函数的权限。您还可选择输入 IAM 角色,以允许 API Gateway 调用授权方 Lambda 函数。有关此类角色的示例,请参阅创建一个可代入的 IAM 角色

  8. 对于 Lambda 事件负载,请选择令牌(对于 TOKEN 授权方)或请求(对于 REQUEST 授权方)。

  9. 根据上一步的选择,执行下列操作之一:

    1. 对于令牌选项,执行下列操作:

      • 对于令牌来源,输入包含授权令牌的标头名称。API 客户端必须包括此标头名称才能将授权令牌发送到 Lambda 授权方。

      • 或者,对于令牌验证,输入正则表达式语句。API Gateway 将针对此表达式执行对输入令牌的初始验证并在成功验证后调用授权方。这有助于减少对您 API 的调用。

      • 要缓存授权方生成的授权策略,请将授权缓存保持开启状态。在启用策略缓存后,您可选择修改 TTL 值。将 TTL 设置为零将禁用策略缓存。在启用策略缓存后,令牌来源中指定的标头名称将成为缓存键。如果在请求中将多个值传递到此标头,则所有值都将成为缓存键,并保留顺序。

        注意

        默认 TTL 值为 300 秒。最大值为 3600 秒;目前不能提高此限制。

    2. 对于 Request (请求) 选项,执行以下操作:

      • 身份源类型中,选择一个参数类型。支持的参数类型为 HeaderQuery stringStage variableContext。要添加更多身份源,请选择添加参数

      • 要缓存授权方生成的授权策略,请将授权缓存保持开启状态。在启用策略缓存后,您可选择修改 TTL 值。将 TTL 设置为零将禁用策略缓存。

        API Gateway 将使用指定的身份来源作为请求授权方缓存键。在启用缓存后,API Gateway 将仅在成功确认所有指定的身份来源在运行时存在后才调用授权方的 Lambda 函数。如果指定的身份来源缺失、为 null 或为空,则 API Gateway 将返回 401 Unauthorized 响应,而不调用授权方 Lambda 函数。

        如果定义了多个身份来源,则它们都将用于派生授权方的缓存键。更改缓存键的任意部分将导致授权方丢弃缓存的策略文档并生成新的文档。如果在请求中传递了具有多个值的标头,则所有值都将成为缓存键的一部分,并保留顺序。

      • 在关闭缓存后,无需指定身份源。

    注意

    要启用缓存,授权方必须返回适用于 API 中所有方法的策略。要强制执行特定于方法的策略,您可以关闭授权缓存

  10. 选择 Create Authorizer(创建授权方)。

  11. 将您在上一步中复制的 aws lambda add-permission 命令字符串粘贴到为第二个账户配置的 AWS CLI 窗口中。使用您的授权方 ID 替换 AUTHORIZER_ID。这将向您的第一个账户授予对第二个账户的 Lambda 授权方函数的访问权限。