在 AWS EFS 上托管网站
Hosting website on AWS EFS
我知道我可以 host a static website on S3,但这可以用 AWS EFS 完成吗?甚至推荐吗?
EFS 是弹性文件系统。基本上 EFS 是一个可以附加到多个实例的卷,在自动缩放的情况下非常有用。
但是 EFS 的基本功能是卷,所以当然您可以使用 EFS 作为卷在 EC2 实例上托管网站。问题在于定价,因为 EFS 比 EBS 更昂贵。
而且在 S3 上托管静态网站也很容易,因为您只需将文件上传到存储桶即可。如果是 EFS,您将需要一个 EC2 实例,然后将 EFS 挂载到 EC2 实例,然后为网站设置 Web 服务器,然后为网站提供服务。所以使用EFS托管静态网站工作量太大。
所以我会推荐S3。
可以做到,但考虑到价格和性能,我不会推荐它。 EFS 目前是每月 0.30 美元/GB,S3 是每月 0.03 美元/GB。此外,从 EFS 提供服务需要一个或多个 运行 EC2 实例。我不知道任何基准测试,但我完全希望 S3 也能提供更好的性能,因为 S3 会自动扩展。
我目前使用 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 配置 > 软件中将文档根设置为 /efs
您还可以通过 EC2 实例设置 FTP 对 EFS 的访问:
- 创建并下载密钥文件:EC2 > 网络与安全 > 密钥对 > 创建密钥对
- Select刚刚创建的密钥对:Beanstalk>配置>安全>虚拟机权限>EC2密钥对
- 然后您可能希望将 .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,
}
注意:您的 "host" 可能会发生变化,因为您使用的是 Elastic Beanstalk,并且实例一直在上下旋转。到目前为止,我还没有找到更简单的方法来访问 EFS 上的文件。
我知道我可以 host a static website on S3,但这可以用 AWS EFS 完成吗?甚至推荐吗?
EFS 是弹性文件系统。基本上 EFS 是一个可以附加到多个实例的卷,在自动缩放的情况下非常有用。
但是 EFS 的基本功能是卷,所以当然您可以使用 EFS 作为卷在 EC2 实例上托管网站。问题在于定价,因为 EFS 比 EBS 更昂贵。
而且在 S3 上托管静态网站也很容易,因为您只需将文件上传到存储桶即可。如果是 EFS,您将需要一个 EC2 实例,然后将 EFS 挂载到 EC2 实例,然后为网站设置 Web 服务器,然后为网站提供服务。所以使用EFS托管静态网站工作量太大。
所以我会推荐S3。
可以做到,但考虑到价格和性能,我不会推荐它。 EFS 目前是每月 0.30 美元/GB,S3 是每月 0.03 美元/GB。此外,从 EFS 提供服务需要一个或多个 运行 EC2 实例。我不知道任何基准测试,但我完全希望 S3 也能提供更好的性能,因为 S3 会自动扩展。
我目前使用 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 配置 > 软件中将文档根设置为 /efs
您还可以通过 EC2 实例设置 FTP 对 EFS 的访问:
- 创建并下载密钥文件:EC2 > 网络与安全 > 密钥对 > 创建密钥对
- Select刚刚创建的密钥对:Beanstalk>配置>安全>虚拟机权限>EC2密钥对
- 然后您可能希望将 .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,
}
注意:您的 "host" 可能会发生变化,因为您使用的是 Elastic Beanstalk,并且实例一直在上下旋转。到目前为止,我还没有找到更简单的方法来访问 EFS 上的文件。