

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

# 在 中管理許可 AWS Lambda
<a name="lambda-permissions"></a>

您可以使用 AWS Identity and Access Management (IAM) 來管理 中的許可 AWS Lambda。使用 Lambda 函數時，需要考慮兩個主要的許可類別：
+ Lambda 函數執行 API 動作和存取其他 AWS 資源所需的許可
+ 其他 AWS 使用者和實體存取 Lambda 函數所需的許可

Lambda 函數通常需要存取其他 AWS 資源，並對這些資源執行各種 API 操作。例如，您可能有一個 Lambda 函數，透過更新 Amazon DynamoDB 資料庫中的項目來回應事件。在這種情況下，函數需要存取資料庫的許可，以及在該資料庫中放置或更新項目的許可。

可以在稱為[執行角色](lambda-intro-execution-role.md)的特殊 IAM 角色中定義 Lambda 函數所需的許可。在此角色中，您可以連接政策，定義函數存取其他 AWS 資源所需的每個許可，以及從事件來源讀取。每個 Lambda 函數都必須擁有執行角色。您的執行角色必須至少能夠存取 Amazon CloudWatch，因為 Lambda 函數預設會記錄到 CloudWatch Logs。可以將 [`AWSLambdaBasicExecutionRole` 受管政策](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaBasicExecutionRole.html)連接至執行角色，以滿足此需求。

若要授予其他 AWS 帳戶、組織和服務存取 Lambda 資源的許可，您有幾個選項：
+ 您可以使用[身分型政策](access-control-identity-based.md)授予其他使用者對 Lambda 資源的存取權。以身分為基礎的政策可直接套用到使用者或與使用者相關連的群組和角色。
+ 您可以使用[以資源為基礎的政策](access-control-resource-based.md)，為其他帳戶提供存取 Lambda 資源的 AWS 服務 許可。當使用者嘗試存取 Lambda 資源時，Lambda 會同時考慮身分型政策 (針對使用者)，以及以資源型政策 (針對資源)。當 Amazon Simple Storage Service (Amazon S3) 之類的 AWS 服務呼叫您的 Lambda 函數時，Lambda 只會考慮以資源為基礎的政策。
+ 您可以使用[屬性型存取控制 (ABAC)](attribute-based-access-control.md) 模型來控制對 Lambda 函數的存取。透過 ABAC，您可以將標籤連接至 Lambda 函數、在特定 API 請求中傳遞標籤，或將其連接至提出請求的 IAM 主體。在 IAM 政策的條件元素中指定相同的標籤以控制函數存取。

在 中 AWS，最佳實務是僅授予執行任務所需的許可 ([最低權限許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege))。若要在 Lambda 中實作此功能，建議從 [AWS 受管政策](permissions-managed-policies.md)開始。您可以依原狀使用這些受管政策，或將其作為起點，撰寫限制程度更高的專屬政策。

為了協助您微調最低權限存取許可，Lambda 提供了一些其他條件，可供您包含在政策中。如需詳細資訊，請參閱[微調政策的資源和條件區段](lambda-api-permissions-ref.md)。

如需 IAM 的詳細資訊，請參閱《*[IAM 使用者指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)*》。

# 使用執行角色定義 Lambda 函數許可
<a name="lambda-intro-execution-role"></a>

Lambda 函數的執行角色是 AWS Identity and Access Management (IAM) 角色，授予函數存取 AWS 服務 和資源的許可。例如，您可以建立一個執行角色，該角色有權向 Amazon CloudWatch 傳送日誌並向 AWS X-Ray上傳追蹤資料。本頁提供有關如何建立、檢視和管理 Lambda 函數執行角色的資訊。

當您調用函數時，Lambda 會自動擔任您的執行角色。您應該避免在函數程式碼中手動呼叫 `sts:AssumeRole` 以承擔執行角色。如果您的使用案例請求角色擔任自己，則您必須將角色本身作為受信任主體包含在角色的信任政策中。如需如何修改角色信任政策的詳細資訊，請參閱《IAM 使用者指南》中的[修改角色信任政策 (主控台)](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-managingrole_edit-trust-policy)。

