codecommit/codebuild/codedeploy를 통해 AWS의 EC2 인스턴스에 Nodejs 애플리케이션을 배포하려고 합니다. 내 codedeploy의 appspec.yml 파일에는 애플리케이션이 시작될 때 호출되는 application_start.sh라는 스크립트가 있습니다. pm2를 다시 시작하는 데 사용합니다.
#!/bin/bash
pm2 delete /home/ubuntu/server/app.js 2> /dev/null
CREDENTIALS_SOURCE=$CREDENTIALS_SOURCE pm2 start /home/ubuntu/server/app.js --update-env
보시다시피, Nodejs 코드에 대한 env 변수를 설정하기 위해 bash 스크립트에서 읽는 env 변수($CREDENTIALS_SOURCE)가 있습니다.
문제는 스크립트가 처음 실행될 때(aws 파이프라인을 통해 자동으로) $CREDENTIALS_SOURCE 변수를 읽지 못하고 서버가 충돌한다는 것입니다. 서버에 SSH로 접속하고 sh 스크립트에서와 정확히 동일한 명령을 실행하면 작동합니다.
CREDENTIALS_SOURCE=dev
서버 환경 변수에서 읽는 대신 bash 스크립트를 "dev"로 하드코드하도록 변경할 때도 작동합니다.
나는 export CREDENTIALS_SOURCE=dev
.bashrc에 있고 그것을 가져왔습니다. 이렇게 하면 printenv
환경 변수가 표시됩니다.
답변1
해결책을 찾았고 작동하지만 그것이 올바른 방법인지는 모르겠습니다.
분명히 pm2는 서버에서 환경 변수를 읽을 수 없습니다. nodeJS 애플리케이션은 .NET을 node app.js
실행하는 대신 실행할 때 env 변수에 액세스할 수 있습니다.pm2 start app.js
다음 명령을 사용하여 pm2에서 작동하도록 만들었습니다.
sudo -E pm2 start app.js
내 생각에는 env 변수가 우분투 사용자가 아닌 루트(sudo) 사용자에게 저장되어 있는 것 같습니다. 맞습니까?
위의 방법은 완벽한 해결책은 아닙니다. 더 나은 솔루션:
export CREDENTIALS_SOURCE=dev
추가하다/etc/profile
source /etc/profile
시작하기application_start.sh
전에 추가pm2
작동합니다!
원천: