配置 Lambda 函数的文件系统访问
您可以配置函数以将 Amazon Elastic File System (Amazon EFS) 文件系统挂载到本地目录。借助 Amazon EFS,您的函数代码可以安全且高并发地访问和修改共享资源。
执行角色和用户权限
如果文件系统没有用户配置的 Amazon Identity and Access Management(IAM)policy,EFS 将使用默认策略,该策略授予对可以使用文件系统挂载目标连接到文件系统的任何客户端的完全访问权限。如果文件系统具有用户配置的 IAM policy,则您的函数的执行角色必须具有正确的 elasticfilesystem
权限。
执行角色权限
-
elasticfilesystem:ClientMount
-
elasticfilesystem:ClientWrite(只读连接不需要)
这些权限包含在 AmazonElasticFileSystemClientReadWriteAccess 托管式策略中。此外,您的执行角色必须具有连接到文件系统的 VPC 所需的权限。
配置文件系统时,Lambda 使用您的权限来验证挂载目标。要配置函数以连接到文件系统,您的用户需要以下权限:
用户权限
-
elasticfilesystem: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,请参阅配置 Lambda 函数以访问 VPC 中的资源。
配置文件系统访问
打开 Lamba 控制台的函数页面
。 -
选择函数。
-
选择 Configuration(配置),然后选择 File systems(文件系统)。
-
在 File system (文件系统) 下,选择 Add file system (添加文件系统)。
-
配置以下属性:
-
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 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.9 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、文件系统、挂载目标和访问点。