為了讓 Lambda 能夠正確擔任執行角色，角色的[信任政策](#permissions-executionrole-api)必須將 Lambda 服務主體 (`lambda.amazonaws.com`) 指定為受信任的服務。

**Topics**
+ [

## 在 IAM 主控台中建立執行角色
](#permissions-executionrole-console)
+ [

## 使用 建立和管理角色 AWS CLI
](#permissions-executionrole-api)
+ [

## 為 Lambda 執行角色授予最低權限存取權
](#permissions-executionrole-least-privilege)
+ [

# 在執行角色中檢視和更新許可
](permissions-executionrole-update.md)
+ [

# 在執行角色中使用 AWS 受管政策
](permissions-managed-policies.md)
+ [

# 使用來源函數 ARN 控制函數存取行為
](permissions-source-function-arn.md)

## 在 IAM 主控台中建立執行角色
<a name="permissions-executionrole-console"></a>

根據預設，當您[在 Lambda 主控台中建立函數時](getting-started.md#getting-started-create-function)，Lambda 會建立具有最低許可的執行角色。具體而言，此執行角色包含 [`AWSLambdaBasicExecutionRole` 受管政策](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaBasicExecutionRole.html)，該政策會授予您的函數將事件記錄到 Amazon CloudWatch Logs 的基本許可。您可以在**許可**區段中選取**建立預設角色**。

您可以在**許可**區段中選取**使用另一個角色，以選擇現有角色**。如果您的 Lambda 函數需要額外許可來執行任務，例如更新 Amazon DynamoDB 資料庫中的項目以回應事件，您可以建立具有必要許可的自訂執行角色。若要這樣做，請在**許可**區段中選取**使用另一個角色**，這會開啟一個抽屜，您可以在其中自訂許可。

**從主控台設定執行角色**

1. 在**角色詳細資訊區段中輸入角色名稱**。

1. 在**政策**區段中，選取**使用現有政策**。

1. 選取您要連接到角色的 AWS 受管政策。例如，如果您的函數需要存取 DynamoDB，請選取 **AWSLambdaDynamoDBExecutionRole** 受管政策。

1. 選擇建**立角色**。

或者，當您[在 Lambda 主控台中建立函數](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function)時，您可以將先前建立的任何執行角色連接到函數。如果您想要將新的執行角色連接到現有的函數，請遵循[更新函數的執行角色](permissions-executionrole-update.md)中的步驟。

## 使用 建立和管理角色 AWS CLI
<a name="permissions-executionrole-api"></a>

若要使用 AWS Command Line Interface (AWS CLI) 建立執行角色，請使用 **create-role**命令。使用此命令時，您可以指定內嵌信任政策。角色的信任政策授予指定主體擔任該角色的許可。在下列範例中，您授予 Lambda 服務主體擔任您的角色的許可。注意，JSON 字串中轉義引號的請求有所不同，這取決於您的 shell。

```
aws iam create-role \
  --role-name lambda-ex \
  --assume-role-policy-document '{"Version": "2012-10-17",		 	 	 "Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'
```

您也可使用單獨的 JSON 檔案來定義角色的信任政策。在下列範例中，`trust-policy.json` 為當前目錄中的檔案。

**Example trust-policy.json**    
****  

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

```
aws iam create-role \
  --role-name lambda-ex \
  --assume-role-policy-document file://trust-policy.json
```

使用 **attach-policy-to-role** 命令將許可新增至角色。下列命令可將 `AWSLambdaBasicExecutionRole` 受管政策新增至 `lambda-ex` 執行角色。

```
aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
```

建立執行角色之後，將其連接至您的函數。當您[在 Lambda 主控台中建立函數](getting-started.md#getting-started-create-function)時，可以將先前建立的任何執行角色連接至該函數。如果您想要將新的執行角色連接至現有函數，請遵循[更新函數的執行角色](permissions-executionrole-update.md#update-execution-role)中的步驟。

## 為 Lambda 執行角色授予最低權限存取權
<a name="permissions-executionrole-least-privilege"></a>

當您第一次為 Lambda 函數建立 IAM 角色時，有時可能會授予超出所需的許可。在生產環境中發佈您的函數之前，最佳實務是調整政策以僅包含必要的許可。如需詳細資訊，請參閱《IAM 使用者指南》**中的[套用最低權限許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。

使用 IAM Access Analyzer 來協助識別 IAM 執行角色政策的必要許可。IAM Access Analyzer 會在您指定的日期範圍內檢閱您的 AWS CloudTrail 日誌，並產生僅具有該函數在此期間使用之許可的政策範本。您可以使用範本建立具有精細許可的受管政策，然後將其連接至 IAM 角色。如此一來，您只會授予角色與特定使用案例 AWS 的資源互動所需的許可。

如需詳細資訊，請參閱《IAM 使用者指南》**中的[根據存取活動產生政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_generate-policy.html)。

# 在執行角色中檢視和更新許可
<a name="permissions-executionrole-update"></a>

本主題涵蓋如何檢視和更新函數的[執行角色](lambda-intro-execution-role.md)。

**Topics**
+ [

## 檢視函數的執行角色
](#view-execution-role)
+ [

## 更新函數的執行角色
](#update-execution-role)

## 檢視函數的執行角色
<a name="view-execution-role"></a>

若要檢視函數的執行角色，請使用 Lambda 主控台。

**若要檢視函數的執行角色 (主控台)**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇函數的名稱。

1. 選擇 **組態** ，然後選擇 **許可** 。

1. 在**執行角色**下，您可以檢視目前用作函數執行角色的角色。為了方便起見，您可以在**資源摘要**區段下檢視函數可以存取的所有資源和動作。也可以從下拉式清單中選擇一種服務，以查看與該服務相關的許可。

## 更新函數的執行角色
<a name="update-execution-role"></a>

您可以隨時從函式的執行角色新增或移除許可，或將函式設定為使用不同的角色。如果您的函數需要存取任何其他服務或資源，您必須將必要的許可新增至執行角色。

將許可新增至您的函數時，亦請對其程式碼或組態進行細微更新。若您函數的執行中執行個體具有已過期的憑證，上述動作會強制停止並取代這些執行個體。

若要更新函數的執行角色，可以使用 Lambda 主控台。

**若要更新函數的執行角色 (主控台)**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇函數的名稱。

1. 選擇 **組態** ，然後選擇 **許可** 。

1. 在**執行角色**下面，選擇**編輯**。

1. 如果您想要更新您的函數以使用其他角色做為執行角色，請在**現有角色**下的下拉式功能表中選擇新角色。
**注意**  
如果您想要更新現有執行角色中的許可，您只能在 AWS Identity and Access Management (IAM) 主控台中執行。

   如果您想要建立新的角色以用作執行角色，請選擇**從執行角色下的 AWS 政策範本建立新****角色**。然後，在**角色名稱**下輸入新角色的名稱，並在**政策範本**下指定要連接至新角色的任何政策。

1. 選擇 **Save** (儲存)。

# 在執行角色中使用 AWS 受管政策
<a name="permissions-managed-policies"></a>

下列 AWS 受管政策提供使用 Lambda 功能所需的許可。


| 變更 | 描述 | 日期 | 
| --- | --- | --- | 
|  **[ AWSLambdaMSKExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaMSKExecutionRole)** – Lambda 已將 [kafka:DescribeClusterV2](https://docs.aws.amazon.com/MSK/2.0/APIReference/v2-clusters-clusterarn.html#v2-clusters-clusterarnget) 許可新增至此政策。  |  `AWSLambdaMSKExecutionRole` 授予從 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 叢集中讀取和存取記錄、管理彈性網絡介面 (ENI)，和寫入 CloudWatch Logs 的許可。  |  2022 年 6 月 17 日  | 
|  **[AWSLambdaBasicExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole)** – Lambda 開始追蹤對此政策的變更。  |  `AWSLambdaBasicExecutionRole` 授予將日誌上傳至 CloudWatch 的許可。  |  2022 年 2 月 14 日  | 
|  **[AWSLambdaDynamoDBExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole)** – Lambda 開始追蹤對此政策的變更。  |  `AWSLambdaDynamoDBExecutionRole` 授予從 Amazon DynamoDB 串流讀取記錄和寫入 CloudWatch Logs 的許可。  |  2022 年 2 月 14 日  | 
|  **[AWSLambdaKinesisExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaKinesisExecutionRole)** – Lambda 開始追蹤對此政策的變更。  |  `AWSLambdaKinesisExecutionRole` 授予從 Amazon Kinesis 資料串流讀取事件和寫入 CloudWatch Logs 的許可。  |  2022 年 2 月 14 日  | 
|  **[AWSLambdaMSKExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaMSKExecutionRole)** – Lambda 開始追蹤對此政策的變更。  |  `AWSLambdaMSKExecutionRole` 授予從 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 叢集中讀取和存取記錄、管理彈性網絡介面 (ENI)，和寫入 CloudWatch Logs 的許可。  |  2022 年 2 月 14 日  | 
|  **[AWSLambdaSQSQueueExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaSQSQueueExecutionRole)** – Lambda 開始追蹤對此政策的變更。  |  `AWSLambdaSQSQueueExecutionRole` 授予從 Amazon Simple Queue Service (Amazon SQS) 佇列中讀取訊息並寫入 CloudWatch Logs 的許可。  |  2022 年 2 月 14 日  | 
|  **[AWSLambdaVPCAccessExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole)** – Lambda 開始追蹤對此政策的變更。  |  `AWSLambdaVPCAccessExecutionRole` 授予管理 Amazon VPC 內 ENI 和寫入 CloudWatch Logs 的許可。  |  2022 年 2 月 14 日  | 
|  **[AWSXRayDaemonWriteAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess)** – Lambda 開始追蹤對此政策的變更。  |  `AWSXRayDaemonWriteAccess` 授予將追蹤資料上傳至 X-Ray 的許可。  |  2022 年 2 月 14 日  | 
|  **[CloudWatchLambdaInsightsExecutionRolePolicy](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/CloudWatchLambdaInsightsExecutionRolePolicy)** – Lambda 開始追蹤對此政策的變更。  |  `CloudWatchLambdaInsightsExecutionRolePolicy` 授予將執行時間指標寫入 CloudWatch Lambda Insights 的許可。  |  2022 年 2 月 14 日  | 
|  **[AmazonS3ObjectLambdaExecutionRolePolicy](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AmazonS3ObjectLambdaExecutionRolePolicy)** – Lambda 開始追蹤對此政策的變更。  |  `AmazonS3ObjectLambdaExecutionRolePolicy` 會授予許可，以與 Amazon Simple Storage Service (Amazon S3) 物件 Lambda 互動，並寫入 CloudWatch Logs。  |  2022 年 2 月 14 日  | 

針對某些功能，Lambda 主控台會嘗試將遺漏的許可新增到您客戶受管政策中的執行角色。這些政策的數量可能會相當多。請在啟用功能前將相關受 AWS 管理˙政策新增到您的執行角色，以避免建立額外政策。

當您使用[事件來源映射](invocation-eventsourcemapping.md)來調用函數時，Lambda 會使用執行角色來讀取事件資料。例如，Kinesis 的事件來源映射會從資料串流讀取事件，並將這些事件批次傳送到函數。

當服務在您的帳戶中擔任角色時，您可以在角色信任政策中包含 `aws:SourceAccount` 和 `aws:SourceArn` 全域條件內容金鑰，以將角色的存取限制為僅由預期資源產生的請求。如需詳細資訊，請參閱 [AWS Security Token Service的預防跨服務混淆代理人](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html#cross-service-confused-deputy-prevention)。

除了 AWS 受管政策之外，Lambda 主控台還提供範本，用於建立具有其他使用案例許可的自訂政策。當您在 Lambda 主控台中建立函數時，您可以選擇使用來自一個或多個範本的許可建立新的執行角色。當您從藍圖建立函式時，或是您設定需要存取其他服務的選項時，也會自動套用這些範本。範例範本可在此指南的 [GitHub 儲存庫](https://github.com/awsdocs/aws-lambda-developer-guide/tree/master/iam-policies)取得。

# 使用來源函數 ARN 控制函數存取行為
<a name="permissions-source-function-arn"></a>

您的 Lambda 函數程式碼通常會向其他 AWS 服務發出 API 請求。若要提出這些請求，Lambda 會擔任函數的執行角色，以產生一組暫時性憑證。這些憑證在函數調用期間可當成環境變數使用。使用 AWS SDK 時，您不需要直接在程式碼中提供 SDK 的憑證。根據預設，憑證提供者鏈會依序檢查您可以設定憑證的每個位置，並選取第一個可用的位置，通常是環境變數 (`AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY` 和 `AWS_SESSION_TOKEN`)。

如果請求是來自您執行環境內的 AWS API 請求，Lambda 會將來源函數 ARN 注入登入資料內容。針對 Lambda 代表您在執行環境外發出的下列 AWS API 請求，Lambda 也會插入來源函數 ARN：


| 服務 | Action | Reason | 
| --- | --- | --- | 
| CloudWatch Logs | CreateLogGroup, CreateLogStream, PutLogEvents |  將日誌儲存到 CloudWatch Logs 日誌群組中  | 
| X-Ray | PutTraceSegments |  將追蹤資料傳送到 X-Ray  | 
| Amazon EFS | ClientMount |  將函數連接到 Amazon Elastic File System (Amazon EFS) 檔案系統  | 

Lambda 使用相同執行角色在執行環境之外代表您進行的其他 AWS API 呼叫不包含來源函數 ARN。這類執行環境外的 API 呼叫範例包括：
+ 呼叫 AWS Key Management Service (AWS KMS) 以自動加密和解密您的環境變數。
+ 對 Amazon Elastic Compute Cloud (Amazon EC2) 發出的呼叫，目的是為已啟用 VPC 的函數建立彈性網絡介面 (ENI)。
+ 呼叫 AWS 服務，例如 Amazon Simple Queue Service (Amazon SQS)，從設定為事件來源[映射的事件來源](invocation-eventsourcemapping.md)讀取。

您可以使用憑證內容中的來源函數 ARN，驗證對資源的呼叫是否來自特定 Lambda 函數的程式碼。若要驗證這一點，請在 IAM 身分型政策或[服務控制政策 (SCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) 中使用 `lambda:SourceFunctionArn` 條件索引鍵。

**注意**  
您無法在資源型政策中使用 `lambda:SourceFunctionArn` 條件索引鍵。

在您的身分型政策或 SCP 中使用此條件索引鍵，您可以為函數程式碼對其他 AWS 服務進行的 API 操作實作安全控制。此操作具有一些關鍵的安全保護作用，例如，協助您識別憑證洩漏的來源。

**注意**  
`lambda:SourceFunctionArn` 條件索引鍵與 `lambda:FunctionArn` 和 `aws:SourceArn` 條件索引鍵不同。`lambda:FunctionArn` 條件索引鍵僅適用於[事件來源映射](invocation-eventsourcemapping.md)，會協助定義您的事件來源可以呼叫哪些函數。`aws:SourceArn` 條件索引鍵僅適用於 Lambda 函數是目標資源的政策，並有助於定義哪些其他 AWS 服務 和資源可以叫用該函數。`lambda:SourceFunctionArn` 條件索引鍵可套用至任何身分型政策或 SCP，以定義具有對其他資源進行特定 AWS API 呼叫許可的特定 Lambda 函數。

若要在政策中使用 `lambda:SourceFunctionArn`，請將其作為任何 [ARN 條件運算子](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN)的條件，納入到政策中。索引鍵的值必須為有效的 ARN。

例如，假設您的 Lambda 函數程式碼會進行 `s3:PutObject` 呼叫，該呼叫以特定 Amazon S3 儲存貯體為目標。您可能希望僅允許一個特定 Lambda 函數擁有對該儲存貯體的 `s3:PutObject` 存取權。在此情況下，您函數的執行角色應連接有類似以下的政策：

**Example 授予特定 Lambda 函數存取權以存取 Amazon S3 資源的政策**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ExampleSourceFunctionArn",
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::lambda_bucket/*",
            "Condition": {
                "ArnEquals": {
                    "lambda:SourceFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:source_lambda"
                }
            }
        }
    ]
}
```

此政策僅在來源為具有 ARN `arn:aws:lambda:us-east-1:123456789012:function:source_lambda` 的 Lambda 函數時允許 `s3:PutObject` 存取權。此政策不允許對任何其他呼叫身分的 `s3:PutObject` 存取權。即使不同函數或實體以相同執行角色進行 `s3:PutObject` 呼叫也是如此。

**注意**  
`lambda:SourceFunctionARN` 條件索引鍵不支援 Lambda 函數版本或函數別名。如果您將 ARN 用於特定函數版本或別名，則您的函數將無權執行您指定的動作。務必為您的函數使用不符資格的 ARN，而不使用版本或別名後綴。

您也可以在 SCP 中使用 `lambda:SourceFunctionArn`。例如，假設您要僅讓單一 Lambda 函數的程式碼或來自 Amazon 虛擬私有雲端 (VPC) 的呼叫能存取儲存貯體。以下 SCP 對此進行說明。

**Example 在特定條件下拒絕對 Amazon S3 的存取的政策**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "s3:*"
            ],
            "Resource": "arn:aws:s3:::lambda_bucket/*",
            "Effect": "Deny",
            "Condition": {
                "StringNotEqualsIfExists": {
                    "aws:SourceVpc": [
                        "vpc-12345678"
                    ]
                }
            }
        },
        {
            "Action": [
                "s3:*"
            ],
            "Resource": "arn:aws:s3:::lambda_bucket/*",
            "Effect": "Deny",
            "Condition": {
                "ArnNotEqualsIfExists": {
                    "lambda:SourceFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:source_lambda"
                }
            }
        }
    ]
}
```

除非 S3 動作來自具有 ARN `arn:aws:lambda:*:123456789012:function:source_lambda` 的特定 Lambda 函數，或是其來自指定的 VPC，否則此政策會拒絕所有 S3 動作。僅在請求中包含 `aws:SourceVpc` 索引鍵時，`StringNotEqualsIfExists` 運算子才會告訴 IAM 處理此條件。同樣地，僅在 `lambda:SourceFunctionArn` 存在時，IAM 才會考慮 `ArnNotEqualsIfExists` 運算子。

# 授予其他 AWS 實體存取 Lambda 函數的權限
<a name="permissions-granting-access"></a>

若要授予其他 AWS 帳戶、組織和服務存取 Lambda 資源的許可，您有幾個選項：
+ 您可以使用[身分型政策](access-control-identity-based.md)授予其他使用者對 Lambda 資源的存取權。以身分為基礎的政策可直接套用到使用者或與使用者相關連的群組和角色。
+ 您可以使用[以資源為基礎的政策](access-control-resource-based.md)，為其他帳戶提供存取 Lambda 資源的 AWS 服務 許可。當使用者嘗試存取 Lambda 資源時，Lambda 會同時考慮身分型政策 (針對使用者)，以及以資源型政策 (針對資源)。當 Amazon Simple Storage Service (Amazon S3) 之類的 AWS 服務呼叫您的 Lambda 函數時，Lambda 只會考慮以資源為基礎的政策。
+ 您可以使用[屬性型存取控制 (ABAC)](attribute-based-access-control.md) 模型來控制對 Lambda 函數的存取。透過 ABAC，您可以將標籤連接至 Lambda 函數、在特定 API 請求中傳遞標籤，或將其連接至提出請求的 IAM 主體。在 IAM 政策的條件元素中指定相同的標籤以控制函數存取。

為了協助您微調最低權限存取許可，Lambda 提供了一些其他條件，可供您包含在政策中。如需詳細資訊，請參閱[微調政策的資源和條件區段](lambda-api-permissions-ref.md)。

# Lambda 適用的身分型 IAM 政策
<a name="access-control-identity-based"></a>

您可以在 AWS Identity and Access Management (IAM) 中使用身分型政策來授予帳戶中的使用者 Lambda 的存取權。身分型政策可套用至使用者、使用者群組或角色。您可以授予另一個帳戶的使用者許可，讓他們可以擔任您帳戶中的角色並存取 Lambda 資源。

Lambda 提供 AWS 受管政策，授予 Lambda API 動作的存取權，以及在某些情況下，其他用於開發和管理 Lambda 資源的 AWS 服務存取權。Lambda 會視需要更新這些受管政策，來確保您的使用者可在新功能發行時進行存取。
+ [AWSLambda\$1FullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambda_FullAccess.html) - 對於用於開發和維護 Lambda 資源的 Lambda 動作和其他 AWS 服務，授予完整存取權限。
+ [AWSLambda\$1ReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambda_ReadOnlyAccess.html) - 授予 Lambda 資源的唯讀存取權限。
+ [AWSLambdaRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaRole.html) - 授予調用 Lambda 函數的許可。

AWS 受管政策授予 API 動作的許可，而不限制使用者可以修改的 Lambda 函數或層。如需進行更精細的控制，您可以建立自己的政策，來限制使用者的許可範圍。

**Topics**
+ [

# 授予使用者對 Lambda 函數的存取權
](permissions-user-function.md)
+ [

# 授予使用者對 Lambda 層的存取權
](permissions-user-layer.md)

# 授予使用者對 Lambda 函數的存取權
<a name="permissions-user-function"></a>

使用[身分型政策](access-control-identity-based.md)以允許使用者、使用者群組或角色對 Lambda 函數執行操作。

**注意**  
對於定義為容器映像的函數，存取映像的使用者許可必須在 Amazon Elastic Container Registry (Amazon ECR) 中設定。如需範例，請參閱 [Amazon ECR 儲存庫政策](images-create.md#configuration-images-permissions)。

以下顯示具受限範圍之許可政策的範例。這可讓使用者建立和管理以指定字首 (`intern-`) 命名並以指定執行角色設定的 Lambda 函數。

**Example 函數開發政策**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ReadOnlyPermissions",
            "Effect": "Allow",
            "Action": [
                "lambda:GetAccountSettings",
                "lambda:GetEventSourceMapping",
                "lambda:GetFunction",
                "lambda:GetFunctionConfiguration",
                "lambda:GetFunctionCodeSigningConfig",
                "lambda:GetFunctionConcurrency",
                "lambda:ListEventSourceMappings",
                "lambda:ListFunctions",
                "lambda:ListTags",
                "iam:ListRoles"
            ],
            "Resource": "*"
        },
        {
            "Sid": "DevelopFunctions",
            "Effect": "Allow",
            "NotAction": [
                "lambda:AddPermission",
                "lambda:PutFunctionConcurrency"
            ],
            "Resource": "arn:aws:lambda:*:*:function:intern-*"
        },
        {
            "Sid": "DevelopEventSourceMappings",
            "Effect": "Allow",
            "Action": [
                "lambda:DeleteEventSourceMapping",
                "lambda:UpdateEventSourceMapping",
                "lambda:CreateEventSourceMapping"
            ],
            "Resource": "*",
            "Condition": {
                "ArnLike": {
                    "lambda:FunctionArn": "arn:aws:lambda:*:*:function:intern-*"
                }
            }
        },
        {
            "Sid": "PassExecutionRole",
            "Effect": "Allow",
            "Action": [
                "iam:ListRolePolicies",
                "iam:ListAttachedRolePolicies",
                "iam:GetRole",
                "iam:GetRolePolicy",
                "iam:PassRole",
                "iam:SimulatePrincipalPolicy"
            ],
            "Resource": "arn:aws:iam::*:role/intern-lambda-execution-role"
        },
        {
            "Sid": "ViewLogs",
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/intern-*"
        }
    ]
}
```

會根據許可支援的[資源和條件](lambda-api-permissions-ref.md)來將此政策中的許可組織為陳述式。
+ `ReadOnlyPermissions` - Lambda 主控台會在您瀏覽和檢視函數時使用這些許可。他們不支援資源模式或條件。

  ```
              "Action": [
                  "lambda:GetAccountSettings",
                  "lambda:GetEventSourceMapping",
                  "lambda:GetFunction",
                  "lambda:GetFunctionConfiguration",           
                  "lambda:GetFunctionCodeSigningConfig",
                  "lambda:GetFunctionConcurrency",                
                  "lambda:ListEventSourceMappings",
                  "lambda:ListFunctions",      
                  "lambda:ListTags",
                  "iam:ListRoles"
              ],
              "Resource": "*"
  ```
+ `DevelopFunctions` - 使用會對字首為 `intern-` 的函數進行操作的 Lambda 動作 (除了 `AddPermission` 和 `PutFunctionConcurrency`)。`AddPermission` 會在該函數中修改[以資源為基礎的政策](access-control-resource-based.md)，並且可能會產生安全隱憂。`PutFunctionConcurrency` 會為某函數保留擴展容量並可從其他函數取走容量。

  ```
              "NotAction": [
                  "lambda:AddPermission",
                  "lambda:PutFunctionConcurrency"
              ],
              "Resource": "arn:aws:lambda:*:*:function:intern-*"
  ```
+ `DevelopEventSourceMappings` – 在字首為 `intern-` 的函數上管理事件來源映射。這些動作會在事件來源映射上操作，但您可以使用*條件*來依函數進行限制。

  ```
              "Action": [
                  "lambda:DeleteEventSourceMapping",
                  "lambda:UpdateEventSourceMapping",
                  "lambda:CreateEventSourceMapping"
              ],
              "Resource": "*",
              "Condition": {
                  "StringLike": {
                      "lambda:FunctionArn": "arn:aws:lambda:*:*:function:intern-*"
                  }
              }
  ```
+ `PassExecutionRole` - 檢視並僅傳遞名為 `intern-lambda-execution-role` 的角色，必須由具有 IAM 許可的使用者建立和管理該角色。當您將執行角色指派至函數時就會用到 `PassRole`。

  ```
              "Action": [
                  "iam:ListRolePolicies",
                  "iam:ListAttachedRolePolicies",
                  "iam:GetRole",
                  "iam:GetRolePolicy",
                  "iam:PassRole",
                  "iam:SimulatePrincipalPolicy"
              ],
              "Resource": "arn:aws:iam::*:role/intern-lambda-execution-role"
  ```
+ `ViewLogs` - 使用 CloudWatch Logs 來檢視字首為 `intern-` 的函數的日誌。

  ```
              "Action": [
                  "logs:*"
              ],
              "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/intern-*"
  ```

此政策可讓使用者開始使用 Lambda，而不需使其他使用者的資源承受風險。它不允許使用者設定由 觸發的函數或呼叫其他 AWS 服務，這需要更廣泛的 IAM 許可。這也不包含對不支援 CloudWatch 和 X-Ray 這類範圍受限政策之服務的許可。對這些服務使用唯讀政策來為使用者提供指標和追蹤資料的存取。

當您為函數設定觸發時，您需要存取 ，才能使用叫用函數 AWS 的服務。例如，若要設定 Amazon S3 觸發，您需要使用 Amazon S3 動作的許可來管理儲存貯體通知。這些許可包含在 [AWSLambda\$1FullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambda_FullAccess.html) 受管政策中。

# 授予使用者對 Lambda 層的存取權
<a name="permissions-user-layer"></a>

使用[身分型政策](access-control-identity-based.md)以允許使用者、使用者群組或角色對 Lambda 層執行操作。下列政策授予使用者建立 layer 以及搭配函數使用的許可。資源模式允許使用者使用任何 AWS 區域 和任何 layer 版本，只要 layer 的名稱以 開頭`test-`即可。

**Example 圖層開發政策**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "PublishLayers",
            "Effect": "Allow",
            "Action": [
                "lambda:PublishLayerVersion"
            ],
            "Resource": "arn:aws:lambda:*:*:layer:test-*"
        },
        {
            "Sid": "ManageLayerVersions",
            "Effect": "Allow",
            "Action": [
                "lambda:GetLayerVersion",
                "lambda:DeleteLayerVersion"
            ],
            "Resource": "arn:aws:lambda:*:*:layer:test-*:*"
        }
    ]
}
```

您也可以使用 `lambda:Layer` 條件來在函數建立和設定期間強制執行 layer 的使用。例如，您可以防止使用者使用其他帳戶發佈的 layer。下列政策會將條件新增至 `CreateFunction`，且 `UpdateFunctionConfiguration` 動作需要來自帳戶 `123456789012` 指定的任何 layer。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ConfigureFunctions",
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:UpdateFunctionConfiguration"
            ],
            "Resource": "*",
            "Condition": {
                "ForAllValues:StringLike": {
                    "lambda:Layer": [
                        "arn:aws:lambda:*:123456789012:layer:*:*"
                    ]
                }
            }
        }
    ]
}
```

------

若要確保條件是否套用，請確認沒有其他陳述式授予使用者這些動作的許可。

# 在 Lambda 中檢視資源型 IAM 政策
<a name="access-control-resource-based"></a>

Lambda 支援對 Lambda 函數和層使用資源型許可政策。您可以使用資源型政策，將存取權授予其他 [AWS 帳戶](permissions-function-cross-account.md)、[組織](permissions-function-organization.md)或[服務](permissions-function-services.md)。以資源為基礎的政策適用於單一函式、版本、別名或 layer 版本。

------
#### [ Console ]

**檢視函式以資源為基礎的政策**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇一個函數。

1. 選擇 **Configuration** (組態)，然後選擇 **Permissions** (權限)。

1. 向下捲動至 **Resource-based policy (資源型政策)**，然後選擇 **View policy document (檢視政策文件)**。以資源為基礎的政策會顯示當另一個帳戶 AWS 或服務嘗試存取 函數時所套用的許可。下列範例顯示的陳述式允許 Amazon S3 針對帳戶 `123456789012` 中名稱為 `amzn-s3-demo-bucket` 的儲存貯體，叫用名為 `my-function` 的函數。  
**Example 資源型政策**    
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Id": "default",
       "Statement": [
           {
               "Sid": "lambda-allow-s3-my-function",
               "Effect": "Allow",
               "Principal": {
                 "Service": "s3.amazonaws.com"
               },
               "Action": "lambda:InvokeFunction",
               "Resource":  "arn:aws:lambda:us-east-2:123456789012:function:my-function",
               "Condition": {
                 "StringEquals": {
                   "AWS:SourceAccount": "123456789012"
                 },
                 "ArnLike": {
                   "AWS:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket"
                 }
               }
           }
        ]
   }
   ```

------
#### [ AWS CLI ]

若要檢查函式的以資源為基礎的政策，請使用 `get-policy` 命令。

```
aws lambda get-policy \
  --function-name my-function \
  --output text
```

您應該會看到下列輸出：

****  

```
{"Version":"2012-10-17",		 	 	 "Id":"default","Statement":[{"Sid":"sns","Effect":"Allow","Principal":{"Service":"s3.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function","Condition":{"ArnLike":{"AWS:SourceArn":"arn:aws:sns:us-east-2:123456789012:lambda*"}}}]}
```

針對版本和別名，在函式名稱的後方附加版本編號或別名。

```
aws lambda get-policy --function-name my-function:PROD
```

若要將許可從函式中移除，請使用 `remove-permission`。

```
aws lambda remove-permission \
  --function-name example \
  --statement-id sns
```

使用 `get-layer-version-policy` 指令檢視層級上的許可。

```
aws lambda get-layer-version-policy \
  --layer-name my-layer \
  --version-number 3 \
  --output text
```

您應該會看到下列輸出：

```
b0cd9796-d4eb-4564-939f-de7fe0b42236    {"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-west-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}"
```

使用 `remove-layer-version-permission` 以從策略中移除陳述式。

```
aws lambda remove-layer-version-permission --layer-name my-layer --version-number 3 --statement-id engineering-org
```

------

## 支援的 API 動作
<a name="permissions-resource-api"></a>

下列 Lambda API 動作支援資源型政策：
+ [CreateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_CreateAlias.html)
+ [DeleteAlias](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteAlias.html)
+ [DeleteFunction](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunction.html)
+ [DeleteFunctionConcurrency](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunctionConcurrency.html)
+ [DeleteFunctionEventInvokeConfig](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunctionEventInvokeConfig.html)
+ [DeleteProvisionedConcurrencyConfig](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteProvisionedConcurrencyConfig.html)
+ [GetAlias](https://docs.aws.amazon.com/lambda/latest/api/API_GetAlias.html)
+ [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html)
+ [GetFunctionConcurrency](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConcurrency.html)
+ [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html)
+ [GetFunctionEventInvokeConfig](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionEventInvokeConfig.html)
+ [GetPolicy](https://docs.aws.amazon.com/lambda/latest/api/API_GetPolicy.html)
+ [GetProvisionedConcurrencyConfig](https://docs.aws.amazon.com/lambda/latest/api/API_GetProvisionedConcurrencyConfig.html)
+ [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)
+ [InvokeFunctionUrl](urls-auth.md) (僅限許可)
+ [ListAliases](https://docs.aws.amazon.com/lambda/latest/api/API_ListAliases.html)
+ [ListFunctionEventInvokeConfigs](https://docs.aws.amazon.com/lambda/latest/api/API_ListFunctionEventInvokeConfigs.html)
+ [ListProvisionedConcurrencyConfigs](https://docs.aws.amazon.com/lambda/latest/api/API_ListProvisionedConcurrencyConfigs.html)
+ [ListTags](https://docs.aws.amazon.com/lambda/latest/api/API_ListTags.html)
+ [ListVersionsByFunction](https://docs.aws.amazon.com/lambda/latest/api/API_ListVersionsByFunction.html)
+ [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html)
+ [PutFunctionConcurrency](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionConcurrency.html)
+ [PutFunctionEventInvokeConfig](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionEventInvokeConfig.html)
+ [PutProvisionedConcurrencyConfig](https://docs.aws.amazon.com/lambda/latest/api/API_PutProvisionedConcurrencyConfig.html)
+ [TagResource](https://docs.aws.amazon.com/lambda/latest/api/API_TagResource.html)
+ [UntagResource](https://docs.aws.amazon.com/lambda/latest/api/API_UntagResource.html)
+ [UpdateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateAlias.html)
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
+ [UpdateFunctionEventInvokeConfig](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionEventInvokeConfig.html)

# 授予 Lambda 函數存取權 AWS 服務
<a name="permissions-function-services"></a>

當您[使用 AWS 服務來叫用函數](lambda-services.md)時，您可以在以資源為基礎的政策的陳述式中授予許可。您可以將陳述式套用至整個函數，或將陳述式限制在單一版本或別名。

**注意**  
當您透過Lambda 主控台將觸發新增至函數時，主控台會更新函數的以資源為基礎的政策來允許服務進行叫用。若要將許可授予無法在 Lambda 主控台中使用的其他帳戶或服務，您可使用 AWS CLI。

使用 [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) 命令新增陳述式。最簡單的以資源為基礎的政策陳述式可讓服務叫用函式。下列命令可授予 Amazon Simple Notification Service 調用名為 `my-function` 之函數的許可。

```
aws lambda add-permission \
  --function-name my-function \
  --action lambda:InvokeFunction \
  --statement-id sns \
  --principal sns.amazonaws.com \
  --output text
```

您應該會看到下列輸出：

```
{"Sid":"sns","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}
```

這可讓 Amazon SNS 呼叫函數的 [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html) API 動作，但不會限制會觸發調用的 Amazon SNS 主題。若要確保您的函式只會被特定的資源叫用，請使用 `source-arn` 選項來指定資源的 Amazon Resource Name (ARN)。下列命令僅允許 Amazon SNS 為名為 `my-topic` 的主題訂閱叫用函數。

```
aws lambda add-permission \
  --function-name my-function \
  --action lambda:InvokeFunction \
  --statement-id sns-my-topic \
  --principal sns.amazonaws.com \
  --source-arn arn:aws:sns:us-east-2:123456789012:my-topic
```

有些服務可在不同的帳戶中叫用函式。如果您指定的來源 ARN 中有帳戶 ID，您可以放心。然而，對於 Amazon S3，來源是一種儲存貯體，其 ARN 沒有帳戶 ID。您可以刪除該儲存貯體，且其他帳戶可使用相同的名稱建立儲存貯體。透過您的帳戶 ID 使用 `source-account` 選項來確保只有帳戶中的資源可叫用該函式。

```
aws lambda add-permission \
  --function-name my-function \
  --action lambda:InvokeFunction \
  --statement-id s3-account \
  --principal s3.amazonaws.com \
  --source-arn arn:aws:s3:::amzn-s3-demo-bucket \
  --source-account 123456789012
```

# 授予組織對函數的存取
<a name="permissions-function-organization"></a>

若要向 [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) 中的組織授予許可，需將組織 ID 指定為 `principal-org-id`。下列 [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) 命令將調用存取權授予組織 `o-a1b2c3d4e5f` 中的所有使用者。

```
aws lambda add-permission \
  --function-name example \
  --statement-id PrincipalOrgIDExample \
  --action lambda:InvokeFunction \
  --principal * \
  --principal-org-id o-a1b2c3d4e5f
```

**注意**  
在此命令中，`Principal` 是 `*`。這意味著組織 `o-a1b2c3d4e5f` 中的所有使用者都會取得函數叫用許可。如果您將 AWS 帳戶 或 角色指定為 `Principal`，則只有該委託人才能取得函數叫用許可，但前提是他們也是`o-a1b2c3d4e5f`組織的一部分。

此命令建立類似以下的資源型政策：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "PrincipalOrgIDExample",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-east-2:123456789012:function:example",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgID": "o-a1b2c3d4e5f"
                }
            }
        }
    ]
}
```

------

如需詳細資訊，請參閱《IAM 使用者指南》**中的 [aws:PrincipalOrgID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgid)。

# 授予 Lambda 函數對其他帳戶的存取權
<a name="permissions-function-cross-account"></a>

若要與另一個 共用函數 AWS 帳戶，請將跨帳戶許可陳述式新增至函數[的資源型政策](access-control-resource-based.md)。執行 [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) 命令，並將帳戶 ID 指定為 `principal`。以下範例會授予帳戶 `111122223333` 以 `prod` 別名叫用 `my-function` 的許可。

```
aws lambda add-permission \
  --function-name my-function:prod \
  --statement-id xaccount \
  --action lambda:InvokeFunction \
  --principal 111122223333 \
  --output text
```

您應該會看到下列輸出：

```
{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-1:123456789012:function:my-function"}
```

以資源為基礎的政策會授予其他帳戶存取函數的許可，但不允許該帳戶中的使用者超過其許可。另一個帳戶中的使用者必須具有相對應的[使用者許可](access-control-identity-based.md)才能使用 Lambda API。

若要限制另一個帳戶中使用者或角色的存取，請指定身分的完整 ARN 作為主體。例如：`arn:aws:iam::123456789012:user/developer`。

[別名](configuration-aliases.md)會限制其他帳戶可叫用的版本。這需要其他帳戶在函式 ARN 中包含別名。

```
aws lambda invoke \
  --function-name arn:aws:lambda:us-east-2:123456789012:function:my-function:prod out
```

您應該會看到下列輸出：

```
{
    "StatusCode": 200,
    "ExecutedVersion": "1"
}
```

然後，函數擁有者可以更新別名以指向新版本，而無需呼叫者變更他們叫用函數的方式。這可確保另一個帳戶不需要變更其程式碼來使用新版本，而且它只具有叫用與別名關聯之函數版本的許可。

您可以為在現有函式上操作之大部分 API 動作授予跨帳戶存取。例如，您可以授予對 `lambda:ListAliases` 的存取，來讓帳戶取得別名的清單，或 `lambda:GetFunction` 讓他們下載函式程式碼。個別新增每個許可，或使用 `lambda:*` 來授予對指定函式進行所有動作的存取。

若要授予其他帳戶多個動作或是不在函數上操作之動作的許可，我們建議您請使用 [IAM 角色](access-control-identity-based.md)。

# 將 Lambda 層存取權授予其他帳戶
<a name="permissions-layer-cross-account"></a>

若要與另一個 共用 layer AWS 帳戶，請將跨帳戶許可陳述式新增至 layer [的資源型政策](access-control-resource-based.md)。執行 [add-layer-version-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-layer-version-permission.html) 命令，並將帳戶 ID 指定為 `principal`。在各陳述式中，您可將許可授予單一帳戶、所有帳戶或 [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) 中的某個組織。

以下列範例會授予帳戶 111122223333 存取 `bash-runtime` layer 第 2 版的許可。

```
aws lambda add-layer-version-permission \
  --layer-name bash-runtime \
  --version-number 2 \  
  --statement-id xaccount \
  --action lambda:GetLayerVersion \
  --principal 111122223333 \
  --output text
```

您應該會看到類似下列的輸出：

```
{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2"}
```

許可僅適用於單一層版本。每次建立新的層版本時均需重複此程序。

若要將許可授予 [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) 組織中的所有帳戶，請使用 `organization-id` 選項。以下範例授予組織 `o-t194hfs8cz` 內的所有帳戶使用第 3 版 `my-layer` 的許可。

```
aws lambda add-layer-version-permission \
  --layer-name my-layer \
  --version-number 3 \
  --statement-id engineering-org \
  --principal '*' \
  --action lambda:GetLayerVersion \
  --organization-id o-t194hfs8cz \
  --output text
```

您應該會看到下列輸出：

```
{"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}"
```

若要授予多個帳戶或組織許可，您必須新增多個陳述式。

# 使用 Lambda 中的屬性型存取控制
<a name="attribute-based-access-control"></a>

搭配[屬性型存取控制 (ABAC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)，您可以使用標籤來控制對 Lambda 資源的存取。您可以將標籤連接至特定 Lambda 資源、將其連接至特定 API 請求，或將其連接至提出請求的 AWS Identity and Access Management (IAM) 委託人。如需如何 AWS 授予屬性型存取的詳細資訊，請參閱《*IAM 使用者指南*》中的[使用標籤控制對 AWS 資源的存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html)。

您可以使用 ABAC 來[授予最低權限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)，無需在 IAM 政策中指定 Amazon Resource Name (ARN) 或 ARN 模式。可以在 IAM 政策 的[條件元素](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)中指定標籤，來控制存取。使用 ABAC 可以更輕鬆地擴展，因為在建立新資源時，您無需更新 IAM 政策，而是將標籤新增至新資源以控制存取。

在 Lambda 中，標籤適用於以下資源：
+ 函數 – 如需標記函數的詳細資訊，請參閱[在 Lambda 函數上使用標籤](configuration-tags.md)。
+ 程式碼簽署組態 – 如需標記程式碼簽署組態的詳細資訊，請參閱[在程式碼簽署組態上使用標籤](tags-csc.md)。
+ 事件來源映射 – 如需標記事件來源映射的詳細資訊，請參閱[在事件來源映射上使用標籤](tags-esm.md)。

層不支援標籤。

您可以使用以下條件索引鍵，根據標籤撰寫 IAM 政策規則：
+ [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag)：依據連接至 Lambda 資源的標籤來控制存取。
+ [aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag)：要求請求中有標籤，例如在建立新函數時。
+ [aws:PrincipalTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principaltag)：依據連接至其 IAM [使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags_users.html) 或[角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags_roles.html)的標籤，控制 IAM 主體 (提出請求者) 允許執行的操作。
+  [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys)：控制可否於請求中使用特定標籤索引鍵。

 只能為支援它們的動作指定條件。如需每個 Lambda 動作所支援的條件清單，請參閱《服務授權參考》中的 [Actions, resources, and condition keys for AWS Lambda](https://docs.aws.amazon.com//service-authorization/latest/reference/list_awslambda.html)。如需 **aws：ResourceTag/tag-key** 支援，請參閱「由 定義的資源類型」 AWS Lambda。如需 **aws：RequestTag/tag-key** 和 **aws：TagKeys** 支援，請參閱「由 定義的動作」 AWS Lambda。

**Topics**
+ [

# 依標籤保護您的函數
](attribute-based-access-control-example.md)

# 依標籤保護您的函數
<a name="attribute-based-access-control-example"></a>

以下步驟會示範使用 ABAC 設定函數許可的一種方法。在此範例案例中，您將會建立四個 IAM 許可政策。然後，您會將這些政策連接至新的 IAM 角色。最後，您將建立 IAM 使用者，並授予該使用者擔任新角色的許可。

**Topics**
+ [

## 先決條件
](#abac-prerequisites)
+ [

## 步驟 1：要求新函數具有標籤
](#require-tag-on-create)
+ [

## 步驟 2：依據連接至 Lambda 函數和 IAM 主體的標籤來允許動作
](#restrict-actions-function-tags)
+ [

## 步驟 3：授予 List 許可
](#abac-list-permissions)
+ [

## 步驟 4：授予 IAM 許可
](#abac-iam-permissions)
+ [

## 步驟 5：建立 IAM 角色
](#abac-create-role)
+ [

## 步驟 6：建立 IAM 使用者
](#abac-create-user)
+ [

## 步驟 7：測試許可
](#abac-test)
+ [

## 步驟 8：清理資源
](#abac-clean-up)

## 先決條件
<a name="abac-prerequisites"></a>

請確定您擁有 [Lambda 執行角色](lambda-intro-execution-role.md)。您將會在授予 IAM 許可以及建立 Lambda 函數時使用此角色。

## 步驟 1：要求新函數具有標籤
<a name="require-tag-on-create"></a>

在搭配使用 ABAC 和 Lambda 時，最佳實務是要求所有函數都具有標籤。這有助於確保您的 ABAC 許可政策如預期般運作。

[建立與以下範例類似的 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor)。此政策會使用 [aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag)、[aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 與 [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys) 條件金鑰，要求新建立的函式以及建立這些函式的 IAM 主體都必須具有 `project` 標籤。`ForAllValues` 修飾詞會確保 `project` 是唯一受允許的標籤。如果您不納入 `ForAllValues` 修飾詞，則只要使用者也傳遞 `project`，其便也可新增其他標籤至函數。

**Example – 要求新函數具有標籤**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction",
        "lambda:TagResource"
      ],
      "Resource": "arn:aws:lambda:*:*:function:*",
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/project": "${aws:PrincipalTag/project}",
          "aws:ResourceTag/project": "${aws:PrincipalTag/project}"
        },
        "ForAllValues:StringEquals": {
          "aws:TagKeys": "project"
        }
      }
    }
  }
```

## 步驟 2：依據連接至 Lambda 函數和 IAM 主體的標籤來允許動作
<a name="restrict-actions-function-tags"></a>

使用 [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 條件索引鍵來建立第二個 IAM 政策，以要求主體的標籤與連接至函數的標籤相符。以下範例政策會允許具有 `project` 標籤的主體呼叫具有 `project` 標籤的函數。如果函數有任何其他標籤，則會該動作將遭拒。

**Example – 要求函數和 IAM 主體的標籤相符**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "lambda:InvokeFunction",
          "lambda:GetFunction"
        ],
        "Resource": "arn:aws:lambda:*:*:function:*",
        "Condition": {
          "StringEquals": {
            "aws:ResourceTag/project": "${aws:PrincipalTag/project}"
          }
        }
      }
    ]
  }
```

## 步驟 3：授予 List 許可
<a name="abac-list-permissions"></a>

建立允許主體列出 Lambda 函數和 IAM 角色的政策。此政策會允許主體在主控台以及呼叫 API 動作時查看所有 Lambda 函數和 IAM 角色。

**Example – 授予 Lambda 和 IAM 的 List 許可**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "AllResourcesLambdaNoTags",
        "Effect": "Allow",
        "Action": [
          "lambda:GetAccountSettings",
          "lambda:ListFunctions",
          "iam:ListRoles"
        ],
        "Resource": "*"
      }
    ]
  }
```

## 步驟 4：授予 IAM 許可
<a name="abac-iam-permissions"></a>

建立允許 **iam:PassRole** 的政策。在您將執行角色指派給函數時，便會需要此許可。在以下範例政策中，用您 Lambda 執行角色的 ARN 來取代範例 ARN。

**注意**  
請勿將政策中的 `ResourceTag` 條件金鑰與 `iam:PassRole` 動作搭配使用。您不能使用該 IAM 角色的標籤來控制可傳遞該角色的人員。如需將角色傳遞至服務所需的許可的詳細資訊，請參閱[授予使用者將角色傳遞至 AWS 服務的許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)。

**Example – 授予傳遞執行角色的許可**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
          "iam:PassRole"
        ],
        "Resource": "arn:aws:iam::111122223333:role/lambda-ex"
      }
    ]
  }
```

## 步驟 5：建立 IAM 角色
<a name="abac-create-role"></a>

最佳實務為[使用角色來委派許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#delegate-using-roles)。[建立名為 `abac-project-role` 的 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-console)：
+ 在**步驟 1：選取可信任實體**時：選擇 **AWS account** ( 帳戶)，然後選擇 **This account** (此帳戶)。
+ 在**步驟 2：新增許可**時：連接您於前一步中建立的四個 IAM 政策。
+ 在**步驟 3：命名、檢閱和建立**時：選擇 **Add tag** (新增標籤)。在 **Key** (索引鍵) 欄位，輸入 `project`。請勿輸入**值**。

## 步驟 6：建立 IAM 使用者
<a name="abac-create-user"></a>

[建立名為 `abac-test-user` 的 IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)。在 **Set permissions** (設定許可) 區段中，選擇 **Attach existing policies directly** (直接連接現有政策)，接著選擇 **Create policy** (建立政策)。輸入以下政策定義。以您的 [AWS 帳戶 ID](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html#FindingYourAccountIdentifiers) 來取代 *111122223333*。此政策允許 `abac-test-user` 擔任 `abac-project-role`。

**Example – 允許 IAM 使用者擔任 ABAC 角色**  

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::111122223333:role/abac-project-role"
    }
  }
```

------

## 步驟 7：測試許可
<a name="abac-test"></a>

1. 以 身分登入 AWS 主控台`abac-test-user`。如需詳細資訊，請參閱[以 IAM 使用者身分登入](https://docs.aws.amazon.com/IAM/latest/UserGuide/console.html#user-sign-in-page)。

1. 切換到 `abac-project-role` 角色。如需詳細資訊，請參閱[切換到角色 (主控台)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)。

1. [建立 Lambda 函數](configuration-tags.md#using-tags-with-the-console)。
   + 在 **Permissions** (許可) 下，選擇 **Change default execution role** (變更預設執行角色)，然後在 **Execution role** (執行角色) 中選擇 **Use an existing role** (使用現有角色)。選擇與您在 [步驟 4：授予 IAM 許可](#abac-iam-permissions) 中使用的相同執行角色。
   + 在 **Advanced settings** (進階設定)下，選擇 **Enable tags** (啟用標籤)，然後選擇 **Add new tag** (新增標籤)。在 **Key** (索引鍵) 欄位，輸入 `project`。請勿輸入**值**。

1. [測試函數](testing-functions.md)。

1. 建立第二個 Lambda 函數，並新增一個不同的標籤，例如 `environment`。此操作應會失敗，因為您在 [步驟 1：要求新函數具有標籤](#require-tag-on-create) 中建立的 ABAC 政策僅允許主體建立具有 `project` 標籤的函數。

1. 建立無標籤的第三個函數。此操作應會失敗，因為您在 [步驟 1：要求新函數具有標籤](#require-tag-on-create) 中建立的 ABAC 政策不允許主體建立無標籤的函數。

此授權策略允許您控制存取，且無需為每個新使用者建立新政策。若要將授予新使用者存取權限，只需要向其授予擔任與其受指派專案相對應角色的許可。

## 步驟 8：清理資源
<a name="abac-clean-up"></a>

**刪除 IAM 角色**

1. 開啟 IAM 主控台中的[角色頁面](https://console.aws.amazon.com/iam/home#/roles)。

1. 選取您在[步驟 5](#abac-create-role) 中建立的角色。

1. 選擇 **刪除**。

1. 若要確認刪除，請在文字輸入欄位中輸入角色名稱。

1. 選擇 **刪除**。

**若要刪除 IAM 使用者**

1. 開啟 IAM 主控台的[使用者頁面](https://console.aws.amazon.com/iam/home#/users)。

1. 選取您在[步驟 6](#abac-create-user) 中建立的 IAM 使用者。

1. 選擇 **刪除**。

1. 若要確認刪除，請在文字輸入欄位中輸入使用者名稱。

1. 選擇**刪除使用者**。

**若要刪除 Lambda 函數**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇您建立的函數。

1. 選擇 **Actions** (動作)、**Delete** (刪除)。

1. 在文字輸入欄位中輸入 **confirm**，然後選擇 **刪除** 。

# 微調政策的資源和條件區段
<a name="lambda-api-permissions-ref"></a>

您可以在 AWS Identity and Access Management (IAM) 政策中指定資源和條件，來限制使用者許可的範圍。政策中的每個動作都支援資源和條件類型組合，組合內容取決於動作的行為。

每個 IAM 政策陳述式授予在資源上執行動作的許可。當動作不在具名資源上執行動作，或是當您授予對所有資源執行動作的許可，政策中資源的值是萬用字元 (`*`)。對於許多動作，您可以透過指定資源的 Amazon Resource Name (ARN) 或符合多個資源的 ARN 模式，來限制使用者可以修改的資源。

根據資源類型，關於如何限制動作範圍的一般設計如下：
+ 函數 - 在函數上執行的動作可依據函數、版本或別名 ARN 限定於特定函數。
+ 事件來源映射 - 動作可依據 ARN 限定於特定事件來源映射資源。事件來源映射一律與函數相關聯。也可以使用 `lambda:FunctionArn` 條件，依據相關的函數限定動作。
+ 層 - 與 Layer 使用和許可相關的動作作用於層的某個版本。
+ 程式碼簽署組態 - 動作可依據 ARN 限定於特定程式碼簽署組態資源。
+ 標籤 - 使用標準標籤條件。如需詳細資訊，請參閱[使用 Lambda 中的屬性型存取控制](attribute-based-access-control.md)。

若要依照資源限制許可，請依照 ARN 指定資源。

**Lambda 資源 ARN 格式**
+ 函數 - `arn:aws:lambda:us-west-2:123456789012:function:my-function`
+ 函數版本 - `arn:aws:lambda:us-west-2:123456789012:function:my-function:1`
+ 函數別名 - `arn:aws:lambda:us-west-2:123456789012:function:my-function:TEST`
+ 事件來源映射 - `arn:aws:lambda:us-west-2:123456789012:event-source-mapping:fa123456-14a1-4fd2-9fec-83de64ad683de6d47`
+ 層 - `arn:aws:lambda:us-west-2:123456789012:layer:my-layer`
+ 層版本 - `arn:aws:lambda:us-west-2:123456789012:layer:my-layer:1`
+ 程式碼簽署組態 – `arn:aws:lambda:us-west-2:123456789012:code-signing-config:my-csc`

例如，以下政策允許使用者在 AWS 帳戶 `123456789012``my-function`中呼叫美國西部 （奧勒岡） AWS 區域中名為 的函數。

**Example 呼叫函數政策**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Invoke",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:my-function"
        }
    ]
}
```

此為特例，其中動作識別符 (`lambda:InvokeFunction`) 與 API 操作 ([Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)) 不同。對於其他動作，動作識別符就是開頭為 `lambda:` 的操作名稱。

**Topics**
+ [

## 了解政策中的條件區段
](#authorization-conditions)
+ [

## 參考政策資源區段中的函數
](#function-resources)
+ [

## 支援的 IAM 動作和函數行為
](#permissions-resources)

## 了解政策中的條件區段
<a name="authorization-conditions"></a>

條件是選用的政策元素，會套用額外的邏輯來判斷是否允許動作。除了所有動作皆支援的一般[條件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)之外，Lambda 還會定義您可用來限制某些動作之其他參數值的條件類型。

例如，`lambda:Principal` 條件讓您可在函數的[資源型政策](access-control-resource-based.md)中，限制使用者可授予叫用存取權限的服務或帳號。以下政策會讓使用者可將許可授予 Amazon Simple Notiﬁcation Service (Amazon SNS) 主題以叫用名為 `test` 的函數。

**Example 管理函數政策許可**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ManageFunctionPolicy",
            "Effect": "Allow",
            "Action": [
                "lambda:AddPermission",
                "lambda:RemovePermission"
            ],
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:test:*",
            "Condition": {
                "StringEquals": {
                    "lambda:Principal": "sns.amazonaws.com"
                }
            }
        }
    ]
}
```

條件要求委託人是 Amazon SNS 而不是其他服務或帳戶。資源模式要求函數名稱是 `test` 並包含版本編號或別名。例如 `test:v1`。

如需 Lambda 和其他 AWS 服務的資源和條件的詳細資訊，請參閱*《服務授權參考*》中的 [AWS 服務的動作、資源和條件索引鍵](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html)。

## 參考政策資源區段中的函數
<a name="function-resources"></a>

您可以使用 Amazon Resource Name (ARN) 來參考政策陳述式中的 Lambda 函數。函數 ARN 的格式取決於您是參考整個函數 (不合格)、函數[版本](configuration-versions.md)或[別名](configuration-aliases.md) (合格)。

進行 Lambda API 呼叫時，使用者可以指定版本或別名，方法是在 [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) `FunctionName` 參數中傳遞版本 ARN 或別名 ARN，或者在 [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) `Qualifier` 參數中設定值。Lambda 會比較 IAM 政策中的資源元素與 API 呼叫中傳遞的 `FunctionName` 和 `Qualifier`，從而作出授權決策。如果不符，Lambda 會拒絕該請求。

無論是允許還是拒絕對函數執行操作，都必須在政策陳述式中使用正確的函數 ARN 類型，才能達到預期的結果。例如，如果您的政策引用了不合格的 ARN，Lambda 會接受參考不合格 ARN 的請求，但拒絕參考合格 ARN 的請求。

**注意**  
不能使用萬用字元 (\$1) 以讓帳戶 ID 相符。如需有關已接受語法的詳細資訊，請參閱 *IAM User Guide* 中的 [IAM JSON policy reference](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)。

**Example 允許叫用不合格的 ARN**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:myFunction"
        }
    ]
}
```

如果您的政策引用了特定合格的 ARN，Lambda 會接受參考該 ARN 的請求，但拒絕參考不合格 ARN 或不同的合格 ARN 的請求，例如 `myFunction:2`。

**Example 允許叫用特定的合格 ARN**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:myFunction:1"
        }
    ]
}
```

如果您的政策使用 `:*` 參考任何合格的 ARN，Lambda 會接受任何合格的 ARN，但拒絕參考不合格 ARN 的請求。

**Example 允許叫用任何合格的 ARN**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:myFunction:*"
        }
    ]
}
```

如果您的政策使用 `*` 參考任何 ARN，Lambda 會接受任何合格或不合格的 ARN。

**Example 允許叫用任何合格或不合格的 ARN**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:myFunction*"
        }
    ]
}
```

## 支援的 IAM 動作和函數行為
<a name="permissions-resources"></a>

 動作定義了可透過 IAM 政策許可的項目。若要查看 Lambda 中支援的動作清單，請參閱《服務授權參考》中的 [Actions, resources, and condition keys for AWS Lambda](https://docs.aws.amazon.com//service-authorization/latest/reference/list_awslambda.html)。在大多數情況下，當 IAM 動作許可某個 Lambda API 動作時，該 IAM 動作的名稱會與 Lambda API 動作的名稱相同，但以下情況除外：


| API 動作 | IAM 動作 | 
| --- | --- | 
| [Invoke](https://docs.aws.amazon.com//lambda/latest/api/API_Invoke.html) | lambda:InvokeFunction | 
| [GetLayerVersion](https://docs.aws.amazon.com//lambda/latest/api/API_GetLayerVersion.html) [GetLayerVersionByArn](https://docs.aws.amazon.com//lambda/latest/api/API_GetLayerVersionByArn.html) | lambda:GetLayerVersion | 

除了 [Service Authorization Reference](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslambda.html) 中定義的資源和條件之外，Lambda 還針對特定動作支援下列資源和條件。其中許多與政策資源區段中的參考函數有關。您可依據函數、版本或別名 ARN，將在函數上操作的動作限於特定函數，如下表所述。


| Action | 資源 | 條件 | 
| --- | --- | --- | 
|  [AddPermission](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html) [RemovePermission](https://docs.aws.amazon.com/lambda/latest/api/API_RemovePermission.html) [調用](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)：(**許可：**`lambda:InvokeFunction`)  |  函式版本 函式別名  |  N/A  | 
|  [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)  |  N/A  |  `lambda:CodeSigningConfigArn`  | 
|  [CreateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunctionUrlConfig.html) [DeleteFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunctionUrlConfig.html) [GetFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionUrlConfig.html) [UpdateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionUrlConfig.html)  |  函式別名  |  N/A  | 