为 Object Lambda 访问点配置 IAM policy - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

为 Object Lambda 访问点配置 IAM policy

Amazon S3 访问点支持 Amazon Identity and Access Management (IAM) 资源策略,您可以使用这些策略按资源、用户或其他条件控制访问点的使用。您可以通过 Object Lambda 访问点上的可选资源策略或关于支持访问点的资源策略来控制访问权限。有关分步示例,请参阅 教程:使用 S3 Object Lambda 转换应用程序的数据教程:使用 S3 Object Lambda 和 Amazon Comprehend 检测和修订 PII 数据

以下四项资源必须已获得使用 Object Lambda 访问点的权限:

  • IAM 用户或角色。

  • 桶及其关联的标准访问点。当您使用 Object Lambda 访问点时,此标准访问点称为支持访问点

  • Object Lambda 访问点。

  • Amazon Lambda 函数。

重要

在保存策略之前,确保解决来自 Amazon Identity and Access Management Access Analyzer 的安全警告、错误、一般警告和建议。IAM Access Analyzer 将根据 IAM policy grammar(策略语法)和 best practices(最佳实践)运行策略检查,以验证您的策略。这些检查项生成结果并提供可操作的建议,可帮助您编写可操作且符合安全最佳实践的策略。

要了解有关使用 IAM Access Analyzer 验证策略的更多信息,请参阅《IAM 用户指南》中的 IAM Access Analyzer 策略验证。要查看 IAM Access Analyzer 返回的警告、错误和建议的列表,请参阅 IAM Access Analyzer 策略检查引用

以下策略示例假设您具有以下资源:

  • 具有以下 Amazon 资源名称(ARN)的 Amazon S3 桶:

    arn:aws:s3:::DOC-EXAMPLE-BUCKET1

  • 此存储桶上具有以下 ARN 的 Amazon S3 standard 访问点:

    arn:aws:s3:us-east-1:111122223333:accesspoint/my-access-point

  • 具有以下 ARN 的 Object Lambda 访问点:

    arn:aws:s3-object-lambda:us-east-1:111122223333:accesspoint/my-object-lambda-ap

  • 具有以下 ARN 的 Amazon Lambda Lambda 函数:

    arn:aws:lambda:us-east-1:111122223333:function:MyObjectLambdaFunction

注意

如果使用您的账户中的 Lambda 函数,则必须在策略声明中包含函数版本。在以下示例 ARN 中,版本由 $LATEST 表示:

arn:aws:lambda:us-east-1:111122223333:function:MyObjectLambdaFunction:$LATEST

有关 Lambda 函数版本的更多信息,请参阅《Amazon Lambda 开发人员指南》中的 Lambda 函数版本

例 – 将访问控制委派给标准访问点的桶策略

下面的 S3 桶策略示例将桶的访问控制委派给桶的标准访问点。此策略允许对桶拥有者账户所拥有的所有访问点进行完全访问。因此,对此桶的所有访问都由附加到其访问点的策略控制。用户只能通过访问点从桶读取,这意味着您只能通过访问点调用操作。有关更多信息,请参阅将访问控制委派到访问点

{ "Version": "2012-10-17", "Statement" : [ { "Effect": "Allow", "Principal" : { "AWS":"account-ARN"}, "Action" : "*", "Resource" : [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET1", "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*" ], "Condition": { "StringEquals" : { "s3:DataAccessPointAccount" : "Bucket owner's account ID" } } }] }
例 – 向用户授予使用 Object Lambda 访问点的必需权限的桶策略

以下 IAM policy 授予用户对 Lambda 函数、标准访问点和 Object Lambda 访问点的权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowLambdaInvocation", "Action": [ "lambda:InvokeFunction" ], "Effect": "Allow", "Resource": "arn:aws:lambda:us-east-1:111122223333:function:MyObjectLambdaFunction:$LATEST", "Condition": { "ForAnyValue:StringEquals": { "aws:CalledVia": [ "s3-object-lambda.amazonaws.com" ] } } }, { "Sid": "AllowStandardAccessPointAccess", "Action": [ "s3:Get*", "s3:List*" ], "Effect": "Allow", "Resource": "arn:aws:s3:us-east-1:111122223333:accesspoint/my-access-point/*", "Condition": { "ForAnyValue:StringEquals": { "aws:CalledVia": [ "s3-object-lambda.amazonaws.com" ] } } }, { "Sid": "AllowObjectLambdaAccess", "Action": [ "s3-object-lambda:Get*", "s3-object-lambda:List*" ], "Effect": "Allow", "Resource": "arn:aws:s3-object-lambda:us-east-1:111122223333:accesspoint/my-object-lambda-ap" } ] }

启用 Lambda 执行角色的权限

当向 Object Lambda 访问点发出 GET 请求时,Lambda 函数需要将数据发送到 S3 Object Lambda 的权限。可通过对 Lambda 函数的执行角色启用 s3-object-lambda:WriteGetObjectResponse 权限来提供此权限。您可以创建新角色,或更新现有角色。

注意

仅当您发出 GET 请求时,函数才需要 s3-object-lambda:WriteGetObjectResponse 权限。

在 IAM 控制台中创建执行角色
  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在左侧导航窗格中,选择 Roles(角色)。

  3. 选择 Create role (创建角色)

  4. Common use cases(常用使用案例)下,请选择 Lambda

  5. 选择 Next (下一步)

  6. Add permissions(添加权限)页面上,搜索 Amazon 托管式策略 AmazonS3ObjectLambdaExecutionRolePolicy,然后选中策略名称旁边的复选框。

    该策略应包含 s3-object-lambda:WriteGetObjectResponse 操作。

  7. 选择 Next (下一步)

  8. Name, review, and create(名称、查看和创建)页面上,对于 Role name(角色名称),输入 s3-object-lambda-role

  9. (可选)为该角色添加说明和标签。

  10. 选择 Create role (创建角色)

  11. 应用新创建的 s3-object-lambda-role 作为 Lambda 函数的执行角色。这可以在 Lambda 控制台中创建 Lambda 函数期间或之后完成。

有关执行角色的更多信息,请参阅 Amazon Lambda 开发人员指南中的 Lambda 执行角色

将上下文键与 Object Lambda 访问点结合使用

S3 Object Lambda 将评估与请求的连接或签名相关的上下文键,如 s3-object-lambda:TlsVersions3-object-lambda:AuthType。Amazon S3 评估所有其他上下文键,例如 s3:prefix