2017-02-15 1 views
1

기본적으로 질문 : 탄력적 인 Beanstalk 배포 프로세스 중에 적용될 환경 변수를 어떻게 설정합니까?탄력적 인 beanstalk 배포 중에 적용된 환경 변수

배포 도중 응용 프로그램에서 액세스 할 수있는 배포 중에 환경 변수를 설정하는 것에 대해 이야기하는 것이 아니라 Elastic Beanstalk의 빌드 스크립트의 특정 동작을 수정하는 환경 변수를 설정하려고합니다.

명확하게 - 나는 일반적으로 이것이 나쁜 생각이라고 생각하지만,이 경우에는 괜찮을 수도 있으므로 실험으로 시도하고 있습니다. 여기에 왜 내가 조사하고 있는지, 왜 그것이 괜찮은지 알 수있는 이유에 대한 배경이 있습니다.

미국의 AWS에서 중국의 AWS로 서버를 전송하는 중입니다. 서버를 배치하는 중입니다. 하루에 따라 시간의 50 % ~ 100 % 사이에서 실패합니다. 이것은 개발 과정에서 커다란 고통입니다.하지만 저는이 프로덕션 환경에서 어떻게 작업 할 것인지에 대해 주로 염려합니다.

파이썬 2.7 실행 아마존 리눅스 서버이며,하는 동안 로그를 설치 PIP 실패는 주로 모든 에 의해 생성되는 동안 한 번에 던져 동료에 의해 다시 몇 연결로, 시간 초과 오류를 참조하는 것을 나타냅니다 pypi에서 패키지를 다운로드하십시오. 이를 확인하기 위해 몇 가지 패키지를 수동으로 설치하기 위해 인스턴스로 ssh'd했고 작은 샘플 크기로 비슷한 실패율을 보았습니다. 이것은 중국의 GFW 반대편에있는 콘텐츠에 액세스 할 때 매우 일반적이라는 점에 유의하십시오.

그래서, 난 내 로컬 컴퓨터에 핍 다운로드의 패키지가 다음 AWS는 내 서버와 동일한 지역에 위치한 S3 버킷로이야 동기화하는 스크립트를 썼다. 이렇게하면 배포하는 동안 GFW를 건너 뛸 필요가 없습니다.

내 원래 계획은 (내가 뭔가를 놓친하지 않는 한) AWS CP의 핍 캐시 S3에서 패키지가 있지만, 다소 의외로 정직 것으로 나타나지 않는 .ebextension을 추가했다.

따라서 계획 B와 같이 패키지를 인스턴스의 로컬 디렉토리로 리디렉션합니다. 이것은 잘 작동하지만, pip 설치를 사용하여 패키지를 pypi에서 다운로드하지 않고 로컬 디렉토리에서 가져 오도록을 설치할 수 없습니다.

pip 설명서에 따라 PIP_FIND_LINKS 환경 변수를 내 패키지 디렉토리로 지정하면 pip가 "자연스럽게"패키지를 pypi가 아닌 내 디렉토리에서 가져올 것으로 예상했습니다. EB 변경 스크립트에 대한 변경 사항을 투명하게 만들고 이것이 합리적인 해결책이라고 생각한 이유는 무엇입니까?

은 지금까지 나는 시도했다 :

1) 행운과 함께, PIP_FIND_LINKS =/경로 /로/패키지를 내보내는 명령. I이 다른 세션에서 호출되는 전개 단계에 기인 것으로, 그래서 다음 시도 :

2) (이전 수출 외에)에 수출 PIP_FIND_LINKS =/경로를 추가 명령/행/package ~ ~./profile을 새 세션에 적용하려고 시도합니다.

ec2_user와 root 모두에서 명령을 실행하려고 시도했지만 어느 것도 작동하지 않습니다.

이 점을 계속 지키기보다는 EB, 핍 등의 뉘앙스를 조금 더 경험 한 사람이 지침을 제공 할 수 있기를 바랍니다.

+0

어떤 pypi 라이브러리가 문제의 원인 이었습니까? 가끔 내 requirements.txt에는 pypi에 없지만 setup()을 통해 repo에서 설치 한 라이브러리가 포함되어 있습니다. 이로 인해 배포가 실패했습니다. 제 주위에는 요구 사항을 수정하고 대신 도커 환경을 사용하여 배포 스크립트를보다 잘 제어 할 수있었습니다. –

+0

실패한 라이브러리는 실행마다 다르고 때로는 실패가 없습니다. 이것은 실제로 무작위 연결 차단과 관련이있는 것으로 보입니다. 이는 GFW를 통과 할 때 매우 일반적이며 내 종속성을 로컬에 저장하려는 이유입니다. 또한이 요구 사항 파일의 상위 집합이 문제없이 중국 이외 지역에서 1 년 이상 동안 사용되었다고 언급 했어야합니다. – gary

답변

1

어떤 생각을 한 후에는 pip config file이 환경 변수보다 더 안정적인 솔루션이어야한다고 결정한 후.

이것은 .ebextensions로 구현하기 쉽다는 것이 밝혀졌습니다. 내가 처음 다운로드 스크립트를 생성 한 후 VIRTUALENV 폴더에 직접 설정 파일을 만듭니다

마지막으로, 명령 우리가 방금 만든 스크립트를 호출하는 데 사용됩니다
files: 

    /home/ec2-user/download_packages.sh: 
    mode: "000500" 
    owner: root 
    group: root 
    content: | 
     #!/usr/bin/env bash 

     package_dir=/path/to/packages 

     mkdir -p $package_dir 
     aws s3 sync s3://bucket/packages $package_dir 

    /opt/python/run/venv/pip.conf: 
    mode: "000755" 
    owner: root 
    group: root 
    content: | 
     [install] 
     find-links = file:///path/to/packages 
     no-index=false 

:

commands: 

    03_download_packages: 
    command: bash /home/ec2-user/download_packages.sh 

하나 잠재적 인 문제는 pip가 로컬 패키지 디렉토리를 우회하여 우리의 private git repo에 저장된 패키지를 다운로드하므로 여전히 시간 초과 오류가 발생할 가능성이 있지만 설치해야하는 패키지의 일부분을 나타냅니다. 움직일 수 있는.

장기적인 해결책이 될지 확실하지 않지만 매우 간단하며 (테스트 하루 만에 ...) 실패율이 50 % ~ 100 %에서 0 %로 떨어졌습니다.