配置 Lambda 函数的文件系统访问 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

配置 Lambda 函数的文件系统访问

您可以配置函数以将 Amazon Elastic File System (Amazon EFS) 文件系统挂载到本地目录。借助 Amazon EFS,您的函数代码可以安全且高并发地访问和修改共享资源。

执行角色和用户权限

如果文件系统没有用户配置的 Amazon Identity and Access Management(IAM)policy,EFS 将使用默认策略,该策略授予对可以使用文件系统挂载目标连接到文件系统的任何客户端的完全访问权限。如果文件系统具有用户配置的 IAM policy,则您的函数的执行角色必须具有正确的 elasticfilesystem 权限。

执行角色权限
  • 弹性文件系统:ClientMount

  • elasticfilesystem:ClientWrite (只读连接不是必需的)

这些权限包含在AmazonElasticFileSystemClientReadWrite访问管理策略中。此外,您的执行角色必须具有连接到文件系统的 VPC 所需的权限

配置文件系统时,Lambda 使用您的权限来验证挂载目标。要配置函数以连接到文件系统,您的用户需要以下权限:

用户权限
  • 弹性文件系统:DescribeMountTargets

配置文件系统和访问点

在 Amazon EFS 中创建一个文件系统,该文件系统在函数连接到的每个可用区都有一个挂载目标。为了获得性能和恢复能力,请至少使用两个可用区。例如,在简单配置中,您可能有一个 VPC 包含两个私有子网,这两个子网位于不同的可用区。函数连接到两个子网,每个子网中都存在一个挂载目标。确保函数和挂载目标使用的安全组允许 NFS 流量(端口 2049)。

注意

创建文件系统时,您可以选择以后无法更改的性能模式。General purpose (通用) 模式具有较低的延迟,Max I/O (最大 I/O) 模式支持较高的最大吞吐量和 IOPS。如需帮助选择,请参阅 Amazon Elastic File System 用户指南中的 Amazon EFS 性能

访问点将函数的每个实例连接到该实例连接到的可用区的正确装挂目标。为了获得最佳性能,请使用非根路径创建访问点,并限制您在每个目录中创建的文件数。以下示例在文件系统上创建一个名为 my-function 的目录,然后将拥有者 ID 设置为 1001 并具有标准目录权限 (755)。

例 访问点配置
  • 名称files

  • User ID(用户名 ID)– 1001

  • Group ID(组 ID)– 1001

  • 路径/my-function

  • 权限755

  • Owner user ID(拥有者用户 ID)– 1001

  • Group user ID(组用户 ID)– 1001

当函数使用访问点时,它将被赋予用户 ID 1001 并具有对该目录的完全访问权限。

有关更多信息,请参阅 Amazon Elastic File System 用户指南中的以下主题:

连接到文件系统(控制台)

函数通过 VPC 中的本地网络连接到文件系统。函数连接到的子网可以是包含文件系统挂载点的相同子网,也可以是位于同一可用区中的子网,这些子网可以将 NFS 流量(端口 2049)路由到文件系统。

注意

如果函数尚未连接到 VPC,请参阅将出站联网连接到 VPC 中的资源

配置文件系统访问
  1. 打开 Lamba 控制台的 Functions(函数)页面。

  2. 选择函数。

  3. 选择 Configuration(配置),然后选择 File systems(文件系统)

  4. File system (文件系统) 下,选择 Add file system (添加文件系统)

  5. 配置以下属性:

    • EFS file system(EFS 文件系统)– 同一 VPC 中的文件系统的访问点。

    • Local mount path(本地挂载路径) – 文件系统在 Lambda 函数上的挂载位置,以 /mnt/ 开头。

定价

Amazon EFS 对存储和吞吐量收费,费率因存储类别而异。有关详细信息,请参阅 Amazon EFS 定价

Lambda 对 VPC 之间的数据传输收费。这仅在函数的 VPC 与另一个具有文件系统的 VPC 对等时才适用。费率与同一区域中 VPC 之间的 Amazon EC2 数据传输费率相同。有关详细信息,请参阅 Lambda 定价

有关 Lambda 与 Amazon EFS 集成的更多信息,请参阅 通过 Lambda 使用 Amazon EFS

使用 Lambda API 配置文件系统访问权限

使用以下 API 操作将 Lambda 函数连接到文件系统:

要将函数连接到文件系统,请使用 update-function-configuration 命令。以下示例将名为 my-function 的函数连接到具有访问点 ARN 的文件系统。

ARN=arn:aws:elasticfilesystem:us-east-2:123456789012:access-point/fsap-015cxmplb72b405fd aws lambda update-function-configuration --function-name my-function \ --file-system-configs Arn=$ARN,LocalMountPath=/mnt/efs0

您可以使用 describe-access-points 命令获取文件系统访问点的 ARN。

aws efs describe-access-points

您应看到以下输出:

{ "AccessPoints": [ { "ClientToken": "console-aa50c1fd-xmpl-48b5-91ce-57b27a3b1017", "Name": "lambda-ap", "Tags": [ { "Key": "Name", "Value": "lambda-ap" } ], "AccessPointId": "fsap-015cxmplb72b405fd", "AccessPointArn": "arn:aws:elasticfilesystem:us-east-2:123456789012:access-point/fsap-015cxmplb72b405fd", "FileSystemId": "fs-aea3xmpl", "RootDirectory": { "Path": "/" }, "OwnerId": "123456789012", "LifeCycleState": "available" } ] }

