

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Lambda Web 函數許可
<a name="web-functions-permissions"></a>

Lambda Web Functions 使用 AWS Identity and Access Management (IAM) 來控制您的應用程式程式碼可執行的操作 （執行角色），以及誰可以存取您的 Web Function （以資源為基礎的政策）。此頁面說明如何設定每種類型。
+ **執行角色** – Web 函數程式碼擔任的 IAM 角色，用於存取 Amazon CloudWatch Logs、DynamoDB 或 Amazon S3 等 AWS 服務。
+ **資源型政策** – 連接至 Web 函數的政策。它定義哪些 IAM 主體 AWS 或服務可以執行 Web 函數動作，例如叫用身分驗證類型為 的端點`IamAuth`，這表示 Lambda 使用 IAM 驗證請求。如需詳細資訊，請參閱[身分驗證類型](web-functions-endpoints.md#web-functions-endpoint-auth)。另一個帳戶中的 IAM 主體也需要以身分為基礎的許可。

下圖顯示需要許可的身分，以及每個需要許可的用途。部署器會呼叫 Lambda 管理動作，並`iam:PassRole`需要執行角色。程式碼上傳程式`s3:PutObject`需要版本控制的 Amazon S3 儲存貯體，Lambda 會讀取程式碼物件版本。Lambda 可以使用選用的客戶受管 AWS KMS 金鑰來加密 Web 函數程式碼和環境變數。您的程式碼使用 執行角色執行，這會授予對 Amazon CloudWatch Logs 和您的相依性的存取權。端點發起`lambda:InvokeWebFunctionEndpoint`人需要`IamAuth`端點，或`ApplicationManaged`端點的應用程式登入資料。

![部署程式、程式碼上傳程式和端點呼叫者各自需要不同的許可，才能到達 Web 函數控制平面、Amazon S3 程式碼儲存貯體和執行環境。](https://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/web-functions-permissions-actors.png)


## 執行角色
<a name="web-functions-permissions-execution-role"></a>

執行角色是 Lambda 在執行 Web 函數程式碼時擔任的 IAM 角色。您的應用程式會使用此角色的許可與其他 AWS 服務互動。您的 Web 函數至少需要將日誌寫入 Amazon CloudWatch Logs 的許可，才能監控您的應用程式。如果您的應用程式從 DynamoDB 讀取、寫入 Amazon S3 或呼叫其他 AWS 服務，您可以將這些許可新增至執行角色。

### 建立執行角色
<a name="web-functions-permissions-execution-role-create"></a>

若要為您的 Web 函數建立執行角色，請建立具有信任政策的 IAM 角色，允許 Lambda 服務主體擔任該角色，並連接許可政策，以授予您應用程式所需的存取權。

**建立執行角色 (AWS CLI)**

1. `trust-policy.json` 使用下列信任政策建立名為 的檔案。此政策允許 Lambda 服務主體代表您擔任該角色。

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

1. 建立角色。

   ```
   aws iam create-role \
       --role-name {{my-web-function-role}} \
       --assume-role-policy-document file://trust-policy.json
   ```

1. 連接 AWS Lambda 基本執行角色受管政策。此政策授予許可，以建立日誌群組、日誌串流和將日誌事件寫入 Amazon CloudWatch Logs。

   ```
   aws iam attach-role-policy \
       --role-name {{my-web-function-role}} \
       --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
   ```

如果您偏好建立自訂許可政策，而不是使用 受管政策，則 Web 函數記錄所需的最低許可為：

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:{{us-east-1}}:{{111122223333}}:log-group:/aws/lambda/web/{{my-web-app}}:*",
                "arn:aws:logs:*:{{111122223333}}:log-group:/aws/lambda/web/{{my-web-app}}.local:*"
            ]
        }
    ]
}
```

此政策涵蓋兩個日誌群組。Lambda 會將區域內日誌寫入`.local`日誌群組，然後將它們集中到日誌群組中，而不需要主區域中的字尾。集中式日誌群組 ARN 使用主區域。`.local` ARN 使用區域萬用字元，因為 Lambda 會在端點提供流量的每個區域中寫入該群組。這可讓一個執行角色支援具有不同區域集的端點。如果角色無法寫入區域中的`.local`日誌群組，Lambda 不會從該區域交付日誌。如果您使用自訂日誌群組，請將這兩個 ARNs 取代為您的日誌群組名稱和日誌群組名稱，後面接著 `.local`。如需詳細資訊，請參閱[日誌群組](web-functions-logging.md#web-functions-logging-log-groups)。

### 新增其他服務的許可
<a name="web-functions-permissions-execution-role-additional"></a>

如果您的應用程式存取其他 AWS 服務，請將對應的許可新增至執行角色。下列範例新增對 DynamoDB 資料表的讀取存取權和對 Amazon S3 儲存貯體的寫入存取權。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:{{us-east-1}}:{{111122223333}}:log-group:/aws/lambda/web/{{my-web-app}}:*",
                "arn:aws:logs:*:{{111122223333}}:log-group:/aws/lambda/web/{{my-web-app}}.local:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:Query"
            ],
            "Resource": "arn:aws:dynamodb:{{us-east-1}}:{{111122223333}}:table/{{my-table}}"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::{{my-output-bucket}}/*"
        }
    ]
}
```

