教程:使用 Amazon CLI 创建 EFS 文件系统并将其挂载到 EC2 实例上 - Amazon Elastic File System
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

教程:使用 Amazon CLI 创建 EFS 文件系统并将其挂载到 EC2 实例上

创建加密的 EFS 文件系统,将其挂载到 VPC 中的 EC2 实例上,然后使用 Amazon CLI 测试设置。

注意

开始使用教程中,您使用控制台创建 Amazon EC2 和 EFS 资源。在本教程中,您将使用 Amazon CLI 创建它们,主要目的是熟悉 Amazon EFS API。

在本教程中,您将在您的账户中创建以下 Amazon 资源:

  • Amazon EC2 资源:

    • 两个安全组(一个用于 EC2 实例,一个用于 EFS 文件系统)。

      您可以将规则添加到这些安全组中,以授权适当的入站/出站访问。这样做允许您的 EC2 实例使用标准 NFSv4.1 TCP 端口,通过挂载目标连接到文件系统。

    • 您的 VPC 中的 EC2 实例。

  • Amazon EFS 资源:

    • 文件系统。

    • 文件系统的挂载目标。

      为了将文件系统挂载到 EC2 实例上,需要在您的 VPC 中创建一个挂载目标。您可以在 VPC 中的每个可用区分别创建一个挂载目标。有关更多信息,请参阅 Amazon EFS 的工作原理

然后,在 EC2 实例上测试文件系统。教程结束时的清理步骤提供了删除这些资源的信息。

本教程在美国西部(俄勒冈州)区域(us-west-2)创建所有这些资源。不论使用哪个 Amazon Web Services 区域,都请确保使用方式一致。您的所有资源(您的 VPC、EC2 资源和 EFS 资源)必须位于同一 Amazon Web Services 区域中。

先决条件

  • 您可以使用 Amazon Web Services 账户的根凭证登录到控制台并尝试入门练习。但是,Amazon Identity and Access Management(IAM)建议您不要使用您的 Amazon Web Services 账户的根凭证。而是在您的账户中创建一个管理员用户,并使用这些凭证来管理您的账户中的资源。而是在您的账户中创建一个管理员用户,并使用这些凭证来管理您的账户中的资源。有关更多信息,请参阅《Amazon IAM Identity Center 用户指南》中的为 IAM Identity Center 用户分配 Amazon Web Services 账户访问权限

  • 您可以使用默认 VPC,也可以使用在您的账户中创建的自定义 VPC。对于本演练,可以使用默认的 VPC 配置。但是,如果您使用自定义 VPC,请验证以下情况:

    • 已启用 DNS 主机名。有关更多信息,请参阅《Amazon VPC 用户指南》中的 VPC 中的 DNS 属性

    • Internet 网关已连接到您的 VPC。有关更多信息,请参阅 Amazon VPC 用户指南中的使用互联网网关连接到互联网

    • 已配置 VPC 子网来为 VPC 子网中启动的实例请求公有 IP 地址。有关更多信息,请参阅《Amazon VPC 用户指南》中的为 VPC 和子网分配 IP 地址

    • VPC 路由表包含一个规则,以将 Internet 范围的所有流量发送到 Internet 网关。

  • 您需要设置 Amazon CLI 并添加 adminuser 配置文件。

设置 Amazon CLI

按照以下说明来设置 Amazon CLI 和用户配置文件。

设置 Amazon CLI
  1. 下载并配置 Amazon CLI。有关说明,请参阅《Amazon Command Line Interface User Guide》中的 Get started with the Amazon CLI

  2. 设置配置文件。

    将用户凭证存储在 Amazon CLI config 文件中。本教程中的示例 CLI 命令指定 adminuser 配置文件。在 config 文件中创建 adminuser 配置文件。也可以在 config 文件中将管理员用户配置文件设置为默认配置文件,如下所示。

    [profile adminuser] aws_access_key_id = admin user access key ID aws_secret_access_key = admin user secret access key region = us-west-2 [default] aws_access_key_id = admin user access key ID aws_secret_access_key = admin user secret access key region = us-west-2

    上述配置文件还设置默认 Amazon Web Services 区域。如果没有在 CLI 命令中指定区域,则假定为 us-west-2 区域。

  3. 在命令提示符处输入以下命令来验证设置。两个命令都没有显式提供凭证,所以将使用默认配置文件的凭证。

    • 尝试 help 命令

      您也可以通过添加 --profile 参数来显式指定用户配置文件。

      aws help
      aws help \ --profile adminuser

