Elastic Beanstalk 환경의 애플리케이션 디렉터리에 Amazon EFS 볼륨을 탑재하려면 어떻게 해야 합니까?
최종 업데이트 날짜: 2020년 12월 28일
AWS Elastic Beanstalk 환경의 애플리케이션 디렉터리에 Amazon Elastic File System(Amazon EFS) 볼륨을 탑재하려고 합니다.
간략한 설명
다음 해결 방법은 PHP 솔루션 스택을 예로 들어 Amazon Linux 1 기반 플랫폼에 Amazon EFS 볼륨을 마운트하기 위한 일반적인 지침을 제공합니다.
다른 솔루션 스택을 사용하는 경우 동일한 단계를 따르되, 다음 옵션 중에서 솔루션 스택에 대한 올바른 애플리케이션 디렉터리 및 스테이징 디렉터리를 선택합니다.
-----------------------------------------------------
Solution stack Application directory Staging directory
Nodejs /var/app/current /tmp/deployment/application
PHP /var/app/current /var/app/ondeck
Ruby (Passenger) /var/app/current /var/app/ondeck
Ruby (Puma) /var/app/current /var/app/ondeck
Java with Tomcat /usr/share/tomcat*/webapps/ROOT /tmp/deployment/application/ROOT
Java SE /var/app/current /var/app/staging
Python /opt/python/current/app /opt/python/ondeck/app
Go /var/app/current /var/app/staging
Single Container Docker /var/app/current /var/app/staging
Multi-Container Docker /var/app/current /var/app/staging
-----------------------------------------------------
중요: Amazon EFS 볼륨을 애플리케이션 디렉터리에 직접 마운트할 수는 없습니다. Elastic Beanstalk 애플리케이션을 배포할 때마다 /var/app/current의 콘텐츠가 /var/app/current.old로 이동하기 때문입니다. 현재 배포된 소스 번들이 애플리케이션 디렉터리로 이동합니다. Amazon EFS 볼륨을 /var/app/current에 탑재하면 배포가 완료된 후 이 볼륨이 /var/app/current.old로 이동합니다. 예를 들어 다음 eb-activity.log 출력을 참조하십시오.
===============================
[2020-02-12T02:28:18.237Z] INFO [3159] - [Application deployment Sample Application@1/StartupStage1/AppDeployEnactHook/01_flip.sh] : Starting activity...
[2020-02-12T02:28:18.431Z] INFO [3159] - [Application deployment Sample Application@1/StartupStage1/AppDeployEnactHook/01_flip.sh] : Completed activity. Result:
++ /opt/elasticbeanstalk/bin/get-config container -k app_staging_dir
+ EB_APP_STAGING_DIR=/var/app/ondeck
++ /opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir
+ EB_APP_DEPLOY_DIR=/var/app/current
+ '[' -d /var/app/current ']'
+ mv /var/app/current /var/app/current.old
+ mv /var/app/ondeck /var/app/current
+ nohup rm -rf /var/app/current.old
===============================
해결 방법
1. 스테이징 디렉터리에서 소스 번들의 압축이 해제되었는지 확인합니다. 다음 예제 eb-activity.log 출력을 참조하세요.
===============================
[2020-02-12T02:28:16.336Z] INFO [3159] - [Application deployment Sample Application@1/StartupStage0/AppDeployPreHook/01_unzip.sh] : Starting activity...
[2020-02-12T02:28:16.631Z] INFO [3159] - [Application deployment Sample Application@1/StartupStage0/AppDeployPreHook/01_unzip.sh] : Completed activity. Result:
++ /opt/elasticbeanstalk/bin/get-config container -k app_user
+ EB_APP_USER=webapp
++ /opt/elasticbeanstalk/bin/get-config container -k app_staging_dir
+ EB_APP_STAGING_DIR=/var/app/ondeck
++ /opt/elasticbeanstalk/bin/get-config container -k source_bundle
+ EB_SOURCE_BUNDLE=/opt/elasticbeanstalk/deploy/appsource/source_bundle
+ rm -rf /var/app/ondeck
+ /usr/bin/unzip -d /var/app/ondeck /opt/elasticbeanstalk/deploy/appsource/source_bundle
Archive: /opt/elasticbeanstalk/deploy/appsource/source_bundle
creating: /var/app/ondeck/.ebextensions/
inflating: /var/app/ondeck/.ebextensions/logging.config
inflating: /var/app/ondeck/scheduled.php
inflating: /var/app/ondeck/index.php
inflating: /var/app/ondeck/cron.yaml
inflating: /var/app/ondeck/styles.css
extracting: /var/app/ondeck/logo_aws_reduced.gif
+ chown -R webapp:webapp /var/app/ondeck
+ chmod 775 /var/app/ondeck
===============================
참고: /opt/elasticbeanstalk/hooks/appdeploy/pre/의 모든 appdeploy pre 후크와 .ebextensions는 스테이징 디렉터리에서 실행됩니다.
2. 소스 번들의 루트 디렉터리에 .ebextensions 폴더를 생성합니다.
3. 특정 디렉터리(예: /efs)에 Amazon EFS 볼륨을 마운트하려면 형식이 지정된 구성 파일(YAML 또는 JSON)을 디렉터리에 추가합니다.
4. Amazon EFS 볼륨을 애플리케이션 디렉터리에 마운트하려면 스테이징 디렉터리에 대한 심볼릭 링크를 생성해야 합니다. /efs에서 스테이징 디렉터리를 가리키는 심볼릭 링크를 생성하려면 container_commands를 사용하여 .ebextensions 폴더에 .config 파일을 생성합니다. 예를 들어, 다음과 같습니다:
container_commands:
01_symlink:
command: ln -s /efs /var/app/ondeck/
참고: Elastic Beanstalk 환경에서 배포하는 동안 appdeploy enact 후크를 실행하면 스테이징 디렉터리의 콘텐츠가 애플리케이션 디렉터리로 이동합니다. 예를 들어, PHP 솔루션에서 flip.sh 스크립트는 스테이징 디렉터리의 콘텐츠를 애플리케이션 디렉터리로 이동합니다. flip.sh 스크립트는 /opt/elasticbeanstalk/hooks/appdeploy/enact/의 AppDeployEnactHook의 첫 번째 스크립트입니다.