(最初在 SuperUser 上询问,但现在“暂停” -看法)
我非常希望能够使用 Elastic Beanstalk 来托管 Joomla 应用程序。但是,存在一些问题:
- 用户需要能够将内容上传到 Joomla 网站
- Joomla 是自我更新的,我预计在初始部署完成后我将需要安装更多的扩展。
我知道,通过大量的黑客/调整,我可以配置本地 Joomla 环境,然后使用它进行站点管理并使用 Git 将更改推送到 EB 应用程序。
但是,我倾向于对 Elastic Beanstalk 进行单一部署,并配置环境以从 Elastic File System 提供内容。然后可以将其共享给 Elastic Beanstalk 创建的自动缩放组中的任何实例。
我知道可以使用找到的配置文件创建 EFS 并将其安装到 EB 中的实例这里然而,虽然 EFS 确实已安装,但应用程序仍然似乎由本地驱动器提供服务。
此外,还有使用 EFS 部署 Wordpress 网站的官方 AWS 说明这里。检查 .ebextensions 文件夹中的配置文件后,我可以看到挂载 EFS 的配置文件在挂载目录和 wp-content/uploads 之间创建了一个符号链接。这可能适用于 Wordpress 安装,但我希望使用 Joomla 从 EFS 为整个应用程序提供服务。
看来我要么需要一种方法来在应用程序根目录和挂载目录之间创建符号链接,要么只需将应用程序的根目录更改为挂载目录本身。问题是我无法弄清楚如何做这两件事。
任何帮助将非常感激。
答案1
我自己已经做了这么多。我遇到了几个问题。但我有以下问题:
我在应用程序根目录中的 .ebextensions 文件夹中创建了一个名为 01-mount-efs.config 的文件,其内容如下:
##########################################################
Enter your EFS File System ID into EFS_VOLUME_ID and your mount point in EFS_MOUNT_DIR
##########################################################
option_settings:
- option_name: EFS_VOLUME_ID
value: fs-xxxxxxxx
- option_name: EFS_MOUNT_DIR
value: /var/www/html/efs
##########################################################
#### Do not touch below
##########################################################
- option_name: EFS_REGION
value: '`{"Ref": "AWS::Region"}`'
packages:
yum:
nfs-utils: []
jq: []
commands:
01_mount:
command: "/tmp/mount-efs.sh"
files:
"/tmp/mount-efs.sh":
mode: "000755"
content : |
#!/bin/bash
EFS_REGION=$(/opt/elasticbeanstalk/bin/get-config environment | jq -r '.EFS_REGION')
EFS_MOUNT_DIR=$(/opt/elasticbeanstalk/bin/get-config environment | jq -r '.EFS_MOUNT_DIR')
EFS_VOLUME_ID=$(/opt/elasticbeanstalk/bin/get-config environment | jq -r '.EFS_VOLUME_ID')
echo "Mounting EFS filesystem ${EFS_DNS_NAME} to directory ${EFS_MOUNT_DIR} ..."
echo "Region is ${EFS_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
AZ=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
echo "mount -t nfs4 -o nfsvers=4.1 ${AZ}.${EFS_VOLUME_ID}.efs.${EFS_REGION}.amazonaws.com:/ ${EFS_MOUNT_DIR}"
mount -t nfs4 -o nfsvers=4.1 ${AZ}.${EFS_VOLUME_ID}.efs.${EFS_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.'
这会将您的 EFS 卷安装到应用程序根目录中名为“efs”的目录中。然后在 Elastic Beanstalk > 配置 > 软件配置中,您需要将文档根目录设置为“/efs”
另外,在 Elastic Beanstalk > 配置 > 实例中,您需要将“默认”添加到“EC2 安全组”,确保保留已经存在的安全组,只需将“,default”附加到末尾即可。
对我来说,这是第一次有效,或者当我选择“重建环境”但部署更新时,当实例尝试构建和运行时我收到错误:
mv /var/app/current /var/app/current.old
它说:目录不为空
我认为这是 mount 不允许其删除 /var/app/current.old 的问题
如果您解决了这个问题请告诉我,现在每次我想要部署更新时我都需要重建。
答案2
让我跟进一下 Craig 的回答。Craig 实现的是选项只需将应用程序的根目录更改为挂载目录本身,如问题中所述。但是,这种方法不起作用。重新部署失败,因为flip.sh
无法移动 /var/app/current,因为 EFS 安装在其中。flip.sh
是 Beanstalk 环境的一部分,由 AWS 提供。Craig
/var/www/html
的挂载点路径中使用的只是指向 的符号链接/var/app/current
。
我已经成功实现了问题中提到的另一个选项,即在应用程序根目录和挂载目录之间创建符号链接。
实现:
为了安装 EFS,我使用配置文件.ebextensions/storage-efs-mountfilesystem.config
,由 AWS 提供。在 中.ebextensions/storage-efs-mountfilesystem.config
,我设置了挂载点,如下所示:
option_settings: aws:elasticbeanstalk:application:environment: MOUNT_DIRECTORY: '/efs'
然后,在 Beanstalk 应用程序包中,我创建了一个符号链接:
ln -s /efs ./docroot
为了在 Beanstalk 应用程序包中包含符号链接,我使用以下命令创建了 ZIP 存档:
zip --symlinks -r ../beanstalk_application.zip . --exclude=*.git*
排除的文件与 git 存储库相关,因为我使用 git 来存储配置,并且不希望在包中包含 git 存储库文件。
在Elastic Beanstalk > 配置 > 软件配置选项文档根目录需要设置为/docroot