步骤 1:创建 EC2 资源

在此步骤中,您将执行以下操作:

  • 创建两个安全组。

  • 在安全组中添加规则以授权额外访问。

  • 启动一个 EC2 实例。在下一步中,您将创建一个 EFS 文件系统并将其挂载到该实例上。

步骤 1.1:创建两个安全组

在本部分中,您将在 VPC 中为 EC2 实例和 EFS 挂载目标创建安全组。在教程的稍后部分,您要将这些安全组分配给 EC2 实例和 EFS 挂载目标。有关安全组的信息,请参阅 Linux 实例的 Amazon EC2 安全组

创建安全组
  1. 使用 create-security-group CLI 命令创建两个安全组:

    1. 为您的 EC2 实例创建一个安全组 (efs-walkthrough1-ec2-sg) 并提供您的 VPC ID。

      $ aws ec2 create-security-group \ --region us-west-2 \ --group-name efs-walkthrough1-ec2-sg \ --description "Amazon EFS walkthrough 1, SG for EC2 instance" \ --vpc-id vpc-id-in-us-west-2 \ --profile adminuser

      记下安全组 ID。以下为响应示例。

      { "GroupId": "sg-aexample" }

      您可以使用以下命令查找 VPC ID:

      $ aws ec2 describe-vpcs

    2. 为 EFS 挂载目标创建安全组(efs-walkthrough1-mt-sg)。您需要提供 VPC ID。

      $ aws ec2 create-security-group \ --region us-west-2 \ --group-name efs-walkthrough1-mt-sg \ --description "Amazon EFS walkthrough 1, SG for mount target" \ --vpc-id vpc-id-in-us-west-2 \ --profile adminuser

      记下安全组 ID。以下为响应示例。

      { "GroupId": "sg-aexample" }
  2. 验证安全组。

    aws ec2 describe-security-groups \ --group-ids list of security group IDs separated by space \ --profile adminuser \ --region us-west-2

    两个安全组都应当只有一条允许所有出站流量的出站规则。

    在下一节中,您将授权额外访问,以便:

    • 您能够连接到 EC2 实例。

    • 启用 EC2 实例与 EFS 挂载目标之间的流量(在本教程的稍后部分,您要将这些安全组与它们关联)。

步骤 1.2:在安全组中添加规则以授权入站/出站访问

在该步骤中,您将在安全组中添加规则以授权入站/出站访问。

添加规则
  1. 授权与 EC2 实例安全组 (efs-walkthrough1-ec2-sg) 的传入安全 Shell (SSH) 连接,以便可以从任何主机使用 SSH 连接到 EC2 实例。

    $ aws ec2 authorize-security-group-ingress \ --group-id id of the security group created for EC2 instance \ --protocol tcp \ --port 22 \ --cidr 0.0.0.0/0 \ --profile adminuser \ --region us-west-2

    验证安全组具有您添加的入站和出站规则。

    aws ec2 describe-security-groups \ --region us-west-2 \ --profile adminuser \ --group-id security-group-id
  2. 授权到 EFS 挂载目标安全组(efs-walkthrough1-mt-sg)的入站访问。

    在命令提示符处,使用 adminuser 配置文件运行下面的 Amazon CLIauthorize-security-group-ingress 命令来添加入站规则。

    $ aws ec2 authorize-security-group-ingress \ --group-id ID of the security group created for Amazon EFS mount target \ --protocol tcp \ --port 2049 \ --source-group ID of the security group created for EC2 instance \ --profile adminuser \ --region us-west-2
  3. 确认两个安全组现在都授权了入站访问。

    aws ec2 describe-security-groups \ --group-names efs-walkthrough1-ec2-sg efs-walkthrough1-mt-sg \ --profile adminuser \ --region us-west-2

步骤 1.3:启动 EC2 实例

在该步骤中,您将启动 EC2 实例。

