문제
root 권한이 없는 계정을 통해 ubuntu를 운용하면, code deploy시 생성된 코드의 directory가 'root'로 변경되어 code deploy가 실패하거나(code deploy 후, build 디렉토리 소유자가 root로 변경되었다.), 해당 디렉토리 내의 특정 작업들이 제한된다.
이에 따라, codedeploy >> appspec.yml >> hooks 부분 script >> 해당 디렉토리에서 추가 작업(ex. log directory 생성)이 있을 경우, code deploy가 실패된다.
왜?? start.sh에는 ecosystem.json을 호출하여 nodejs 코드를 띄워주는데
ecosystem.json에서 error와 out log를 쌓는 디렉토리를 생성한다.
그런데, /home/jane/build 디렉토리 소유자는 root이므로, 'jane' 권한은 폴더를 만들 수 없기 때문에 실패한다.
원리
답은 service codedeploy-agent status에 있다.
이 코드는 아래 Loaded와 같이 /etc/init.d/codedeploy-agent에서 돌아가는데,
/etc/init.d/codedeploy-agent 소유자(그룹)는 2450, users다.
하지만 이런 건 다른 데에도 분명 영향이 있어서 함부로 바꾸면 안된다.
구글링을 통해 찾자.
찾았다.
루트 프로파일 이외의 사용자 프로파일을 사용하여 CodeDeploy 에이전트를 실행하려면 어떻게 해야 하나요?
https://aws.amazon.com/ko/premiumsupport/knowledge-center/codedeploy-agent-non-root-profile/
해결
ubuntu@ip-192-168-23-61:/etc/init.d$ sudo service codedeploy-agent stop
// /etc/init.d/codedeploy/agent에 있는 ""를 "jane"으로 변경. (CodeDeploy agent를 수행할 non-root 계정)
ubuntu@ip-192-168-23-61:/etc/init.d$ sudo sed -i 's/""/"jane"/g' /etc/init.d/codedeploy-agent
// 변경 여부 확인. CODEDEPLOY_USER에 "jane"이 추가되었다.
ubuntu@ip-192-168-23-61:/etc/init.d$ vi /etc/init.d/codedeploy-agent
// /opt/codedeploy/agent에 있는 모든 파일들의 소유자/그룹을 jane:jane으로 변경한다.
ubuntu@ip-192-168-23-61:/usr/lib/systemd/system$ sudo chown jane:jane -R /opt/codedeploy-agent
ubuntu@ip-192-168-23-61:/usr/lib/systemd/system$ sudo chown jane:jane -R /var/log/aws/
// 확인해보자. 진짜 다 바뀌었다.
ubuntu@ip-192-168-23-61:/usr/lib/systemd/system$ cd /opt/codedeploy-agent/
ubuntu@ip-192-168-23-61:/opt/codedeploy-agent$ ll
total 56
drwxr-xr-x 8 jane jane 4096 Jul 5 14:29 ./
drwxr-xr-x 4 root root 4096 Jul 4 15:35 ../
-r--r--r-- 1 jane jane 38 Apr 16 2021 .version
-rw-r--r-- 1 jane jane 353 Mar 23 2021 Gemfile
-rw-r--r-- 1 jane jane 10174 Mar 23 2021 LICENSE
drwxr-xr-x 2 jane jane 4096 Jul 4 15:35 bin/
drwxr-xr-x 2 jane jane 4096 Jul 4 15:35 certs/
-rw-r--r-- 1 jane jane 1158 Mar 23 2021 codedeploy_agent.gemspec
drwxr-xr-x 6 jane jane 4096 Jul 5 18:13 deployment-root/
drwxr-xr-x 4 jane jane 4096 Jul 4 15:35 lib/
drwxr-xr-x 3 jane jane 4096 Jul 4 15:35 state/
drwxr-xr-x 4 jane jane 4096 Jul 4 15:35 vendor/
jane@ip-192-168-23-61:/var/log$ cd aws
jane@ip-192-168-23-61:/var/log/aws$ ll
total 12
drwxr-xr-x 3 jane jane 4096 Jul 4 15:35 ./
drwxrwxr-x 10 root syslog 4096 Jul 6 15:25 ../
drwxr-xr-x 2 jane jane 4096 Jul 6 00:00 codedeploy-agent/
그리고 /etc/init.d의 codedeploy-agent.service 또한 User를 jane으로 입력해주자.
(그렇지 않으면, 서비스는 여전히 root로 돈다)
이제 codedeploy-agent를 다시 실행하면 된다. (sudo는 빼자)
sudo service codedeploy-agent start
sudo service codedeploy-agent status
여기까지 하면, ps aux를 통해 codedeploy-agent가 띄워지는 권한이 root -> jane으로 변경된 것을 확인할 수 있다.
+ 그리고, appspec.yml에서 hook쪽에 runas가 있다면 이번엔 아래와 같은 에러가 발생한다.
[stderr]su: must be run from a terminal
이는 appspec.yml의 hooks 쪽에 있는 runas를 빼주면 된다
(runas가 실행권한과 다르면 상관없는데, agent를 동작시키는 권한과 같을 경우 에러가 발생한다)
'직장생활 > AWS, GCP' 카테고리의 다른 글
[AWS] EC2 Ubuntu CI/CD pipeline 구축 (CodeDeploy 설정) - 2 (+appspec.yml, ecosystem.json) (0) | 2022.07.06 |
---|---|
[AWS] EC2 Ubuntu CI/CD pipeline 구축 (Codebuild 설정) - 1 (0) | 2022.07.06 |
AWS lambda에서 git 쓰기/사용 (0) | 2022.07.06 |
[GCP] Cloud Scheduler: Cloud function 주기적으로 호출하기 (0) | 2022.06.27 |
[GCP] Cloud function에서 nodejs 코드 띄우기 (0) | 2022.06.27 |