如何为 Lambda 函数提供精细访问权限?

5 分钟阅读
0

我想授予对由其 Amazon Resource Name(ARN)标识的特定 AWS Lambda 函数的读写权限。如何为 Lambda 函数提供精细访问权限?

简短描述

您可以使用 AWS Identity and Access Management (IAM) 策略为 Lambda 函数配置权限,以便:

  • 创建 Lambda 函数
  • 删除 Lambda 函数
  • 查看 Lambda 函数的详细配置信息
  • 修改 Lambda 函数
  • 调用 Lambda 函数
  • 监控 Lambda 函数

在以下策略示例中,支持资源级权限的 Lambda API 操作仅限于每个语句的 Resource 元素中列出的特定 Lambda 函数。对于支持这些元素的 API 操作,在 Condition 元素中使用了特定的函数名称。

对于不支持资源级权限的 API 操作,需要在 Resource 元素中使用通配符(“*”),并且不能应用任何 Lambda 服务特定的条件键。有关 Lambda 支持的 IAM 操作、资源和条件的更多信息,请参阅 AWS Lambda 的操作、资源和条件键

语句的 Resource 元素的值使用 ARN 来标识该语句应用到的资源。例如,当 ActionInvoke 时,则 Resource 为函数 ARN。IAM 将此 ARN 与通过 Invoke 请求的 FunctionNameQualifier 参数标识的函数的 ARN 进行匹配。有关更多信息,请参阅 AWS Lambda 函数版本

**注意:**如果您使用多个版本和别名,您可能需要在资源元素中添加“arn:aws:lambda:region:AccountID:function:function_name:*”。

解决方法

创建 Lambda 函数所需的权限

注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您运行的是最新版本的 AWS CLI

要使用 AWS 命令行界面 (AWS CLI) 或开发工具包创建 Lambda 函数,需要拥有 lambda:CreateFunctioniam:PassRole 权限。有关示例策略,请参阅 AWS Lambda 的基于身份的 IAM 策略。以下策略允许 API 调用者创建 Lambda 函数,作为函数 Lambda 执行角色绕过 IAM 角色,然后将代码上传到本地机器中:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PermissionToCreateFunction",
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction"
      ],
      "Resource": [
        "arn:aws:lambda:region:AccountID:function:function_name"
      ]
    },
    {
      "Sid": "PermissionToPassARole",
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": "arn:aws:iam::AccountID:role/role_name"
    }
  ]
}

注意:请更新策略以包含相关区域、账户 ID、函数名称、ARN 等。

如果从 Amazon Simple Storage Service(Amazon S3)存储桶上传代码,则需要将与以下内容类似的策略添加到现有的 IAM 策略中,从而授予 Amazon S3 所需的权限:

...
{
  "Sid": "PermissionToUploadCodeFromS3",
  "Effect": "Allow",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::S3BucketName/FileName.zip"
}
...

注意:请更新策略以包含相关 S3 存储桶名称和文件名。

由于在 Lambda 控制台中创建函数时无法提供代码,因此需要拥有 API 权限(例如读取级别的 API 操作以及查看和更新函数的权限)。添加与以下类似的策略以授予这些权限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PermissionsToViewFunctionsInConsole",
      "Effect": "Allow",
      "Action": [
        "lambda:ListFunctions",
        "lambda:GetAccountSettings"
      ],
      "Resource": "*"
    },
    {
      "Sid": "PermissionsToCreateAndUpdateFunction",
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction",
        "lambda:GetFunction",
        "lambda:UpdateFunctionCode"
      ],
      "Resource": [
        "arn:aws:lambda:region:AccountID:function:function_name"
      ]
    },
    {
      "Sid": "PermissionToListExistingRoles",
      "Effect": "Allow",
      "Action": [
        "iam:ListRoles"
      ],
      "Resource": "*"
    },
    {
      "Sid": "PermissionToPassARole",
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": "arn:aws:iam::AccountID:role/role_name"
    }
  ]
}

**注意:**请更新策略以包含相关区域、账户 ID、函数名称、ARN 等。

如要在 Lambda 函数创建过程中创建 IAM 策略,请添加与以下类似的额外 IAM 权限:

...
{
  "Sid": "PermmissionsToCreateAndUpdateARole",
  "Effect": "Allow",
  "Action": [
    "iam:CreateRole",
    "iam:CreatePolicy",
    "iam:PutRolePolicy",
    "iam:AttachRolePolicy"
  ],
  "Resource": "*"
}
...