启动 EC2 实例
  1. 收集在启动 EC2 实例时需要提供的以下信息:

    • 密钥对名称。有关创建密钥对的说明,请参阅《Amazon EC2 用户指南》中的为您的 Amazon EC2 实例创建密钥对

    • 要启动的 Amazon 系统映像 (AMI) 的 ID。

      您用来启动 EC2 实例的 Amazon CLI 命令需要您想要作为参数部署的亚马逊机器映像(AMI)的 ID。本练习使用 Amazon Linux HVM AMI。

      注意

      您可以使用大部分通用的基于 Linux 的 AMI。如果您使用其他 Linux AMI,请确保使用分发包管理器在实例上安装 NFS 客户端。此外,您可能还需要添加一些软件包。

      对于 Amazon Linux HVM AMI,您可以在 Amazon Linux AMI 找到最新的 ID。您从 Amazon Linux AMI ID 表中选择 ID 值,如下所示:

      • 选择美国西部(俄勒冈)区域。本演练假定您将在美国西部(俄勒冈州)区域(us-west-2)创建所有资源。

      • 选择 EBS 支持的 HVM 64 位类型(因为您在 CLI 命令中指定 t2.micro 实例类型,它不支持实例存储)。

    • 您为 EC2 实例创建的安全组的 ID。

    • Amazon Web Services 区域。本演练使用 us-west-2 区域。

    • 您要在其中启动实例的 VPC 子网的 ID。可以使用 describe-subnets 命令获取子网列表。

      $ aws ec2 describe-subnets \ --region us-west-2 \ --filters "Name=vpc-id,Values=vpc-id" \ --profile adminuser

      选择子网 ID 后,记下 describe-subnets 结果中的以下值:

      • 子网 ID – 创建挂载目标时需要此值。在本练习中,您将在启动了 EC2 实例的同一子网中创建挂载目标。

      • 子网的可用区 – 构建挂载目标 DNS 名称时需要此值,用于将文件系统挂载到 EC2 实例上。

  2. 运行以下 Amazon CLIrun-instances 命令来启动 EC2 实例。

    $ aws ec2 run-instances \ --image-id AMI ID \ --count 1 \ --instance-type t2.micro \ --associate-public-ip-address \ --key-name key-pair-name \ --security-group-ids ID of the security group created for EC2 instance \ --subnet-id VPC subnet ID \ --region us-west-2 \ --profile adminuser
  3. 记下 run-instances 命令返回的实例 ID。

  4. 您创建的 EC2 实例必须有公有 DNS 名称,以便用来连接 EC2 实例并向其中挂载文件系统。公有 DNS 名称的形式为:

    ec2-xx-xx-xx-xxx.compute-1.amazonaws.com

    运行以下 CLI 命令,并记下公有 DNS 名称。

    aws ec2 describe-instances \ --instance-ids EC2 instance ID \ --region us-west-2 \ --profile adminuser

    如果未找到公有 DNS 名称,则检查您在其中启动了 EC2 实例的 VPC 的配置。有关更多信息,请参阅 先决条件

  5. (可选)将一个名称分配给您创建的 EC2 实例。为此,请添加一个标签,其中键名和值设置为要分配给实例的名称。您可以使用以下 Amazon CLI create-tags 命令进行这项操作。

    $  aws ec2 create-tags \ --resources EC2-instance-ID \ --tags Key=Name,Value=Provide-instance-name  \ --region us-west-2 \ --profile adminuser

步骤 2:创建 EFS 资源

在此步骤中,您将执行以下操作:

  • 创建加密 EFS 文件系统。

  • 启用生命周期管理

  • 在启动了 EFS 实例的可用区创建挂载目标。

步骤 2.1:创建 EFS 文件系统

在该步骤中,您将创建一个 EFS 文件系统。记下 FileSystemId,以便稍后在下一步中为文件系统创建挂载目标时使用。