建立 Web 函數或修訂的 IAM 身分會使用自己的許可，而不是執行角色。該身分在執行角色`lambda:CreateWebFunctionRevision``iam:PassRole`上需要 `lambda:CreateWebFunction`或 ，以及對 Amazon S3 中部署套件的讀取存取權。如需 Amazon S3 許可，請參閱 [來電者許可](web-functions-code-s3.md#web-functions-code-s3-caller-permissions)。如果您使用客戶受管金鑰來加密 Web 函數程式碼和環境變數，則該身分也需要 AWS KMS 許可。如需詳細資訊，請參閱[Web 函數的靜態加密](web-functions-encryption.md)。

## 資源型政策
<a name="web-functions-permissions-resource-policy"></a>

資源型政策是您連接到 Web 函數的 JSON 政策文件。除了 `lambda:CreateWebFunction` IAM 主體 AWS 或服務之外，它可以授予任何 Web 函數動作。例如，它可以`lambda:InvokeWebFunctionEndpoint`授予 `IamAuth`端點。它也可以授予管理動作，例如 `lambda:GetWebFunction`、 `lambda:CreateWebFunctionRevision`和 `lambda:UpdateWebFunctionEndpoint`。

政策附件及其陳述式使用不同的資源 ARNs：
+ **Web 函數 ARN** – 將此 ARN 與 `PutResourcePolicy`、 `GetResourcePolicy`和 搭配使用`DeleteResourcePolicy`，並在 陳述式的 `Resource`元素中授予 Web 函數本身的動作，例如 `lambda:GetWebFunction`、 `lambda:CreateWebFunctionRevision`或 `lambda:CreateWebFunctionEndpoint`。例如 `arn:aws:lambda:us-east-1:111122223333:web-function/my-function`。對於現有端點上的動作，例如 `lambda:UpdateWebFunctionEndpoint`，請使用端點 ARN。對於現有修訂的動作，例如 `lambda:DeleteWebFunctionRevision`，請使用修訂 ARN。若要涵蓋 Web 函數的所有端點，請使用 `arn:aws:lambda:us-east-1:111122223333:web-function/my-function/endpoint/*`。
+ **端點 ARN** – 在授予 的政策陳述式的 `Resource`元素中使用此 ARN`lambda:InvokeWebFunctionEndpoint`。例如 `arn:aws:lambda:us-east-1:111122223333:web-function/my-function/endpoint/prod`。

對於相同帳戶中的 IAM 主體，主體的身分型政策或 Web 函數的資源型政策可以授予許可。對於另一個帳戶中的 IAM 主體，這兩個政策都必須授予許可。這同時適用於叫用和管理動作。

若要根據 Web 函數的標籤允許或拒絕動作，請使用屬性型存取控制 (ABAC)。如需支援的條件金鑰，請參閱 [標記 Web 函數](web-functions-configuration-tags.md)。

**注意**  
Web 函數不支援 `AddPermission`、 `RemovePermission`或 `GetPolicy`。使用 `PutResourcePolicy`、 `GetResourcePolicy`和 管理政策`DeleteResourcePolicy`。

在下列情況下使用資源型政策：
+ 您想要將調用存取權授予不同 AWS 帳戶 （跨帳戶調用） 中的委託人。
+ 您想要授予叫用存取 AWS 服務的權限，例如 CloudFront。
+ 您想要讓另一個 中的委託人 AWS 帳戶 管理 Web 函數，例如建立修訂或更新端點。
+ 對於相同帳戶調用，您無法修改發起人的 IAM 政策 （例如，當發起人由另一個團隊管理時）。

### 不允許公有政策
<a name="web-functions-permissions-resource-policy-public"></a>

您無法將公有資源型政策連接至 Web 函數。如果政策是公有的，請求會失敗並顯示 `ValidationException`。

在本節中，*公*有描述一個政策，授予對一組未指定委託人的存取權。它不會描述端點的網路可存取性或身分驗證類型。

**使政策公開的原因**

除非政策將可呼叫資源的人員限制為一組指定的委託人，否則政策為公有政策。Lambda 假設政策是公有的，然後評估其是否符合非公有條件。如果政策允許任何 AWS 客戶可以擔任的委託人，則政策為公有。最常見的案例是不受限制的萬用字元主體，如下列範例所示。Lambda 使用 拒絕此政策`ValidationException`。請勿使用它。

```
{
  "Effect": "Allow",
  "Principal": "*",
  "Action": "lambda:InvokeWebFunctionEndpoint",
  "Resource": "arn:aws:lambda:{{us-west-2}}:{{123456789012}}:web-function/{{my-web-function}}/endpoint/{{prod}}"
}
```

下列限制不會將政策設為非公有：
+ IP 地址條件。縮小`aws:SourceIp`至 CIDR 範圍還不夠。
+ 聯合委託人。命名聯合身分提供者的`Principal`區塊不會限制對一組指定良好的身分的存取。
+ 描述資源的條件索引鍵。端點的身分驗證類型等金鑰會描述資源的設定方式，而不是呼叫的人員，因此無法限制委託人。

有兩種方式可將政策設為非公有。

#### 在主體區塊中指定主體
<a name="web-functions-permissions-resource-policy-public-principals"></a>

在 `Principal`區塊中列出一或多個完全指定的主體。這些值不得包含萬用字元或政策變數。主體數量並不重要。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "{{123456789012}}",
      "{{111122223333}}"
    ]
  },
  "Action": "lambda:InvokeWebFunctionEndpoint",
  "Resource": "arn:aws:lambda:{{us-west-2}}:{{123456789012}}:web-function/{{my-web-function}}/endpoint/{{prod}}"
}
```

另一個帳戶中的 IAM 主體也需要身分型許可，才能叫用端點。

#### 使用信任的條件金鑰
<a name="web-functions-permissions-resource-policy-public-trusted-keys"></a>

將下列其中一個條件索引鍵限制為固定值。這些金鑰可識別已驗證的發起人，且無法由請求者設定。
+ `aws:PrincipalAccount`
+ `aws:PrincipalArn`
+ `aws:PrincipalOrgID`
+ `aws:PrincipalOrgPaths`
+ `aws:SourceAccount`
+ `aws:SourceArn`
+ `aws:SourceOrgID`
+ `aws:SourceOrgPaths`
+ `aws:SourceVpc`
+ `aws:SourceVpcArn`
+ `aws:SourceVpce`
+ `aws:VpceAccount`
+ `aws:VpceOrgID`
+ `aws:VpceOrgPaths`
+ `aws:Ec2InstanceSourceVpc`
+ `aws:UserId`
+ `aws:PrincipalServiceName`
+ `aws:PrincipalServiceNamesList`
+ `aws:PrincipalIsAWSService`
+ `lambda:SourceFunctionArn`

自行命名信任的金鑰並不足夠。您還必須限制 值：
+ 字串值不得包含萬用字元或政策變數。
+ ARN 值不得在 ARN 的前五個欄位中包含萬用字元或政策變數：`arn`、分割區、服務、區域和帳戶 ID。允許資源部分中的萬用字元。
+ `aws:PrincipalIsAWSService` 必須設定為 `true`。

下列政策會授予組織中的主體叫用端點所需的資源型許可，且不會視為公有。另一個帳戶中的 IAM 主體也需要以身分為基礎的許可。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowOrgAccess",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "lambda:InvokeWebFunctionEndpoint",
      "Resource": "arn:aws:lambda:{{us-west-2}}:{{123456789012}}:web-function/{{my-web-function}}/endpoint/{{prod}}",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalOrgID": "{{o-a1b2c3d4e5}}"
        }
      }
    }
  ]
}
```

