(Оригинал спрашивал на SuperUser, но теперь "в ожидании" - Посмотреть)
Я действительно хотел бы иметь возможность использовать Elastic Beanstalk для размещения приложения Joomla. Однако есть пара проблем:
Я знаю, что с помощью множества хаков / настроек я мог бы настроить локальную среду Joomla, затем использовать ее для администрирования сайта и вносить изменения в приложение EB с помощью Git.
Однако я склоняюсь к идее выполнения единого развертывания в Elastic Beanstalk и настройки среды для обслуживания контента из эластичной файловой системы. Затем он может быть передан любому из экземпляров в группе автомасштабирования, созданной Elastic Beanstalk.
Я знаю, что создание и подключение EFS к экземплярам внутри EB может быть достигнуто с помощью найденных файлов конфигурации. Вотоднако, хотя EFS действительно смонтирован, приложение все равно обслуживается с локального диска.
Кроме того, есть официальные инструкции AWS по развертыванию сайта Wordpress с использованием EFS. Вот. После проверки файлов конфигурации в папке .ebextensions я вижу, что файл конфигурации, который монтирует EFS, создает символическую ссылку между каталогом монтирования и wp-content / uploads. Это может работать для установки Wordpress, но то, что я хотел бы сделать с Joomla, - это обслуживать все приложение из EFS.
Похоже, мне нужен либо способ создать символическую ссылку между корнем приложения и каталогом монтирования, либо просто изменить корневой каталог приложения на сам каталог монтирования. Проблема в том, что я не совсем понимаю, как делать ни то, ни другое.
Любая помощь приветствуется.
Я так далеко зашел в этом сам. Я застрял в нескольких вопросах. Но вот что у меня есть:
Я создал файл 01-mount-efs.config в папке .ebextensions в корне моего приложения со следующим содержимым:
##########################################################
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». Убедитесь, что вы оставили тот, который уже есть, просто добавьте «по умолчанию» в конец.
Для меня это работает в первый раз или когда я выбираю «Перестроить среду», однако при развертывании обновления я получаю сообщение об ошибке, когда экземпляр пытается создать и запустить:
mv /var/app/current /var/app/current.old
Он говорит: Каталог не пуст
Я думаю, что проблема в том, что монтирование не позволяет удалить /var/app/current.old
Если вы справитесь с этим, дайте мне знать, сейчас мне нужно перестраивать каждый раз, когда я хочу развернуть обновление.
Позвольте мне продолжить ответ Крейга. Крейг использует вариант просто измените корневой каталог приложения на сам каталог монтирования, как упоминалось в вопросе. Однако такой подход не работает. Повторное развертывание не удается, поскольку flip.sh
невозможно переместить / var / app / current, потому что внутри него смонтирована EFS. flip.sh
является частью среды Beanstalk, предоставляемой AWS.
/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