

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

# 使用執行角色定義 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` 運算子。