### 跨帳戶存取權
<a name="web-functions-permissions-resource-policy-cross-account"></a>

下列資源型政策會授予另一個帳戶中的特定 IAM 角色許可，以叫用 Web 函數的一個端點。此角色也需要身分型許可，才能叫用端點。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowCrossAccountInvoke",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::{{444455556666}}:role/{{caller-role}}"
            },
            "Action": "lambda:InvokeWebFunctionEndpoint",
            "Resource": "arn:aws:lambda:{{us-east-1}}:{{111122223333}}:web-function/{{my-function}}/endpoint/{{prod}}"
        }
    ]
}
```

若要讓跨帳戶調用成功，下列所有項目都必須為 true：
+ 發起人的身分型政策會授予端點 ARN 的`lambda:InvokeWebFunctionEndpoint`許可。
+ Web 函數上的資源型政策會授予發起人許可 （如上所示）。
+ 端點使用`IamAuth`身分驗證，以便 Lambda 評估發起人的登入資料。

### 授予 AWS 服務的存取權
<a name="web-functions-permissions-resource-policy-service"></a>

下列資源型政策授予 CloudFront 服務主體叫用 Web 函數的許可。當您使用 Web 函數端點做為原始伺服器來設定 CloudFront 分佈時，請使用此政策。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowCloudFrontInvoke",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "lambda:InvokeWebFunctionEndpoint",
            "Resource": "arn:aws:lambda:{{us-east-1}}:{{111122223333}}:web-function/{{my-function}}/endpoint/{{prod}}",
            "Condition": {
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:cloudfront::{{111122223333}}:distribution/{{EDFDVBD6EXAMPLE}}"
                }
            }
        }
    ]
}
```

