在AWS EFS上托管网站

时间:2016-09-09 20:58:57

标签: amazon-web-services amazon-s3 aws-elasticfilesystem

我知道我可以host a static website on S3,但这可以通过AWS EFS完成吗?甚至是推荐吗?

3 个答案:

答案 0 :(得分:2)

EFS是弹性文件系统。基本上EFS是一个可以附加到多个实例的卷,在自动扩展的情况下非常有用。

但EFS的基本功能是音量,因此当然您可以使用EFS作为音量在EC2实例上托管网站。问题在于定价,因为EFS比EBS更昂贵。

并且在S3上托管静态网站非常简单,因为您只需将文件上传到存储桶即可。如果是EFS,您将需要一个EC2实例,然后您将EFS安装到EC2实例,然后为该网站设置Web服务器,然后为该网站提供服务。因此,使用EFS托管静态网站的工作量太大了。

所以我会推荐S3。

答案 1 :(得分:1)

可以这样做,但由于定价和性能,我不推荐它。 EFS目前为0.30美元/ GB,S3为每月0.03美元/ GB。此外,从EFS提供服务需要一个或多个正在运行的EC2实例。我不知道任何基准测试,但我完全希望S3能够提供更好的性能,因为S3会自动缩放。

答案 2 :(得分:0)

我目前使用Elastic Beanstalk进行此设置。 我所拥有的是一个带有两个脚本的.ebextensions文件夹:

  • 01-卸除-efs.config
  • 02贴装efs.config

<强> 01-卸除-efs.config

commands:
  01_mount:
    command: umount /var/app/current/efs || /bin/true
  02_mount:
    command: umount -l /var/app/current/efs || /bin/true

<强> 02贴装efs.config

# Mount
commands:
  create_post_dir:
    command: "mkdir -p /opt/elasticbeanstalk/hooks/appdeploy/post"
    ignoreErrors: true
  do_something:
    command: "/sbin/service httpd restart"
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/99_mount_efs.sh":
      mode: "000755"
      content : |
        #!/bin/bash

        EC2_REGION="ap-southeast-2"
        EFS_MOUNT_DIR=/var/app/current/efs
        EFS_FILE_SYSTEM_ID=fs-xxxxxxxx
        EC2_ZONE=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)

        echo "Mounting EFS filesystem ${EFS_DNS_NAME} to directory ${EFS_MOUNT_DIR} ..."

        echo "Region is ${EC2_REGION}"

        echo 'Stopping NFS ID Mapper...'
        service rpcidmapd status &> /dev/null
        if [ $? -ne 0 ] ; then
            echo 'rpc.idmapd is already stopped!'
        else
            service rpcidmapd stop
            if [ $? -ne 0 ] ; then
                echo 'ERROR: Failed to stop NFS ID Mapper!'
                exit 1
            fi
        fi

        echo 'Checking if EFS mount directory exists...'
        if [ ! -d ${EFS_MOUNT_DIR} ]; then
            echo "Creating directory ${EFS_MOUNT_DIR} ..."
            mkdir -p ${EFS_MOUNT_DIR}
            if [ $? -ne 0 ]; then
                echo 'ERROR: Directory creation failed!'
                exit 1
            fi
            chmod 777 ${EFS_MOUNT_DIR}
            if [ $? -ne 0 ]; then
                echo 'ERROR: Permission update failed!'
                exit 1
            fi
        else
            echo "Directory ${EFS_MOUNT_DIR} already exists!"
        fi

        mountpoint -q ${EFS_MOUNT_DIR}
        if [ $? -ne 0 ]; then
            echo "mount -t nfs4 -o nfsvers=4.1 ${EC2_ZONE}.${EFS_FILE_SYSTEM_ID}.efs.${EC2_REGION}.amazonaws.com:/ ${EFS_MOUNT_DIR}"
            mount -t nfs4 -o nfsvers=4.1 ${EC2_ZONE}.${EFS_FILE_SYSTEM_ID}.efs.${EC2_REGION}.amazonaws.com:/ ${EFS_MOUNT_DIR}
            if [ $? -ne 0 ] ; then
                echo 'ERROR: Mount command failed!'
                exit 1
            fi
        else
            echo "Directory ${EFS_MOUNT_DIR} is already a valid mountpoint!"
        fi

        echo 'EFS mount complete.'

只需要更改ap-southeast-2(EC2_REGION)和fs-xxxxxxxx(EFS_FILE_SYSTEM_ID)。

然后在您的Beanstalk配置&gt;软件将Document Root设置为 / efs

您还可以通过EC2实例设置对EFS的FTP访问:

  1. 创建并下载密钥文件:EC2&gt;网络&amp;安全&gt;密钥对&gt;创建密钥对
  2. 选择刚刚创建的密钥对:Beanstalk&gt;配置&gt;安全&gt; <虚拟机权限> EC2密钥对
  3. 您可能希望将.pem文件转换为.ppk并使用它通过sftp进行连接
  4. 示例FTP设置

    {
        "type": "sftp",
        "host": "ec2-XX-XX-XXX-XX.ap-southeast-2.compute.amazonaws.com",
        "user": "ec2-user",
        "port": "22",
        "remote_path": "/var/app/current/efs/",
        "connect_timeout": 30,
        "ftp_passive_mode": true,
        "ssh_key_file": "C:/Path/To/KeyFile/ec2-access.ppk",
        "remote_time_offset_in_hours": 10,
    }
    

    注意:您的“主机”可能会发生变化,因为您正在使用Elastic Beanstalk并且实例会一直向上和向下旋转。到目前为止,我还没有找到一种更简单的方法来访问EFS上的文件。