删除 Lambda 函数所需的权限

如要使用 AWS CLI 或开发工具包删除 Lambda 函数,请添加与以下类似的权限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PermissionToDeleteFunction",
      "Effect": "Allow",
      "Action": [
        "lambda:DeleteFunction"
      ],
      "Resource": [
        "arn:aws:lambda:region:AccountID:function:function_name"
      ]
    }
  ]
}

**注意:**请更新策略以包含相关区域、账户 ID、函数名称、ARN 等。

如要使用 Lambda 控制台来删除 Lambda 函数,请添加与以下类似的 Lambda 读取访问权限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PermissionsToViewFunctionsInConsole",
      "Effect": "Allow",
      "Action": [
        "lambda:ListFunctions",
        "lambda:GetAccountSettings"
      ],
      "Resource": "*"
    },
    {
      "Sid": "PermissionToDeleteFunction",
      "Effect": "Allow",
      "Action": [
        "lambda:DeleteFunction"
      ],
      "Resource": [
        "arn:aws:lambda:region:AccountID:function:function_name"
      ]
    }
  ]
}

**注意:**请更新策略以包含相关区域、账户 ID、函数名称、ARN 等。

查看 Lambda 函数的详细配置信息所需的权限

如要授予用户查看 Lambda 函数的详细配置信息的权限,请添加与以下类似的权限:

**注意:**根据您希望授予的读取权限级别,您可能需要使用 AWS CLI 或开发工具包授予以下全部或部分权限。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ActionsWhichSupportResourceLevelPermissions",
      "Effect": "Allow",
      "Action": [
        "lambda:GetFunction",
        "lambda:GetFunctionConfiguration",
        "lambda:GetPolicy",
        "lambda:GetAlias",
        "lambda:ListVersionsByFunction",
        "lambda:ListAliases"
      ],
      "Resource": [
        "arn:aws:lambda:region:AccountID:function:function_name"
      ]
    },
    {
      "Sid": "ActionsWhichDoNotSupportResourceLevelPermissions",
      "Effect": "Allow",
      "Action": [
        "lambda:ListTags",
        "lambda:GetEventSourceMapping",
        "lambda:ListEventSourceMappings"
      ],
      "Resource": "*"
    }
  ]
}

**注意:**请更新策略以包含相关区域、账户 ID、函数名称、ARN 等。

如要使用 Lambda 控制台来查看函数的详细配置信息,请添加与以下类似的权限:

...
{
  "Sid": "PermissionsToViewFunctionsInConsole",
  "Effect": "Allow",
  "Action": [
    "lambda:ListFunctions",
    "lambda:GetAccountSettings"
  ],
  "Resource": "*"
}
...

Lambda 控制台使用标记 Lambda 函数,从而让您可以通过标签来筛选 Lambda 函数。要使用 AWS 标记服务,请添加与以下类似的权限:

...
{
  "Sid": "PermissionsToFilterFunctionsByTags",
  "Effect": "Allow",
  "Action": [
     "tag:GetResources"
  ],
  "Resource": "*"
}
...

Lambda 控制台会显示与某个 Lambda 函数关联的 IAM 角色以及该函数的 IAM 角色有权访问的资源的详细信息。如要查看这些详细信息,请添加与以下类似的权限:

...
{
  "Sid": "PermissionsToViewRolesAndPolicies",
  "Effect": "Allow",
  "Action": [
    "iam:GetPolicy",
    "iam:GetPolicyVersion",
    "iam:GetRolePolicy",
    "iam:ListRoles",
    "iam:ListRolePolicies",
    "iam:ListAttachedRolePolicies"
  ],
  "Resource": "*"
}
...

**注意:**根据您的要求以及与您的 Lambda 函数集成的服务不同,您可能需要授予对其他 AWS 服务的额外权限。有关更多信息,请参阅 AWS Lambda 权限

修改 Lambda 函数所需的权限

如要授予用户修改 Lambda 函数的权限,请添加与以下类似的权限:

