【问题标题】:Hosting website on AWS EFS在 AWS EFS 上托管网站
【发布时间】:2016-09-09 20:58:57
【问题描述】:

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

【问题讨论】:

  • 投反对票是怎么回事?

标签: amazon-web-services amazon-s3 amazon-efs


【解决方案1】:

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

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

在 S3 上托管静态网站也很容易,因为您只需将文件上传到存储桶即可。如果是 EFS,您将需要一个 EC2 实例,然后将 EFS 挂载到 EC2 实例,然后为网站设置 Web 服务器,然后为网站提供服务。因此,使用 EFS 托管静态网站的工作量太大。

所以我会推荐S3。

【讨论】:

  • 谢谢。我们关注 EFS 的原因之一是从我们的开发 CMS(位于 EFS 上)生成静态站点,而无需进行 s3 上传。但你是对的,对于我们需要做的事情,S3 比 EFS 便宜得多
  • 根据本网站的生产能力,直接从您的 CMS 输出位置提供服务可能很危险。糟糕的一代可能会破坏您的网站。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我目前使用 Elastic Beanstalk 进行此设置。 我只有一个 .ebextensions 文件夹,里面有两个脚本:

    • 01-umount-efs.config
    • 02-mount-efs.config

    01-umount-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-mount-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 配置 > 软件中将 Document Root 设置为 /efs

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

    1. 创建并下载密钥文件:EC2 > NETWORK & SECURITY > Key Pairs > Create Key Pair
    2. 选择您刚刚创建的密钥对:Beanstalk > 配置 > 安全 > 虚拟机权限 > EC2 密钥对
    3. 然后您可能希望将 .pem 文件转换为 .ppk 并使用它通过 sftp 进行连接

    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 上的文件。

    【讨论】:

      猜你喜欢
      • 2022-11-06
      • 2018-09-14
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 2011-08-02
      • 1970-01-01
      相关资源
      最近更新 更多