创建文件系统
  • 创建文件系统并添加可选的 Name 标签。

    1. 在命令提示符处,运行以下 Amazon CLI create-file-system 命令。

      $ aws efs create-file-system \ --encrypted \ --creation-token FileSystemForWalkthrough1 \ --tags Key=Name,Value=SomeExampleNameValue \ --region us-west-2 \ --profile adminuser

      您将收到以下响应。

      { "OwnerId": "111122223333", "CreationToken": "FileSystemForWalkthrough1", "FileSystemId": "fs-c657c8bf", "CreationTime": 1548950706.0, "LifeCycleState": "creating", "NumberOfMountTargets": 0, "SizeInBytes": { "Value": 0, "ValueInIA": 0, "ValueInStandard": 0 }, "PerformanceMode": "generalPurpose", "Encrypted": true, "KmsKeyId": "arn:aws:kms:us-west-2:111122223333:a5c11222-7a99-43c8-9dcc-abcdef123456", "ThroughputMode": "bursting", "Tags": [ { "Key": "Name", "Value": "SomeExampleNameValue" } ] }
    2. 记下 FileSystemId 的值。在步骤 2.3:创建挂载目标中为该文件系统创建挂载目标时需要该值。

步骤 2.2:启用生命周期管理

在该步骤中,您将在文件系统上启用生命周期管理,以便使用 EFS 不频繁访问(IA)存储类。要了解更多信息,请参阅管理 EFS 文件系统的存储生命周期策略EFS 存储类

启用生命周期管理
  • 在命令提示符下,运行以下 Amazon CLIput-lifecycle-configuration 命令。

    $ aws efs put-lifecycle-configuration \ --file-system-id fs-c657c8bf \ --lifecycle-policies TransitionToIA=AFTER_30_DAYS \ --region us-west-2 \ --profile adminuser

    您将收到以下响应。

    { "LifecyclePolicies": [ { "TransitionToIA": "AFTER_30_DAYS" } ] }

步骤 2.3:创建挂载目标

在该步骤中,您将在启动了 EC2 实例的可用区中为文件系统创建一个挂载目标。

  1. 确保您已获得以下信息:

    • 您为其创建挂载目标的文件系统 (例如 fs-example) 的 ID。

    • 您在步骤 1:创建 EC2 资源中启动了 EC2 实例的 VPC 子网 ID。

      在本教程中,您在启动了 EC2 实例的同一子网中创建挂载目标,因此您需要子网 ID(例如,subnet-example)。

    • 在上一步中您为挂载目标创建的安全组的 ID。

  2. 在命令提示符下,运行以下 Amazon CLIcreate-mount-target 命令。

    $ aws efs create-mount-target \ --file-system-id file-system-id \ --subnet-id subnet-id \ --security-group ID-of-the security-group-created-for-mount-target \ --region us-west-2 \ --profile adminuser

    您将收到以下响应。

    { "MountTargetId": "fsmt-example", "NetworkInterfaceId": "eni-example", "FileSystemId": "fs-example", "PerformanceMode" : "generalPurpose", "LifeCycleState": "available", "SubnetId": "fs-subnet-example", "OwnerId": "account-id", "IpAddress": "xxx.xx.xx.xxx" }
  3. 您还可以使用 describe-mount-targets 命令来获取为文件系统创建的挂载目标的描述。

    $ aws efs describe-mount-targets \ --file-system-id file-system-id \ --region us-west-2 \ --profile adminuser

步骤 3:将文件系统挂载到 EC2 实例上并测试

在此步骤中,您将执行以下操作:

  • 收集所需信息。

  • 在 EC2 实例上安装 NFS 客户端。

  • 在 EC2 实例上挂载文件系统并测试。

步骤 3.1:收集信息

在执行本节的步骤时,确保您获取以下信息:

  • EC2 实例的公有 DNS 名称,格式如下:

    ec2-xx-xxx-xxx-xx.aws-region.compute.amazonaws.com
  • 文件系统的 DNS 名称。您可以使用以下通用形式构建此 DNS 名称:

    file-system-id.efs.aws-region.amazonaws.com

    您使用挂载目标在其中挂载文件系统的 EC2 实例可以将文件系统的 DNS 名称解析为挂载目标的 IP 地址。

注意

Amazon EFS 不要求您的 EC2 实例具有公有 IP 地址或公有 DNS 名称。前面列出的要求仅针对本演练示例,目的是确保您可以使用 SSH 从 VPC 外部连接到实例。

步骤 3.2:在 EC2 实例上安装 NFS 客户端

您可以从运行 Windows、Linux、macOS X 或任何其他 Unix 变体的计算机连接到您的 EC2 实例。

