ECR 생성하기 (M1 Mac 제외)
내가 진행하고 싶은 프로젝트의 CI/CD는 AWS CodePipeline을 통해 프로젝트 배포를 trigger 하고, Amazon ECR에 도커 이미지를 push 하고, Amazon ECS에서 이미지를 pull 받아 태스크를 실행하는 프로세스를 구상하고 있다. 일단 이 프로젝트에 필요한 ECR을 생성해 보자
1. ECR 생성
1-1. ECR 생성 화면으로 이동한 후, 리포지토리 생성 [시작하기] 버튼을 클릭한다.
1-2. 리포지토리 생성 화면에서 아래와 같이 입력한다.
- 그리고 [리포지토리 생성] 버튼 클릭하면 생성이 완료된다.
1-3. 생성 완료된 모습
2. ECR에 로컬에서 만든 Dockerfile로 이미지 push 하기
2-1. 생성 완료된 팝업에서 [푸시 명령 보기] 버튼을 클릭하거나, 리포지토리 이름을 클릭해서 들어간 곳에서 [푸시 명령 보기] 버튼을 클릭한다.
2-2. 그럼 아래와 같은 팝업이 뜬다.
- 해당 명령어를 로컬 환경에서 사용하기 위해선 AWS CLI와 Docker가 설치되어있어야 한다.
- 일단 AWS CLI를 설치하러 가보자.
- https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
- 설명에 나온 것처럼 pkg 파일을 다운로드하고 설치가 완료되면 아래 명령어를 입력해서 AWS CLI 설치를 확인한다.
which aws
aws --version
- 이제 내가 실행할 프로젝트의 root 경로에 Dockerfile을 작성해 보자.
# Use OpenJDK 17 as the base image
FROM openjdk:17-jdk-alpine
# Make port 8081 available to the world outside this container
EXPOSE 8081
# Specify the built JAR file path and add it to the container as member-api.jar
ARG JAR_FILE=build/libs/member-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} member-api.jar
# Run the JAR file
ENTRYPOINT ["java", "-jar", "/member-api.jar"]
- 이제 아까 팝업에 나온 대로 찬찬히 진행해 보자.
2-2-1. 인증 토큰을 검색하고 레지스트리에 대해 Docker 클라이언트를 인증합니다.
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin @#@#@#@##$#$@$ast-2.amazonaws.com
- 팝업에 나온 명령어를 그대로 Dockerfile이 있는 위치(현재 상황에선 로컬이 되겠다.)에서 실행한다.
- 참고: AWS CLI을(를) 사용하는 중 오류가 발생하면 최신 버전의 AWS CLI 및 Docker가 설치되어 있는지 확인하자.
- 일단 최초 실행하자 아래와 같은 오류가 발생했다. 인증이 안된다는 것이다.
Unable to locate credentials. You can configure credentials by running "aws configure". Error: Cannot perform an interactive login from a non TTY device
- 해결방법
- AWS(Amazon Web Services)에서 AWS Access Key ID와 Secret Access Key는 자격 증명(credentials)의 일종이다. 이러한 자격 증명은 AWS 리소스에 대한 프로그래밍 방식으로의 액세스를 위해 필요하다. AWS CLI, AWS SDK 또는 직접적인 API 요청을 사용하여 서비스에 접근할 때 이러한 값들이 요구된다.
- AWS Management Console에서 이러한 자격 증명을 생성하고 관리할 수 있다. IAM(Identity and Access Management) 콘솔에서 사용자를 선택한 후 "보안 자격 증명" 탭에서 액세스 키를 생성할 수 있다.
- 아래는 자격 증명을 생성하는 기본적인 단계이다.
- AWS Management Console에 로그인
- IAM 서비스로 이동
- '사용자' 섹션을 선택하고, 사용자를 추가하거나 기존 사용자를 선택
- '보안 자격 증명' 탭으로 이동
- '액세스 키 만들기'를 클릭
- 생성한 후에는 AWS Access Key ID와 Secret Access Key를 안전한 장소에 보관해야 한다. 이 값들을 잃어버린다면, AWS 리소스에 액세스 할 수 없게 된다.
- AWS CLI에서 aws configure 명령을 실행하면, 이러한 자격 증명을 설정 파일에 저장할 수 있다. 이후에 AWS CLI를 사용하여 서비스에 요청을 보낼 때 이 설정 파일의 정보를 사용한다.
# AWS CLI에서 자격 증명을 설정하는 예시
$ aws configure
AWS Access Key ID [None]: (여기에 Access Key ID 입력)
AWS Secret Access Key [None]: (여기에 Secret Access Key 입력)
Default region name [None]: (기본 리전 설정, 예: us-east-1)
Default output format [None]: (출력 형식 설정, 예: json)
- 이 정보들은 일반적으로 ~/.aws/credentials 파일에 저장된다.
- 간단히 말하면, AWS Access Key ID는 고유한 사용자 ID와 같은 것이고, Secret Access Key는 그 ID의 패스워드와 같다. 두 개가 항상 함께 사용되어야 한다.
- 위에서 생긴 에러를 해결하기 위해 AWS CLI에 자격 증명을 설정했다.
- 아래는 이런 과정을 거친 후 성공한 모습이다.
2-2-2. 다음 명령을 사용하여 도커 이미지를 빌드한다.
※ 아래 내용은 M1 시리즈 맥북 환경이 아닌 환경에서 정상 작동하는 내용이다.
※ 만약에 본인 환경이 M1 시리즈 Mac 환경이라면 아래 포스트 내용을 참고하여 docker image를 푸시해야 한다.
ECR 생성하기 (M1 Mac 적용) - exec /usr/bin/java: exec format error 에러 해결
- 도커 파일을 처음부터 새로 빌드하는 방법에 대한 자세한 내용은 여기 지침을 참조해라.
- 이미지를 이미 빌드한 경우에는 이 단계를 건너뛸 수 있다.
docker build -t recipia-repository .
- 위 명령어를 쳤을 때 아래와 같은 오류가 났는데 이건 docker-desktop을 실행시키지 않고 명령어를 입력했기 때문이다.
- docker desktop을 실행 후 다시 명령어를 쳤더니 이번에는 Dockerfile에서 에러가 발생했다.
=> ERROR [internal] load metadata for docker.io/library/openjdk:17-jdk-alpine 2.4s
------
> [internal] load metadata for docker.io/library/openjdk:17-jdk-alpine:
------ Dockerfile:2
--------------------
1 | # Use OpenJDK 17 as the base image
2 | >>> FROM openjdk:17-jdk-alpine
3 |
4 | # Make port 8081 available to the world outside this container
--------------------
ERROR: failed to solve: openjdk:17-jdk-alpine: no match for platform in manifest sha256:4b6abae565492dbe9e7a894137c966a7485154238902f2f25e9dbd9784383d81: not found
- 위 에러는 openjdk:17-jdk-alpine 이 라이브러리를 docker hub에서 pull 받을 수 없어서 생긴 오류였다.
- Dockerfile을 아래처럼 수정해 줬다.
- 그랬더니 성공했다.
=> [2/2] ADD build/libs/member-0.0.1-SNAPSHOT.jar member-api.jar 0.4s
=> exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:73fa77654cbf3390f31726f2a5be64b6d38d8c64a39d5e44e17b0588eba21f9b 0.0s
=> => naming to docker.io/library/recipia-repository
- docker image가 잘 생성되었는지 확인해 보자
- docker images: docker image 목록 조회 명령어
2-2-3. 빌드가 완료되면 이미지에 태그를 지정하여 이 리포지토리에 푸시할 수 있다.
docker tag recipia-repository:latest:@#@#@#@#@#ortheast-2.amazonaws.com/recipia-repository:latest
- 정상 작동하면 아래와 같이 아무 응답이 없다.
※ 잠깐!! docker tag 명령어는 무슨 의미일까?
docker tag 명령어는 Docker 이미지에 태그를 붙이거나 기존의 태그를 변경할 때 사용한다. 이 명령어의 일반적인 형식은 다음과 같다.
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
- SOURCE_IMAGE[:TAG]: 원본 이미지 이름과 선택적으로 태그. 태그를 지정하지 않으면 latest가 기본값으로 사용된다.
- TARGET_IMAGE[:TAG]: 타깃 이미지 이름과 선택적으로 태그이다.
docker tag recipia-repository:latest @#@#@#@#@#@#@#theast-2.amazonaws.com/recipia-repository:latest
- 위의 명령어에서는 recipia-repository:latest라는 로컬의 Docker 이미지에 대한 새로운 태그를 생성하거나 기존 태그를 변경한다.
- 새로운 태그는@#@#@#@#@#@#@#theast-2.amazonaws.com/recipia-repository:latest가 됩니다. 이는 일반적으로 Amazon ECR(Elastic Container Registry)와 같은 원격 레지스트리에 이미지를 푸시하기 전에 사용된다.
- 이렇게 태그를 변경한 후에는 docker push 명령어를 사용하여 원격 레지스트리에 이미지를 업로드할 수 있다.
2-2-4. 다음 명령을 실행하여 이 이미지를 새로 생성한 AWS 리포지토리로 푸시한다.
docker push @#@#@#@#@#@#@#theast-2.amazonaws.com/recipia-repository:latest
- 명령어를 치면 아래와 같이 도커 이미지를 레파지토리에 push 가 진행된다.
- 성공하면 아래와 같이 나온다.
- 이제 ECR 리파지토리에 들어오면 아래와 같이 올라온 이미지가 있다.
3. AWS ECS 생성으로 이동
이제 도커 이미지를 저장할 레파지토리를 만들었다. 이제 이 도커 이미지를 실행시킬 ECS를 생성하러 가보자. 해당 내용은 다음 포스트에 작성할 것이다.
'AWS' 카테고리의 다른 글
[AWS] CodePipeline을 이용한 CI/CD (1) - 파이프 라인 생성 (0) | 2023.10.31 |
---|---|
[AWS] ECS 생성5 - ECS 생성 및 설정 (w ALB) (0) | 2023.10.31 |
[AWS] ECS 생성4 - ECS 생성 및 설정 (w/o ALB) (0) | 2023.10.30 |
[AWS] ECS 생성3 - ALB 세팅하기 (0) | 2023.10.30 |
[AWS] ECS 생성2 - ECR 생성하기 (M1 Mac 적용) - exec /usr/bin/java: exec format error 에러 해결 (1) | 2023.10.30 |