`aws:SourceArn` 條件限制對特定 CloudFront 分佈的存取。如果沒有此條件，任何帳戶中的任何 CloudFront 分佈都可以叫用您的 Web 函數。

### 複寫和最終一致性
<a name="web-functions-permissions-resource-policy-replication"></a>

當您在具有 **MultiRegion** 或 **PerRegion** 端點的 Web 函數上連接或更新資源型政策時，Lambda 會將政策複寫到 AWS 區域 端點操作的所有複本。此複寫最終一致。

在複寫時段期間，Lambda 可能會根據舊版政策評估複本區域中的請求。這表示：
+ 新增的許可可能不會立即在所有區域中生效。
+ 在複寫完成之前，Lambda 可能仍會遵守某些區域中最近移除的許可。

政策複寫沒有客戶可見的完成訊號。在依賴新政策之前，測試每個端點區域中預期的允許或拒絕行為。對於緊急遏制，更新流量路由，或將端點的 `throttleConfig.rateLimit` 設定為 `0` 在政策變更傳播時封鎖所有流量。如需詳細資訊，請參閱[限流](web-functions-scaling.md#web-functions-scaling-throttling)。

對於 **HomeRegion** 端點，政策僅適用於主要區域，不需要跨區域複寫。變更仍可能需要很短的時間才會生效。

## 設定聯網的許可
<a name="web-functions-permissions-networking"></a>

設定聯網的身分需要建立或更新相關 Lambda 資源的許可。它還需要許可才能傳遞所需的角色和連接器。視 操作而定，許可包括：
+ `lambda:CreateNetworkConnector`
+ `lambda:UpdateNetworkConnector`
+ `lambda:GetNetworkConnector`
+ `lambda:CreateWebFunction`
+ `lambda:CreateWebFunctionRevision`
+ `lambda:UpdateWebFunctionEndpoint`
+ `lambda:PassNetworkConnector`
+ `iam:PassRole`

每當 `create-web-function`或 `create-web-function-revision` 呼叫集 時，發起人必須在參考的連接器`lambda:PassNetworkConnector`上具有 `egressNetworkConnectorArn`。將此許可範圍限定為核准的連接器資源。範圍`iam:PassRole`為您在建立 Web 函數或修訂時傳遞的核准執行角色，以及您在建立或更新網路連接器時傳遞的核准運算子角色。如需 運算子角色許可政策，請參閱 [運算子角色許可](web-functions-networking.md#web-functions-networking-vpc-operator-role)。