将 Amazon EFS 文件系统挂载到其他 Amazon Web Services 账户

您可以配置函数以将 Amazon EFS 文件系统挂载到其他 Amazon Web Services 账户。在挂载文件系统之前,必须确保满足以下条件:

  • 必须配置 VPC 对等连接,并且必须将适当的路由添加到每个 VPC 中的路由表中。

  • 必须将要挂载的 Amazon EFS 文件系统的安全组配置为允许来自与 Lambda 函数关联的安全组的入站访问。

  • 必须在每个包含匹配的可用区(AZ)ID 的 VPC 中创建子网。

  • 必须在两个 VPC 中启用 DNS 主机名

要让 Lambda 函数访问其他 Amazon Web Services 账户 中的 Amazon EFS 文件系统,该文件系统还必须具有可向函数授予权限的文件系统策略。要了解如何创建文件系统策略,请参阅 Amazon Elastic File System User Guide 中的 Creating file system policies

以下示例策略显示如何向指定账户中的 Lambda 函数授予在文件系统上执行所有 API 操作的权限。

{ "Version": "2012-10-17", "Id": "efs-lambda-policy", "Statement": [ { "Sid": "efs-lambda-statement", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::{LAMBDA-ACCOUNT-ID}:root" }, "Action": "*", "Resource": "arn:aws:elasticfilesystem:{REGION}:{ACCOUNT-ID}:file-system/{FILE SYSTEM ID}" } ] }
注意

所示的示例策略使用通配符(“*”)向指定 Amazon Web Services 账户 中的 Lambda 函数授予在文件系统上执行任何 API 操作的权限。这包括删除文件系统。要限制其他 Amazon Web Services 账户 在您的文件系统上执行操作,请明确指定想要允许的操作。有关可能的 API 操作列表,请参阅 Amazon Elastic File System 的操作、资源和条件键

要配置跨账户文件系统挂载,可以使用 Amazon Command Line Interface(Amazon CLI)update-function-configuration 操作。

要将文件系统挂载到其他 Amazon Web Services 账户,请运行以下命令。使用自己的函数名称,将 Amazon 资源名称(ARN)替换为要挂载的文件系统的 Amazon EFS 接入点的 ARN。LocalMountPath 是函数用来访问文件系统的路径,以 /mnt/ 开头。确保 Lambda 挂载路径与文件系统的接入点路径匹配。例如,如果接入点为 /efs,则 Lambda 挂载路径必须是 /mnt/efs

aws lambda update-function-configuration --function-name MyFunction \ --file-system-configs Arn=arn:aws:elasticfilesystem:us-east-1:222233334444:access-point/fsap-01234567,LocalMountPath=/mnt/test

Amazon CloudFormation 和 Amazon SAM

您可以使用 Amazon CloudFormation 和 Amazon Serverless Application Model (Amazon SAM) 自动创建 Lambda 应用程序。要在 Amazon SAM AWS::Serverless::Function 资源上启用文件系统连接,请使用 FileSystemConfigs 属性。

例 template.yml – 文件系统配置
Transform: AWS::Serverless-2016-10-31 Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 Subnet1: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC CidrBlock: 10.0.1.0/24 AvailabilityZone: "us-west-2a" EfsSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: VpcId: Ref: VPC GroupDescription: "mnt target sg" SecurityGroupIngress: - IpProtocol: -1 CidrIp: "0.0.0.0/0" FileSystem: Type: AWS::EFS::FileSystem Properties: PerformanceMode: generalPurpose AccessPoint: Type: AWS::EFS::AccessPoint Properties: FileSystemId: Ref: FileSystem PosixUser: Uid: "1001" Gid: "1001" RootDirectory: CreationInfo: OwnerGid: "1001" OwnerUid: "1001" Permissions: "755" MountTarget1: Type: AWS::EFS::MountTarget Properties: FileSystemId: Ref: FileSystem SubnetId: Ref: Subnet1 SecurityGroups: - Ref: EfsSecurityGroup MyFunctionWithEfs: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: python3.10 VpcConfig: SecurityGroupIds: - Ref: EfsSecurityGroup SubnetIds: - Ref: Subnet1 FileSystemConfigs: - Arn: !GetAtt AccessPoint.Arn LocalMountPath: "/mnt/efs" Description: Use a file system. DependsOn: "MountTarget1"

必须添加 DependsOn 确保在 Lambda 首次运行之前完全创建挂载目标。

对于 Amazon CloudFormation AWS::Lambda::Function 类型,属性名称和字段是相同的。有关更多信息,请参阅配合使用 Amazon Lambda和 Amazon CloudFormation

示例应用程序

本指南的 GitHub 存储库包括一个示例应用程序,该应用程序演示了如何使用 Amazon EFS 和 Lambda 函数。

  • efs-nodejs – 此函数可在 Amazon VPC 中使用 Amazon EFS 文件系统。此示例包括配置为与 Lambda 一起使用的 VPC、文件系统、挂载目标和访问点。