(ต้นฉบับถามใน SuperUser แต่ตอนนี้ "ถูกระงับ" - ดู )

ฉันต้องการใช้ Elastic Beanstalk เพื่อโฮสต์แอปพลิเคชัน Joomla อย่างไรก็ตาม มีปัญหาสองสามประการ:

  1. ผู้ใช้จะต้องสามารถอัปโหลดเนื้อหาไปยังไซต์ Joomla ได้
  2. Joomla กำลังอัปเดตตัวเอง และฉันคาดว่าฉันจะต้องติดตั้งส่วนขยายเพิ่มเติมเมื่อมีการปรับใช้ครั้งแรก

ฉันรู้ว่าด้วยการแฮ็ก/ปรับแต่งจำนวนมาก ฉันสามารถกำหนดค่าสภาพแวดล้อม Joomla ในพื้นที่ จากนั้นใช้สำหรับการดูแลไซต์และผลักดันการเปลี่ยนแปลงไปยังแอป EB โดยใช้ Git

อย่างไรก็ตาม ฉันกำลังใช้แนวคิดในการปรับใช้ครั้งเดียวกับ Elastic Beanstalk และกำหนดค่าสภาพแวดล้อมเพื่อให้บริการเนื้อหาจาก Elastic File System จากนั้นจะสามารถแชร์กับอินสแตนซ์ใดๆ ภายในกลุ่มการปรับขนาดอัตโนมัติที่สร้างโดย Elastic Beanstalk

ฉันรู้ว่าการสร้างและติดตั้ง EFS กับอินสแตนซ์ภายใน EB สามารถทำได้โดยใช้ไฟล์การกำหนดค่าที่พบที่นี่อย่างไรก็ตาม ถึงแม้ว่า EFS จะถูกเมาต์จริง ๆ แล้ว แต่ดูเหมือนว่าแอปพลิเคชันจะยังคงให้บริการจากไดรฟ์ในเครื่อง

นอกจากนี้ยังมีคำแนะนำ AWS อย่างเป็นทางการสำหรับการปรับใช้เว็บไซต์ Wordpress ใช้ EFS ที่นี่ เมื่อตรวจสอบไฟล์กำหนดค่าในโฟลเดอร์ .ebextensions ฉันจะเห็นว่าไฟล์กำหนดค่าที่ต่อเชื่อม EFS จะสร้างลิงก์สัญลักษณ์ระหว่างไดเร็กทอรีการต่อเชื่อมและ wp-content/uploads สิ่งนี้อาจใช้ได้กับการติดตั้ง Wordpress แต่สิ่งที่ฉันต้องการจะทำกับ Joomla คือการให้บริการแอปพลิเคชันทั้งหมดจาก EFS

ดูเหมือนว่าฉันต้องการวิธีสร้างลิงก์สัญลักษณ์ระหว่างรูทของแอปพลิเคชันและไดเร็กทอรี mount หรือเพียงแค่เปลี่ยนไดเร็กทอรีรูทของแอปพลิเคชันให้เป็นไดเร็กทอรีเมานต์เอง ปัญหาคือฉันไม่สามารถหาวิธีทำสิ่งเหล่านี้ได้

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมมาก

answer

ฉันทำสิ่งนี้มาไกลแล้วด้วยตัวฉันเอง ฉันติดอยู่สองสามประเด็น แต่นี่คือสิ่งที่ฉันมี:

ฉันสร้างไฟล์ชื่อ 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

หากคุณผ่านสิ่งนี้มา โปรดแจ้งให้เราทราบ ตอนนี้ฉันต้องสร้างใหม่ทุกครั้งที่ต้องการปรับใช้การอัปเดต

ให้ฉันติดตามคำตอบของ Craig สิ่งที่ Craig ใช้คือตัวเลือกเพียงแค่เปลี่ยนไดเร็กทอรีรูทของแอปพลิเคชันให้เป็นไดเร็กทอรี mountตามที่กล่าวไว้ในคำถาม อย่างไรก็ตาม วิธีนี้ใช้ไม่ได้ผล การปรับใช้ซ้ำล้มเหลว เนื่องจากflip.shไม่สามารถย้าย /var/app/current เนื่องจาก EFS ติดตั้งอยู่ภายใน flip.shเป็นส่วนหนึ่งของสภาพแวดล้อม Beanstalk ที่ให้บริการโดย AWS
/var/www/htmlใช้ในเส้นทางจุดเชื่อมต่อของ Craig เป็นเพียงลิงก์สัญลักษณ์ไปยัง/var/app/current.

ฉันใช้ตัวเลือกอื่นที่กล่าวถึงในคำถามสำเร็จแล้วซึ่งสร้างลิงก์สัญลักษณ์ระหว่างรูทของแอปพลิเคชันและไดเร็กทอรีเมานต์

การดำเนินงาน:
สำหรับการติดตั้ง EFS ผมใช้ไฟล์ config .ebextensions/storage-efs-mountfilesystem.config, ให้บริการโดย AWS ใน.ebextensions/storage-efs-mountfilesystem.configผมตั้งจุดเมานท์ดังต่อไปนี้
option_settings: aws:elasticbeanstalk:application:environment: MOUNT_DIRECTORY: '/efs' จากนั้นในแพคเกจโปรแกรมประยุกต์ฝักถั่วฉันสร้างการเชื่อมโยงสัญลักษณ์:
ln -s /efs ./docroot เพื่อที่จะรวมถึงการเชื่อมโยงสัญลักษณ์ในแพคเกจโปรแกรมประยุกต์ฝักถั่วผมสร้างไฟล์ ZIP ที่มีคำสั่งดังต่อไปนี้:
zip --symlinks -r ../beanstalk_application.zip . --exclude=*.git* ไฟล์ที่ได้รับการยกเว้นเป็นคอมไพล์ เกี่ยวข้องกับที่เก็บ เนื่องจากฉันใช้ git เพื่อจัดเก็บการกำหนดค่า และไม่ควรรวมไฟล์ที่เก็บ git ไว้ในแพ็คเกจ

ในElastic Beanstalk > การกำหนดค่า > การกำหนดค่าซอฟต์แวร์ตัวเลือกรูทเอกสารจะต้องตั้งค่าเป็น/docroot