

# 控制对 Lambda 函数 URL 的访问
<a name="urls-auth"></a>

**注意**  
从 2025 年 10 月开始，新的函数 URL 将同时需要 `lambda:InvokeFunctionUrl` 和 `lambda:InvokeFunction` 权限。

您可以使用 [AuthType](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunctionUrlConfig.html#lambda-CreateFunctionUrlConfig-request-AuthType) 参数和附上特定函数的[基于资源的策略](access-control-resource-based.md)来控制对 Lambda 函数 URL 的访问。这两个组件的配置决定了谁可以对函数 URL 调用或执行其他管理操作。

`AuthType` 参数确定了 Lambda 如何对函数 URL 的请求进行身份验证或授权。配置函数 URL 时，必须指定以下 `AuthType` 选项之一：
+ `AWS_IAM` – Lambda 根据 IAM 主体的身份策略和函数基于资源的策略使用 AWS Identity and Access Management (IAM) 对请求进行身份验证和授权。如果只希望经过身份验证的用户和角色使用函数 URL 调用函数，请选择此选项。
+ `NONE` – Lambda 在调用函数之前不会执行任何身份验证。但是，函数基于资源的策略始终有效，并且必须在函数 URL 接收请求之前授予公有访问权限。选择此选项可允许对函数 URL 进行未经身份验证的公有访问。

要了解更多关于安全性的洞察，可以使用 AWS Identity and Access Management Access Analyzer 获取对函数 URL 的外部访问的全面分析。IAM Access Analyzer 还可以监控 Lambda 函数的新权限或更新权限，以帮助您识别授予公有和跨账户访问的权限。可免费使用 IAM Access Analyzer。要开始使用 IAM Access Analyzer，请参阅[使用 AWS IAM Access Analyzer](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)。

该页面包含两种身份验证类型的基于资源的策略示例，以及如何使用 [AddPermission](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html) API 操作或 Lambda 控制台创建这些策略。有关设置权限后如何调用函数 URL 的信息，请参阅[调用 Lambda 函数 URL](urls-invocation.md)。

**Topics**
+ [使用 `AWS_IAM` 身份验证类型](#urls-auth-iam)
+ [使用 `NONE` 身份验证类型](#urls-auth-none)
+ [治理和访问控制](#urls-governance)

## 使用 `AWS_IAM` 身份验证类型
<a name="urls-auth-iam"></a>

如果选择 `AWS_IAM` 身份验证类型，则需要调用 Lambda 函数 URL 的用户必须具有 `lambda:InvokeFunctionUrl` 和 `lambda:InvokeFunction` 权限。根据发出调用请求的人员，您可能需要使用[基于资源的策略](access-control-resource-based.md)授予此权限。

如果发出请求的主体与函数 URL 的 AWS 账户 相同，则主体必须****在其[基于身份的策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)中拥有 `lambda:InvokeFunctionUrl` 和 `lambda:InvokeFunction` 权限，**或者**在函数基于资源的策略中获授权限。换句话说，如果用户已经在其基于身份的策略中拥有 `lambda:InvokeFunctionUrl` 和 `lambda:InvokeFunction` 权限，则基于资源的策略为可选。策略评估遵循[策略评估逻辑](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)中概述的规则。

如果发出请求的主体位于不同的账户中，则主体必须**同时**具有基于身份的策略（该策略为其提供 `lambda:InvokeFunctionUrl` 和 `lambda:InvokeFunction` 权限）**和**基于资源的策略（基于其尝试调用的函数）中授予的权限。策略评估遵循[确定是否允许跨账户请求](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html#policy-eval-cross-account)中概述的规则。

以下基于资源的策略允许 AWS 账户 `444455556666` 中的 `example` 角色调用与函数 `my-function` 关联的函数 URL：[lambda:InvokedViaFunctionUrl](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html#lambda-AddPermission-request-InvokedViaFunctionUrl) 上下文键将操作 `lambda:InvokeFunction` 限制为函数 URL 的调用。这意味着主体必须使用函数 URL 来调用该函数。如果不包含 `lambda:InvokedViaFunctionUrl`，则除了函数 URL 之外，主体还可以通过其他调用方法调用函数。

**Example — 基于跨账户资源的策略**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::444455556666:role/example"
      },
      "Action": "lambda:InvokeFunctionUrl",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
      "Condition": {
        "StringEquals": {
          "lambda:FunctionUrlAuthType": "AWS_IAM"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::444455556666:role/example"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
      "Condition": {
        "Bool": {
          "lambda:InvokedViaFunctionUrl": "true"
        }
      }
    }
  ]
}
```

您可以按照以下步骤通过控制台创建这一基于资源的策略：

**将 URL 调用权限授予另一个账户（控制台）**

1. 打开 Lamba 控制台的[函数](https://console.aws.amazon.com/lambda/home#/functions)页面。

1. 选择要为其授予 URL 调用权限的函数的名称。

1. 选择 **Configuration**（配置）选项卡，然后选择 **Permissions**（权限）。

1. 在 **Resource-based policy**（基于资源的策略）下，选择 **Add permissions**（添加权限）。

1. 选择 **Function URL**（函数 URL）。

1. 对于 **Auth type**（身份验证类型），选择 **AWS\$1IAM**。

1. 输入策略语句的**语句 ID**。

1. 对于**主体**，请输入要向其授予权限的用户或角色的 Amazon 资源名称（ARN）。例如：**444455556666**。

1. 选择**保存**。

或者，也可以使用以下 [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) AWS Command Line Interface (AWS CLI) 命令创建此策略：使用 AWS CLI 时，必须单独添加 `lambda:InvokeFunctionUrl` 和 `lambda:InvokeFunction` 语句。例如：

```
aws lambda add-permission --function-name my-function \
  --statement-id UrlPolicyInvokeURL \
  --action lambda:InvokeFunctionUrl \
  --principal 444455556666 \
  --function-url-auth-type AWS_IAM
```

```
aws lambda add-permission --function-name my-function \
  --statement-id UrlPolicyInvokeFunction \
  --action lambda:InvokeFunction \
  --principal 444455556666 \
  --invoked-via-function-url
```

## 使用 `NONE` 身份验证类型
<a name="urls-auth-none"></a>

**重要**  
当您的函数 URL 身份验证类型为 `NONE` 且您有[基于资源的策略](access-control-resource-based.md)授予公有访问权限时，任何使用您函数 URL 的未经身份验证的用户都可以调用您的函数。

在某些情况下，您可能希望函数 URL 为公有。例如，您可能希望处理直接从 Web 浏览器发出的请求。要允许函数 URL 公有访问权限，请选择 `NONE` 身份验证类型。

如果选择 `NONE` 身份验证类型，Lambda 不会使用 IAM 对函数 URL 的请求进行身份验证。但是，函数必须拥有允许 `lambda:InvokeFunctionUrl` 和 `lambda:InvokeFunction` 的基于资源的策略。使用控制台或 AWS Serverless Application Model (AWS SAM) 创建具有身份验证类型 `NONE` 的函数 URL 时，Lambda 会自动创建基于资源的策略。如果直接使用 AWS CLI、AWS CloudFormation 或 Lambda API，则必须[自己添加策略](#policy-cli)。

我们建议在使用 `NONE` 身份验证类型时，在基于资源的策略中包含 [lambda:InvokedViaFunctionUrl](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html#lambda-AddPermission-request-InvokedViaFunctionUrl) 上下文键。此上下文键可确保只能通过函数 URL 调用函数，而不能通过其他调用方法进行调用。

请注意有关该策略的以下信息：
+ 所有实体均可调用 `lambda:InvokeFunctionUrl` 和 `lambda:InvokeFunction`。这意味着拥有函数 URL 的任何人都可以调用函数。
+ `lambda:FunctionUrlAuthType` 条件键值为 `NONE`。这意味着，此策略仅在函数 URL 的身份验证类型也为 `NONE` 时允许访问。
+ 该 `lambda:InvokedViaFunctionUrl` 条件可确保只能通过函数 URL 调用该函数，而不能通过其他调用方法进行调用。

**Example — NONE 身份验证类型默认基于资源的策略**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "FunctionURLAllowPublicAccess",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "lambda:InvokeFunctionUrl",
      "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
      "Condition": {
        "StringEquals": {
          "lambda:FunctionUrlAuthType": "NONE"
        }
      }
    },
    {
      "Sid": "FunctionURLInvokeAllowPublicAccess",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
      "Condition": {
        "Bool": {
          "lambda:InvokedViaFunctionUrl": "true"
        }
      }
    }
  ]
}
```

**使用 AWS CLI 创建基于资源的策略**  
除非使用控制台或 AWS SAM 创建身份验证类型为 `NONE` 的函数 URL，否则必须自己添加基于资源的策略。使用以下命令，创建 `lambda:InvokeFunctionUrl` 和 `lambda:InvokeFunction` 权限的语句。每条语句都必须添加到单独的命令中。

```
aws lambda add-permission \
  --function-name UrlTestFunction \
  --statement-id UrlPolicyInvokeURL \
  --action lambda:InvokeFunctionUrl \
  --principal * \
  --function-url-auth-type NONE
```

```
aws lambda add-permission \
  --function-name UrlTestFunction \
  --statement-id UrlPolicyInvokeFunction \
  --action lambda:InvokeFunction \
  --principal * \
  --invoked-via-function-url
```

**注意**  
如果您删除身份验证类型为 `NONE` 的函数 URL，Lambda 不会自动删除关联的基于资源的策略。如果要删除此策略，您必须手动执行该操作。

如果函数基于资源的策略未授予 `lambda:invokeFunctionUrl` 和 `lambda:InvokeFunction` 权限，则用户在尝试调用函数 URL 时，将收到 403 禁止的错误代码。即使函数 URL 使用 `NONE` 身份验证类型，也会发生这种情况。

## 治理和访问控制
<a name="urls-governance"></a>

除了函数 URL 调用权限外，还可以控制对用于配置函数 URL 的操作的访问。Lambda 支持以下针对函数 URL 的 IAM policy 操作：
+ `lambda:InvokeFunctionUrl` – 使用函数 URL 调用 Lambda 函数。
+ `lambda:CreateFunctionUrlConfig` – 创建函数 URL 并设置其 `AuthType`。
+ `lambda:UpdateFunctionUrlConfig` – 更新函数 URL 配置及其 `AuthType`。
+ `lambda:GetFunctionUrlConfig` – 查看函数 URL 的详细信息。
+ `lambda:ListFunctionUrlConfigs` – 列出函数 URL 配置。
+ `lambda:DeleteFunctionUrlConfig` – 删除函数 URL。

要允许或拒绝对其他 AWS 实体的函数 URL 访问，请在 IAM policy 中包含这些操作。例如，以下策略授予 AWS 账户 `444455556666` 中的 `example` 角色在账户 `123456789012` 中更新函数 **my-function** 的函数 URL 的权限。

**Example 跨账户函数 URL 策略**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": { 
                "AWS": "arn:aws:iam::444455556666:role/example"
            },
            "Action": "lambda:UpdateFunctionUrlConfig",
            "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function"
        }
    ]
}
```

### 条件键
<a name="urls-condition-keys"></a>

要对函数 URL 进行精细访问控制，请使用条件上下文键。Lambda 支持函数 URL 的以下上下文键：
+ `lambda:FunctionUrlAuthType` – 定义了一个枚举值，描述函数 URL 使用的身份验证类型。该值可以是 `AWS_IAM` 或 `NONE`。
+ `lambda:InvokedViaFunctionUrl` — 将 `lambda:InvokeFunction` 操作限制为通过函数 URL 进行调用。这可以确保只能使用函数 URL 调用该函数，而不能通过其他调用方法进行调用。有关使用 `lambda:InvokedViaFunctionUrl` 上下文键的基于资源的策略示例，请参阅[使用 `AWS_IAM` 身份验证类型](#urls-auth-iam)和[使用 `NONE` 身份验证类型](#urls-auth-none)中的示例。

可以在与函数关联的策略中使用这些上下文键。例如，您可能希望限制谁可以对函数 URL 进行配置更改。要拒绝对 URL 身份验证类型 `NONE` 的任何函数的所有 `UpdateFunctionUrlConfig` 请求，可以定义以下策略：

**Example 带有显式拒绝的函数 URL 策略**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action":[
                "lambda:UpdateFunctionUrlConfig"
            ],
            "Resource": "arn:aws:lambda:us-east-1:123456789012:function:*",
            "Condition": {
                "StringEquals": {
                    "lambda:FunctionUrlAuthType": "NONE"
                }
            }
        }
    ]
}
```

