프로그래밍

AWS CodeDeploy Agent AccessDeniedException 삽질기

증상

어느 날 갑자기 CodeDeploy 배포가 안 되기 시작했다. EC2 로그를 보니 아래 에러가 반복되고 있었다.

Aws::CodeDeployCommand::Errors::AccessDeniedException
Cannot reach InstanceService

시도했던 것들

처음엔 당연히 IAM 권한 문제라고 생각했다.

  • EC2 IAM Role 확인 → 정상
  • Trust Relationship 확인 → 정상
  • AmazonEC2RoleforAWSCodeDeploy Policy 추가
  • CodeDeploy Service Role 확인 → 정상
  • EC2 태그와 Deployment Group 태그 일치 확인 → 정상
  • Region 설정 확인 → 정상
  • Agent 재시작 → 해결 안 됨
  • EC2 Stop/Start → 해결 안 됨
  • Agent 완전 재설치 → 해결 안 됨

aws deploy list-applications 명령은 정상 작동하는데 Agent만 AccessDenied가 나오는 이상한 상황이었다.

원인 파악

wire 로그를 활성화해서 실제 HTTP 요청을 확인했다.

 
 
bash
sudo sed -i 's/:log_aws_wire: false/:log_aws_wire: true/' \
  /etc/codedeploy-agent/conf/codedeployagent.yml
sudo service codedeploy-agent restart
sudo tail -f /var/log/aws/codedeploy-agent/codedeploy-agent.aws_wire.log
```

로그에서 Authorization 헤더를 보니:
```
Credential=AKIAYUQGSORPMPFBOFUQ/...

AKIA로 시작하는 IAM User 액세스 키를 사용하고 있었다. EC2 Role의 임시 자격증명은 ASIA로 시작해야 하는데!

환경변수를 확인해보니:

 
 
bash
env | grep AWS
# AWS_ACCESS_KEY=AKIAYUQGSORPMPFBOFUQ
# AWS_SECRET_KEY=IR3v2U39+...

배포 시 Secrets Manager에서 IAM User 키를 환경변수로 주입하고 있었고, 이 환경변수가 EC2 Role보다 우선순위가 높아서 Agent가 엉뚱한 키를 사용하고 있었던 것이다.

해당 키가 어딘가에서 교체되거나 권한이 변경되면서 "어느 날 갑자기" 문제가 생긴 것이었다.

원인 파일 찾기

 
 
bash
grep -r "AWS_ACCESS_KEY" /etc/ 2>/dev/null
grep -r "AWS_ACCESS_KEY" /home/ 2>/dev/null
# /home/freeworking/deploy/.env.runtime 에서 발견!

해결

.env.runtime 파일에서 AWS 관련 환경변수 제거:

 
 
bash
grep -v "AWS_ACCESS_KEY\|AWS_SECRET_KEY" \
  /home/freeworking/deploy/.env.runtime > /tmp/.env.tmp
mv /tmp/.env.tmp /home/freeworking/deploy/.env.runtime
sudo systemctl restart codedeploy-agent

핵심 교훈

AWS SDK 자격증명 우선순위:

  1. 환경변수 (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
  2. ~/.aws/credentials 파일
  3. EC2 Instance Metadata (Role) ← 이게 사용되어야 함

애플리케이션용 IAM 키를 환경변수에 넣을 때 변수명을 AWS_로 시작하면 SDK가 자격증명으로 인식해서 EC2 Role을 덮어버린다. 가능하면 EC2 Role로 권한을 부여하고 IAM User 키는 사용하지 않는 것이 좋다. 꼭 써야 한다면 변수명을 APP_ACCESS_KEY 같이 AWS SDK가 인식 못하는 이름으로 바꾸자.

728x90