Назад | Перейти на главную страницу

Можно ли установить корень документа AWS Elastic Beanstalk на EFS?

(Оригинал спрашивал на SuperUser, но теперь "в ожидании" - Посмотреть)

Я действительно хотел бы иметь возможность использовать Elastic Beanstalk для размещения приложения Joomla. Однако есть пара проблем:

  1. Пользователи должны иметь возможность загружать контент на сайт Joomla.
  2. 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