要授予 AWS 账户 `444455556666` 中的 `example` 角色对 URL 身份验证类型 `AWS_IAM` 的函数进行 `CreateFunctionUrlConfig` 和 `UpdateFunctionUrlConfig` 请求的权限，可以定义以下策略：

**Example 带有显式允许的函数 URL 策略**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": { 
                "AWS": "arn:aws:iam::444455556666:role/example"
            },
            "Action":[
                "lambda:CreateFunctionUrlConfig",
                "lambda:UpdateFunctionUrlConfig"
            ],
            "Resource": "arn:aws:lambda:us-east-1:123456789012:function:*",
            "Condition": {
                "StringEquals": {
                    "lambda:FunctionUrlAuthType": "AWS_IAM"
                }
            }
        }
    ]
}
```

您还可以在[服务控制策略](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)（SCP）中使用此条件键。使用 SCP 在 AWS Organizations 中管理整个企业的权限。例如，要拒绝用户创建或更新使用除 `AWS_IAM` 身份验证类型以外的任何身份验证类型的函数 URL，请使用以下服务控制策略：

**Example 带有显式拒绝的函数 URL SCP**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action":[
                "lambda:CreateFunctionUrlConfig",
                "lambda:UpdateFunctionUrlConfig"
            ],
            "Resource": "arn:aws:lambda:*:123456789012:function:*",
            "Condition": {
                "StringNotEquals": {
                    "lambda:FunctionUrlAuthType": "AWS_IAM"
                }
            }
        }
    ]
}
```