Amazon ECR은 어디서나 애플리케이션 이미지 및 아티팩트를 안정적으로 배포할 수 있도록 뛰어난 성능 호스팅을 제공하는 완전관리형 컨테이너 레지스트리입니다. ECR은 EKS, ECS 등 컨테이너 서비스에 사용됩니다.
오늘은 ECR Repository를 생성하고, Golang Gin 이미지를 push합시다.
1. 준비
ECR > Repositories에서 Create repository를 누릅니다.
Visibility settings에서 Private을 선택하고, Repository의 이름을 지정합니다.
나머지 설정은 놔두고, Create repository를 눌러 Repository를 생성합니다.
AmazonEC2ContainerRegistryPowerUser Policy를 가진 IAM Role을 생성합니다.
EC2 Instance에 해당 IAM Role을 부착합니다.
EC2 Instance를 생성한 뒤, SSH로 접근하여 docker를 설치합니다. usermod가 끝난 뒤, Bash에 재접속해야 ec2-user로 docker를 사용할 수 있습니다.
sudo yum update -y
sudo yum install -y docker
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -a -G docker ec2-user
2. 이미지 생성
앱을 저장할 디렉토리를 생성하고, 템플릿과 golang 파일을 놓습니다.
Github에 있는 앱을 다운로드합니다.
https://github.com/ArcoKim/Demo-App/tree/main
GitHub - ArcoKim/Demo-App: App for testing cloud services
App for testing cloud services. Contribute to ArcoKim/Demo-App development by creating an account on GitHub.
github.com
mkdir app
cd app
wget https://github.com/ArcoKim/Demo-App/raw/main/Golang/Gin/main.go
mkdir templates
wget -P ./templates/ https://github.com/ArcoKim/Demo-App/raw/main/Golang/Gin/templates/index.tmpl
vim으로 Dockerfile을 작성합니다.
vim Dockerfile
Multi Stage Build를 하는 Dockerfile입니다. golang이 깔린 alpine에서 golang 파일을 빌드하고, 순수 alpine에서 빌드 파일과 템플릿만 가져와 실행만을 진행합니다. 빌드 이미지와 실행 이미지가 분리되어 용량이 줄어들게 됩니다.
FROM public.ecr.aws/docker/library/golang:alpine AS builder
WORKDIR /build
COPY main.go ./
COPY templates templates
RUN go mod init prod
RUN go mod tidy
RUN go build -o main .
FROM public.ecr.aws/docker/library/alpine
WORKDIR /app
COPY --from=builder /build/templates templates
COPY --from=builder /build/main .
CMD ["./main"]
3. 빌드 & 푸쉬
ECR Repository에서 View push commands를 누릅니다.
이 과정을 참고하여 빌드 & 푸쉬를 진행하면 됩니다.
ECR 인증 토큰을 사용하여 Private Repository로 push 할 수 있게 합니다.
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin (Account ID).dkr.ecr.ap-northeast-2.amazonaws.com
docker 이미지를 빌드합니다. 빌드하는데 약간의 시간이 소요됩니다.
docker build -t (Repository Name) .
ECR Repository에 push 할 수 있도록 형식에 맞게 태그를 변경합니다. 버전은 latest를 사용합니다.
docker tag (Repository Name):latest (Repository URI):latest
마지막으로, ECR Repository에 이미지를 push합니다.
docker push (Repository URI):latest
Repository를 새로고침하면 latest 버전을 가진 이미지가 push 된 것을 볼 수 있습니다.
오늘의 글은 여기까지입니다. 감사합니다!
'AWS' 카테고리의 다른 글
[AWS] Github Actions로 CodeDeploy 실행 (EC2) (0) | 2023.12.29 |
---|---|
[AWS] SSH 액세스 실패를 감지하여 이메일에 알리기 (1) | 2023.11.28 |
[AWS] Managed Service for Apache Flink로 스트리밍 데이터 분석 - Studio notebooks (1) (0) | 2023.10.13 |
[AWS] Athena에서 Table 생성부터 데이터 조회까지 (0) | 2023.10.12 |
[AWS] RDS IAM database authentication (0) | 2023.10.11 |