如何为 Lambda 函数提供精细访问权限?
上次更新时间:2021 年 9 月 23 日
我想授予对由其 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 来标识该语句应用到的资源。例如,当 Action 为 Invoke 时,则 Resource 为函数 ARN。IAM 将此 ARN 与通过 Invoke 请求的 FunctionName 和 Qualifier 参数标识的函数的 ARN 进行匹配。有关更多信息,请参阅 AWS Lambda 函数版本。
注意:如果您使用多个版本和别名,您可能需要在资源元素中添加“arn:aws:lambda:region:AccountID:function:function_name:*”。
解决方法
创建 Lambda 函数所需的权限
注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您运行的是最新版本的 AWS CLI。
要使用 AWS 命令行界面 (AWS CLI) 或开发工具包创建 Lambda 函数,需要拥有 lambda:CreateFunction 和 iam: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:AddPermission 和lambda:RemovePermission,以进一步将访问权限限定为包含在绕过策略中的委托人。您还可以将 lambda:UpdateEventSourceMapping 和 lambda: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 权限参考。