EFS:Linux 共享文件存储
在多个 EC2 实例和 Lambda 函数之间挂载 EFS 文件系统,配置性能和吞吐量模式,并使用安全组控制访问
EFS:Linux 共享文件存储 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。
什么是 Amazon EFS?
Amazon Elastic File System (EFS) 是一种完全托管、弹性且共享的 POSIX 文件系统,可同时由数千个 EC2 实例、Lambda 函数以及 ECS/EKS 容器挂载。与 EBS(连接到单个实例)不同,EFS 提供共享文件系统,所有已连接的客户端都能实时看到相同的文件。容量会自动增长和缩减,您无需预先配置存储空间。EFS 非常适合内容管理、共享代码仓库、主目录和数据分析。
EFS 存储类别
EFS 提供两种存储类别:EFS Standard(多 AZ,最高可用性,亚毫秒级延迟)和 EFS One Zone(单个 AZ,成本低 47%,弹性略低)。在每个层级中,还有一种不频繁访问(IA)变体,可为不经常访问的文件提供比 Standard 低 92% 的存储成本。EFS 与 S3 的区别在于:EFS 是应用程序可以挂载的完整 POSIX 文件系统,而不是对象存储。
# Create an EFS file system in Standard storage class
aws efs create-file-system \
--performance-mode generalPurpose \
--throughput-mode elastic \
--encrypted \
--tags Key=Name,Value=SharedFileSystem
# One Zone (cheaper, single-AZ):
aws efs create-file-system \
--performance-mode generalPurpose \
--throughput-mode elastic \
--encrypted \
--availability-zone-name us-east-1a \
--tags Key=Name,Value=SharedFileSystemOneZoneEFS 性能模式
EFS 有两种性能模式:通用用途(默认模式,推荐用于大多数工作负载——延迟最低,适合 Web 服务、内容管理和主目录)以及 Max 输入/输出(专为具有数千个并发连接的大规模并行工作负载设计,但延迟会略高,适合大数据和媒体处理)。性能模式在创建时设置,文件系统创建后无法更改。对于 SAA-C03 考试,只有在明确需要数千个并行连接时,才选择 Max 输入/输出。
# Create EFS with Max I/O for highly parallel workloads
aws efs create-file-system \
--performance-mode maxIO \
--throughput-mode provisioned \
--provisioned-throughput-in-mibps 1024 \
--encrypted
# Note: Max I/O mode is NOT compatible with Elastic throughput mode
# It must use Provisioned or Bursting throughputEFS 吞吐量模式
EFS 支持三种吞吐量模式:Elastic(根据工作负载自动扩大或缩小吞吐量——推荐用于大多数使用场景,按传输的 GB 数计费)、Bursting(吞吐量随存储大小扩展,像 EC2 T 系列一样赚取和消耗突发积分——基准吞吐量免费)以及 Provisioned(无论存储大小如何,都由您指定固定吞吐量——当您需要稳定且超过 Bursting 所提供吞吐量的吞吐能力时很有用)。Elastic 模式是现代默认模式,无需再规划吞吐能力。
# Migrate an existing EFS from Bursting to Elastic throughput
aws efs update-file-system \
--file-system-id fs-0abc1234def567890 \
--throughput-mode elastic
# Check current throughput mode and performance mode
aws efs describe-file-systems \
--file-system-id fs-0abc1234def567890 \
--query 'FileSystems[].{ThroughputMode:ThroughputMode,PerfMode:PerformanceMode,SizeBytes:SizeInBytes.Value}'挂载目标和安全组
要从 EC2 实例访问 EFS 文件系统,您需要在实例运行所在的每个子网(AZ)中创建一个挂载目标。对于 EFS Standard,您应在 VPC 中的每个 AZ 都创建一个挂载目标——EC2 实例会连接到其所在 AZ 中的挂载目标,以实现最低延迟。挂载目标具有安全组,必须允许来自实例安全组的 NFS 流量(TCP 端口 2049)。如果没有此 Inbound 规则,挂载操作将超时。
# Create a mount target in each AZ
aws efs create-mount-target \
--file-system-id fs-0abc1234def567890 \
--subnet-id subnet-aaa111 \
--security-groups sg-efsnfs
aws efs create-mount-target \
--file-system-id fs-0abc1234def567890 \
--subnet-id subnet-bbb222 \
--security-groups sg-efsnfs
# The EFS security group needs: Inbound TCP 2049 from instance SG在 EC2 Linux 上挂载 EFS
在 EC2 上挂载 EFS 的推荐方式是使用 Amazon EFS Mount Helper(amazon-efs-utils 软件包),它支持传输中 TLS 加密和自动重新连接。挂载时应使用文件系统 ID,而不是 IP 地址,这样 DNS 会自动解析到最近的 AZ 挂载目标。对于重启后仍然保留的持久挂载,请使用 _netdev 选项将挂载条目添加到 /etc/fstab,以确保挂载前网络已经可用。
# Install the EFS mount helper
sudo yum install -y amazon-efs-utils
# Mount with TLS encryption in transit
sudo mkdir /mnt/efs
sudo mount -t efs -o tls fs-0abc1234def567890:/ /mnt/efs
# Persistent mount in /etc/fstab
# fs-0abc1234def567890:/ /mnt/efs efs defaults,_netdev,tls 0 0
# Verify mount
df -h /mnt/efsEFS Access Points
EFS Access Points 是进入 EFS 文件系统的、面向特定应用程序的入口点,会为使用该访问点的所有连接强制指定 POSIX 用户、组和根目录。这样,位于同一文件系统上的多个应用程序可以彼此隔离——应用程序 A 通过 Access Point A 挂载,只能看到 /data/app-a/;应用程序 B 使用 Access Point B 时,只能看到 /data/app-b/。Access Points 是为 Lambda 函数、ECS 任务和 EKS Pod 授予共享 EFS 文件系统隔离访问权限的推荐方式。
# Create an EFS Access Point for an application
aws efs create-access-point \
--file-system-id fs-0abc1234def567890 \
--posix-user Uid=1001,Gid=1001 \
--root-directory Path=/data/app-a,CreationInfo={OwnerUid=1001,OwnerGid=1001,Permissions=755} \
--tags Key=App,Value=app-a
# Mount using the access point
sudo mount -t efs \
-o tls,accesspoint=fsap-0abc1234def567890 \
fs-0abc1234def567890:/ /mnt/app-aEFS Intelligent-Tiering 和生命周期
EFS Intelligent-Tiering 会根据访问模式,自动在 Standard 和 Standard-IA(不频繁访问)存储类之间移动文件。您可以配置生命周期策略,例如将 30 天未访问的文件移至 IA。当 IA 中的文件再次被访问时,它会自动移回 Standard。从 IA 检索数据会产生按 GB 计算的检索费用,但存储成本会显著降低。这与 S3 Intelligent-Tiering 类似,无需手动管理文件放置位置。
# Enable lifecycle management (move to IA after 14 days)
aws efs put-lifecycle-configuration \
--file-system-id fs-0abc1234def567890 \
--lifecycle-policies '[
{"TransitionToIA": "AFTER_14_DAYS"},
{"TransitionToPrimaryStorageClass": "AFTER_1_ACCESS"}
]'
# Check current lifecycle configuration
aws efs describe-lifecycle-configuration \
--file-system-id fs-0abc1234def567890EFS 与 Lambda 和容器
Lambda 函数可以挂载 EFS 文件系统,以便在多次调用之间共享大型模型文件、持久化数据或配置,从而突破 /tmp 的 512 MB–10 GB 限制。ECS 和 EKS 任务通过使用 EFS CSI 驱动程序的持久卷声明挂载 EFS。Lambda 函数或容器必须位于具有挂载目标的 VPC 中,并且 EFS 安全组必须允许来自 Lambda 或容器 VPC 安全组的 Inbound NFS 流量。EFS + Lambda 是在多个函数实例之间共享经过训练的 ML 模型的常见模式。
# Lambda function with EFS mount (CloudFormation excerpt)
# Resources:
# MyFunction:
# Type: AWS::Lambda::Function
# Properties:
# VpcConfig:
# SubnetIds: [subnet-aaa]
# SecurityGroupIds: [sg-lambda]
# FileSystemConfigs:
# - Arn: arn:aws:elasticfilesystem:us-east-1:111122223333:access-point/fsap-0abc
# LocalMountPath: /mnt/models
# In function code:
# import os
# model_path = '/mnt/models/my-model.pkl'
# with open(model_path, 'rb') as f:
# model = pickle.load(f)EFS 与 EBS:考试关键区别
SAA-C03 考试经常要求您在 EFS 和 EBS 之间进行选择。EFS:POSIX 共享文件系统,可同时挂载到多个 EC2 实例,容量具有弹性,仅支持 Linux(NFS),可由 Lambda 和容器访问,每 GB 成本较高。EBS:块设备,连接到单个 EC2 实例(io1/io2 Multi-Attach 除外),固定的预置大小,同时支持 Linux 和 Windows,Lambda 无法原生访问,每 GB 成本较低。如果场景说明“多个实例必须共享相同的文件”,答案就是 EFS。
EFS 加密
EFS 支持静态数据加密(在使用 KMS 密钥创建文件系统时启用——创建后无法更改)和传输中加密(使用 EFS Mount Helper 并指定 tls 选项时进行 TLS 加密)。AWS 建议同时启用这两项。您可以使用基于 EFS 资源的策略强制执行传输中加密:通过要求 elasticfilesystem:ClientRootAccess 和 elasticfilesystem:ClientWrite 条件,拒绝不使用 TLS 的挂载。
# Create an EFS file system with encryption at rest
aws efs create-file-system \
--encrypted \
--kms-key-id arn:aws:kms:us-east-1:111122223333:key/KEY_ID
# Mount with TLS to encrypt in transit
sudo mount -t efs -o tls fs-0abc1234def567890:/ /mnt/efs
# Deny unencrypted mounts via EFS resource policy (condition)
# Condition: elasticfilesystem:AccessedViaMountTarget = true
# and aws:SecureTransport = true快速检查
测试您对本课 AWS Solutions Architect(SAA-C03)概念的理解。
课程回顾
在本课中,您学习了:EFS 是共享的 POSIX 文件系统,可以同时挂载到数千个实例和 Lambda 函数,并提供弹性容量;Access Points 通过强制指定 POSIX 用户和根目录,提供按应用程序隔离的访问;Intelligent-Tiering 会自动将不常访问的文件移至成本更低的 IA 存储类。接下来,我们将学习适用于专用工作负载的 FSx for Windows File Server 和 Lustre。
常见问题解答
「EFS:Linux 共享文件存储」课时是免费的吗?
是的 — 「EFS:Linux 共享文件存储」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。
「EFS:Linux 共享文件存储」这节课中我会学到什么?
在多个 EC2 实例和 Lambda 函数之间挂载 EFS 文件系统,配置性能和吞吐量模式,并使用安全组控制访问 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 AWS Solutions Architect 需要有经验吗?
无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「EFS:Linux 共享文件存储」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 AWS Solutions Architect 课中编写并运行代码吗?
能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- EBS 卷类型:gp3、io2、st1、sc1
- EBS 快照、加密与 RAID
- EFS:Linux 共享文件存储
- FSx:Windows 文件服务器与 Lustre