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

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

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

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

注意

如果函数尚未连接到 VPC,请参阅配置 Lambda 函数以访问 VPC 中的资源

配置文件系统访问

  1. 打开 Lambda 控制台 函数页面

  2. 选择函数。

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

  4. 配置以下属性:

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

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

定价

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

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

有关 Lambda 与 Amazon EFS 集成的更多信息,请参阅将 Amazon EFS 与 Lambda 结合使用

配置文件系统和访问点

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

注意

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

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

例 访问点配置

  • Name (名称)files

  • User ID (用户 ID)1001

  • Group ID (组 ID)1001

  • Path (路径)/my-function

  • Permissions (权限)755

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

  • Group user ID (组用户 ID)1001

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

有关更多信息,请参阅 Amazon Elastic File System User Guide 中的以下主题:

执行角色和用户权限

Lambda 使用函数的权限来挂载文件系统。要连接到文件系统,除了连接到文件系统 VPC 所需的权限之外,函数的执行角色还必须具有以下权限:

执行角色权限

  • elasticfilesystem:ClientMount

  • elasticfilesystem:ClientWrite(只读连接不需要)

这些权限包含在 AmazonElasticFileSystemClientReadWriteAccess 托管策略中。

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

用户权限

  • elasticfilesystem:DescribeMountTargets

使用 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 \ --fs-config FileSystemArn=$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" } ] }

AWS CloudFormation 和 AWS SAM

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

例 template.yml – 文件系统配置

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: "eu-central-1a" EfsSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: VpcId: Ref: VPC GroupDescription: "mnt target sg" SecurityGroupEgress: - IpProtocol: -1 CidrIp: "0.0.0.0/0" FileSystem: Type: AWS::EFS::FileSystem Properties: PerformanceMode: generalPurpose MountTarget1: Type: AWS::EFS::MountTarget Properties: FileSystemId: Ref: FileSystem SubnetId: Ref: Subnet1 SecurityGroups: - Ref: EfsSecurityGroup MyFunctionWithEfs: Type: AWS::Serverless::Function Properties: CodeUri: function/. Description: Use a file system. FileSystemConfigs: - Arn: !Sub - "arn:aws:elasticfilesystem:eu-central-1:123456789101:access-point/${ap}" - {ap: !Ref AccessPoint} LocalMountPath: "/mnt/efs0" DependsOn: "MountTarget1"

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

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

示例应用程序

本指南的 GitHub 存储库包括演示 Amazon EFS 与 Lambda 函数如何结合使用的示例应用程序。

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