

# 使用执行角色定义 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 访问分析器帮助确定 IAM 执行角色策略所需的权限。IAM 访问分析器将检查您指定的日期范围内的 AWS CloudTrail 日志，并生成仅具有该函数在该时间内使用的权限的策略模板。您可以使用模板创建具有精细权限的托管策略，然后将其附加到 IAM 角色。这样，您仅需授予角色与特定使用案例中的 AWS 资源进行交互所需的权限。

有关更多信息，请参阅《*IAM 用户指南*》中的[基于访问活动生成策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_generate-policy.html)。