본문 바로가기
백엔드

AWS CodeDeploy를 이용한 배포 성공 이후 발생하는 permission denied

by hseong 2023. 11. 7.

개요

현재 제가 진행하고 있는 프로젝트인 애니프렌즈 백엔드의 개발 환경 배포는 Github Action + AWS S3 + CodeDploey로 이루어집니다. 배포 환경 설정을 위해 ec2 인스턴스에 S3와 CodeDeploy 접근 권한을 가진 역할을 부여하였고 CodeDeploy 역시 기본 생성 시 부여되는 권한을 가지고 있습니다.
문제는 배포까지 성공적으로 이루어졌음에도 애플리케이션이 실행되지 않았습니다.



원인

이유를 찾기 위해서 뒤져볼 로그는 /opt/codedeploy-agent/deployment-root/deployment-logs 디렉터리 하위의 codedeploy-agent-deployments.log 입니다. 로그를 읽기 위해 다음 명령어를 입력해줍니다.

cat codedeploy-agent-deployments.log

배포가 성공한 것을 확인할 수는 있지만 권한 오류가 빵빵 터지면서 정상적으로 로그 파일에 접근하지 못하는 것 또한 확인할 수 있습니다.

이러한 문제가 발생한 원인은 제가 작성한 appspec.yml때문입니다.

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ec2-user/app/deploy

hooks:
  ApplicationStart:
    - location: scripts/deploy.sh
      timeout: 60
      runas: ec2-user

appspec.yml은 files, resources, permissions, hooks 4개의 섹션으로 구성되어 있습니다. 이 중 resources는 AWS ECS와 Lambda 전용 섹션이며 permissions는 EC2 전용 섹션입니다.

위 파일의 경우 개인 permissions 섹션이 누락되어있지만 AWS 개인 계정에서 배포시에 정상 작동하는 것을 확인하였습니다. 이번 프로젝트에서도 해당 파일을 그대로 적용하였으나 한 가지 차이점은 IAM 계정을 이용하였다는 것입니다. 따라서 이는 권한 차이로 인해 permission denied 오류가 발생한 것으로 추정됩니다.

해결

이제 원인을 알았으니 누락된 permissions 섹션을 추가해줍니다.

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ec2-user/app/deploy

permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

hooks:
  ApplicationStart:
    - location: scripts/deploy.sh
      timeout: 60
      runas: ec2-user
  • object: 파일 시스템 객체가 인스턴스로 복사된 후 지정한 권한이 적용되는 파일, 디렉터리입니다.
  • pattern: 권한을 적용할 패턴을 지정합니다. 지정하지 않거나 “**”를 사용하면 지정한 권한이 일치하는 모든 파일, 티렉터리에 적용됩니다.
  • owner: 지정한 object의 소유자 이름입니다. 지정하지 않으면 원본 파일 또는 디렉터리/폴더 구조에 적용된 기존의 모든 소유자가 복사 작업 후에도 변경되지 않습니다.
  • group: 지정한 object의 그룹 이름입니다. owner와 동일하게 생략할 시 복사 작업 후에도 변경되지 않습니다.

나머지 명령의 경우 공식 문서 에서 상세하게 확인 가능합니다.

수정된 appspec.yml을 가지고 다시 한 번 배포를 진행하면 CodeDeploy를 이용하여 배포한 모든 파일과 디렉터리의 소유자 이름과 그룹이 ec2-user로 변경된 것을 확인할 수 있습니다.

codedeploy-agent-deployments.log도 다시 확인해보면 다음과 같이 성공적으로 쉘 스크립트에 따라 명령들이 실행된 것을 확인할 수 있습니다.