**注意:**据您希望授予的写入权限级别,您可能需要使用 AWS CLI 或开发工具包授予以下全部或部分权限。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ActionsWhichSupportResourceLevelPermissions",
      "Effect": "Allow",
      "Action": [
        "lambda:AddPermission",
        "lambda:RemovePermission",
        "lambda:CreateAlias",
        "lambda:UpdateAlias",
        "lambda:DeleteAlias",
        "lambda:UpdateFunctionCode",
        "lambda:UpdateFunctionConfiguration",
        "lambda:PutFunctionConcurrency",
        "lambda:DeleteFunctionConcurrency",
        "lambda:PublishVersion"
      ],
      "Resource": "arn:aws:lambda:region:AccountID:function:function_name"
    },
    {
      "Sid": "ActionsWhichSupportCondition",
      "Effect": "Allow",
      "Action": [
        "lambda:CreateEventSourceMapping",
        "lambda:UpdateEventSourceMapping",
        "lambda:DeleteEventSourceMapping"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "lambda:FunctionArn": "arn:aws:lambda:region:AccountID:function:function_name"
        }
      }
    },
    {
      "Sid": "ActionsWhichDoNotSupportResourceLevelPermissions",
      "Effect": "Allow",
      "Action": [
        "lambda:UntagResource",
        "lambda:TagResource"
      ],
      "Resource": "*"
    }
  ]
}

**注意:**请更新策略以包含相关区域、账户 ID、函数名称、ARN 等。

您可以使用 lambda:AddPermissionlambda:RemovePermission,以进一步将访问权限限定为包含在绕过策略中的委托人。您还可以将 lambda:UpdateEventSourceMappinglambda:DeleteEventSourceMapping 限制为特定的事件源映射。有关更多信息,请参阅适用于 AWS Lambda 的基于身份的 IAM 策略

如要指定客户管理的 AWS Key Management Service (AWS KMS) 密钥以加密环境变量,请使用与以下内容类似的 IAM 策略代码段添加额外的 KMS 权限:

...
{
  "Sid": "PermissionsForCryptoOperations",
  "Effect": "Allow",
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:CreateGrant"
  ],
  "Resource": "arn:aws:kms:region:AccountID:key/keyID"
},
{
  "Sid": "PermissionsToListExistingKeys",
  "Effect": "Allow",
  "Action": [
    "kms:ListKeys",
    "kms:ListAliases"
  ],
  "Resource": "*"
}
...

**注意:**请更新策略以包含相关区域、账户 ID、函数名称、ARN 等。

如要使用 Lambda 控制台来修改 Lambda 函数的配置,请添加与以下类似的权限:

...
{
  "Sid": "PermissionsToViewFunctionsInConsole",
  "Effect": "Allow",
  "Action": [
    "lambda:ListFunctions",
    "lambda:GetAccountSettings"
  ],
  "Resource": "*"
}
...

调用 Lambda 函数所需的权限

如果出于测试目的需要使用 AWS CLI 或开发工具包手动调用 Lambda 函数,请添加与以下类似的权限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PermissionToInvoke",
      "Effect": "Allow",
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:region:AccountID:function:function_name"
    }
  ]
}

**注意:**请更新策略以包含相关区域、账户 ID、函数名称、ARN 等。

如要使用 Lambda 控制台来列举 Lambda 函数,请添加与以下类似的权限:

...
{
  "Sid": "PermissionsToViewFunctionsConfigInConsole",
  "Effect": "Allow",
  "Action": [
    "lambda:ListFunctions",
    "lambda:GetAccountSettings",
    "lambda:GetFunction"
  ],
  "Resource": "*"
}
...

如要允许其他服务调用 Lambda 函数,请对 AWS Lambda 使用基于资源的策略。您还可以使用函数策略为 Lambda 函数提供跨账户访问权限。以下示例策略允许来自不同 AWS 账户的用户手动调用 Lambda 函数:

{
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "PermissionToInvoke",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::ExternalAccountID:user/username"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:region:AccountID:function:function_name"
    }
  ]
}

**注意:**请更新策略以包含相关区域、账户 ID、函数名称、ARN 等。

监控 Lambda 函数所需的权限

如要在 Lambda 控制台的监控屏幕中查看 Amazon CloudWatch 指标,请添加与以下类似的权限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PermissionForCloudWatchMetrics",
       "Effect": "Allow",
       "Action": [
          "cloudwatch:GetMetricStatistics",
          "cloudwatch:GetMetricData"
        ],
        "Resource": "*"
     }
  ]
}

如要授予特定 CloudWatch 指标和 CloudWatch Logs Insights 的权限,请参阅 Amazon CloudWatch 权限参考CloudWatch Logs 权限参考


相关视频

AWS 官方
AWS 官方已更新 3 年前