安装 NFS 客户端
  1. 连接到您的 EC2 实例。有关更多信息,请参阅《Amazon EC2 用户指南》中的连接到您的 EC2 实例

  2. 在 EC2 实例上通过使用 SSH 会话执行以下命令:

    1. (可选) 获取更新并重启。

      $ sudo yum -y update $ sudo reboot

      重启后,重新连接到您的 EC2 实例。

    2. 安装 NFS 客户端。

      $ sudo yum -y install nfs-utils
      注意

      如果在启动 EC2 实例时选择 Amazon Linux AMI 2016.03.0 Amazon Linux AMI,则不需要安装 nfs-utils,因为它已默认包含在此 AMI 中。

步骤 3.3:将文件系统挂载到 EC2 实例上并测试

现在,将文件系统挂载到 EC2 实例上。

  1. 创建一个目录 ("efs-mount-point")。

    $ mkdir ~/efs-mount-point
  2. 挂载 EFS 文件系统。

    $ sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport mount-target-DNS:/ ~/efs-mount-point

    EC2 实例可以将挂载目标的 DNS 名称解析为 IP 地址。您也可以直接指定挂载目标的 IP 地址。

    $ sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport mount-target-ip:/  ~/efs-mount-point
  3. 您已经将 EFS 文件系统挂载到 EC2 实例上,接下来就可以创建文件了。

    1. 更改目录。

      $ cd ~/efs-mount-point
    2. 列出目录的内容。

      $ ls -al

      它应该是空的。

      drwxr-xr-x 2 root root 4096 Dec 29 22:33 . drwx------ 4 ec2-user ec2-user 4096 Dec 29 22:54 ..

    3. 刚创建的文件系统的根目录由根用户拥有并且只能由根用户写入,因此您需要更改权限以添加文件。

      $ sudo chmod go+rw .

      现在,如果您尝试 ls -al 命令,可以看到权限已更改。

      drwxrwxrwx 2 root root 4096 Dec 29 22:33 . drwx------ 4 ec2-user ec2-user 4096 Dec 29 22:54 ..
    4. 创建 文本文件。

      $ touch test-file.txt
    5. 列出目录的内容。

      $ ls -l

现在,您已成功创建一个 EFS 文件系统并将其挂载到您的 VPC 中的 EC2 实例上。

重启后挂载的文件系统将不复存在。为了自动重新挂载目录,可以使用 fstab 文件。如果您使用 Auto Scaling 组来启动 EC2 实例,则也可以在启动配置中设置脚本。

步骤 4:清除

如果不再需要使用创建的资源,应将其删除。可以使用 CLI 删除。

  • 移除 EC2 资源(EC2 实例和两个安全组)。当您删除挂载目标时,Amazon EFS 会删除网络接口。

  • 删除 EFS 资源(文件系统、挂载目标)。

删除本演练中创建的 Amazon 资源
  1. 终止为本教程创建的 EC2 实例。

    $ aws ec2 terminate-instances \ --instance-ids instance-id \ --profile adminuser

    您还可以使用控制台删除 EC2 资源。有关说明,请参阅终止实例

  2. 删除挂载目标。

    只有在删除为文件系统创建的挂载目标后才能删除文件系统。可以使用 describe-mount-targets CLI 命令获得挂载目标列表。

    $ aws efs describe-mount-targets \ --file-system-id file-system-ID \ --profile adminuser \ --region aws-region

    然后,使用 delete-mount-target CLI 命令删除挂载目标。

    $ aws efs delete-mount-target \ --mount-target-id ID-of-mount-target-to-delete \ --profile adminuser \ --region aws-region
  3. (可选) 删除您创建的两个安全组。创建安全组不需要支付费用。

    必须先删除挂载目标的安全组,然后再删除 EC2 实例的安全组。挂载目标的安全组包含一个引用 EC2 安全组的规则。因此,不能先删除 EC2 实例的安全组。

    有关说明,请参阅《Amazon EC2 User Guide》中的 Delete your security group

  4. 通过 delete-file-system CLI 命令删除文件系统。可以使用 describe-file-systems CLI 命令获得文件系统列表。可以从响应中获得文件系统 ID。

    aws efs describe-file-systems \ --profile adminuser \ --region aws-region

    通过提供文件系统 ID 删除文件系统。

    $ aws efs delete-file-system \ --file-system-id ID-of-file-system-to-delete \ --region aws-region \ --profile adminuser