반응형
M1에서는 ECR에 AWS의 푸시명령어를 입력하면 오류가 발생한다.
이 글을 작성하게 된 이유는 Local환경에서 이미지를 빌드해서 ECR로 넣은 다음 ECS에서 배포를 했는데 계속해서 오류가 발생했다. 이에 해결방법을 찾은 것을 기록한다. 제목에 대해 바로 확인하고 싶은 분들은 목차 1은 건너뛰면 된다.
1. 이미지 배포 오류 발생
1-1. AWS에서 ECS에 서비스 생성을 완료해서 배포를 했다.
1-2. ECS로 배포하던 도중 계속해서 배포가 실패했다.
2. AWS CloudWatch에서 에러로그 확인
2-1. 계속 배포도중 발생하는 오류가 뭔지 확인하기 위해 CloudWatch로 이동했다.
2-2. 오류로그 확인
- 아래와 같은 오류였다.
exec /usr/bin/java: exec format error
2-3. 원인 파악
- 계속 검색하고 알아본 결과 원인은 운영체제의 문제였다. 지금 로컬 PC에서 ECR에 도커 이미지를 빌드할 때 사용한 게 애플 실리콘의 m2 max 사양의 맥북이었는데 이것은 ARM 아키텍처이고 EC2의 아키텍처는 x86이었기 때문이다.
- “Mac M1에서 빌드한 Docker 이미지는 ARM 아키텍처를 사용하므로, Ubuntu 서버에서 이것을 실행하기 위해서는 AMD64 아키텍처에 호환되는 이미지를 빌드해야 한다.라고 다른 글에 적혀있었다.
3. M1 아키텍처에서 docker buildx를 사용해서 이미지 push하기
이 내용은 로컬환경(M1시리즈 맥북)을 기준으로 설명하며 만약 CodeBuild를 사용해서 BuildSpec.yml로 이미지 빌드를 진행한다면 지금 알려주는 방식대로 하지 않아도 된다(CodeBuild는 로컬이 아니고 CodeBuild 내부의 Docker 환경에서 이미지를 빌드하기 때문이다). 그때는 기존에 주어진 푸시 명령어를 약간 변형해서 BuildSpec에 넣어주면 된다.
3-1. 기존의 푸시 명령어
- 아래의 명령어를 조금 변경해서 사용해야 한다.
3-2. ECR에 로그인하기
- 이미지를 빌드하기 위해서 먼저 아래의 명령어로 ECR에 로그인한다. (푸시 명령에 본인의 로그인 명령어가 적혀있을 것이다.)
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-{본인 Ecr 내용}.dkr.ecr.ap-northeast-2.amazonaws.com
주의사항
- 만약 위의 로그인 과정을 거치지 않고 바로 아래의 이미지 빌드 명령어를 입력하면 아래와 같은 403 Forbidden에러가 나올 것이다.
3-3. 이미지 빌드 및 푸시 (한 번에 하기)
- 이제 아래 명령어로 한번에 빌드하고 푸시까지 한다.
docker buildx build --no-cache --platform=linux/amd64 -t {나의 aws 13자리 계정정보 적기}.dkr.ecr.ap-northeast-2.amazonaws.com/{ecr 리포지토리 이름 적기}:{내가 원하는 tag 이름 적기} . --push
3-4. 푸시된 이미지 확인하기
- ECR에 들어가서 방금 푸시한 이미지가 잘 들어왔는지 확인한다.
여기까지가 로컬 PC에서 M1(ARM) 아키텍처에서 이미지를 빌드했을 때 다른 아키텍처(X86)를 가진 서버에서 이 이미지를 받아서 배포하면 생기는 오류에 대한 해결방법이다. 결론은 Builx를 사용해서 빌드하는 것이다.
2023.10.28 - [AWS] - AWS ALB를 적용시킨 ECS 세팅: 실전 가이드
2023.10.29 - [AWS] - AWS CI/CD: CodePipeline 기본 설정 (1편)
반응형
'DevOps' 카테고리의 다른 글
단일 장애 지점(SPOF)이란? (0) | 2023.11.21 |
---|---|
Pipeline 방식으로 Jenkins구축 - SpringBoot CI/CD 구축 (0) | 2023.10.27 |
Jenkins로 시작하는 CI: Freestyle 프로젝트 구축 가이드 (2) | 2023.10.26 |
AWS EC2에서 Docker와 Jenkins로 CI/CD 환경 구축하기 (0) | 2023.10.25 |