안녕세계

[AWS] ECR에 SpringBoot Docker Image 올리기 본문

[AWS] ECR에 SpringBoot Docker Image 올리기

Junhong Kim 2021. 4. 17. 23:06
728x90
반응형

 

안녕하세요.

이번 포스팅에서는 웹 애플리케이션을 Docker image로 만들어서 AWS ECR에 업로드 하는 방법에 대해 알아봅니다.

샘플 프로젝트 생성

본 포스팅에서는 https://start.spring.io 를 통해서 프로젝트를 생성합니다.

dependencies는 Spring Web과 Lombok(선택)을 추가해주세요.

헬스체크 API 생성

샘플 프로젝트를 열어서 정상 동작하는지 확인합니다.

이후 AWS Fargate에 배포가 정상적으로 되었는지 확인하기 위해 HealthCheck API를 만들어주세요.

@RestController
@RequestMapping("/health-check")
public class HealthCheckController {

    @GetMapping
    public String healthCheck() {
        return "OK";
    }
}

Dockerfile 생성

우리가 만든 웹 애플리케이션을 Docker container로 배포하기 위해 다음과 같이 Dockerfile을 생성합니다.

*본 포스팅에서는 AWS Fargate에 대한 내용이므로 Dockerfile에 대한 설명은 생략합니다.

(SpringBoot와 Docker container 배포에 대한 자세한 설명은 여기를 확인해주세요.)

FROM adoptopenjdk:11-jdk-hotspot AS builder
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
RUN chmod +X ./gradlew
RUN ./gradlew bootJar

FROM adoptopenjdk:11-jdk-hotspot
COPY --from=builder build/libs/*.jar app.jar

EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]

위에서 생성한 Dockerfile로 다음과 같이 image를 생성합니다.

$ docker build -t exp-aws-fargate .

[+] Building 84.1s (15/15) FINISHED                                                                                                                     
 => [internal] load build definition from Dockerfile                                                                                               0.0s
 => => transferring dockerfile: 355B                                                                                                               0.0s
 => [internal] load .dockerignore                                                                                                                  0.0s
 => => transferring context: 2B                                                                                                                    0.0s
 => [internal] load metadata for docker.io/library/adoptopenjdk:11-jdk-hotspot                                                                     3.4s
 => [auth] library/adoptopenjdk:pull token for registry-1.docker.io                                                                                0.0s
 => [internal] load build context                                                                                                                  0.0s
 => => transferring context: 70.00kB                                                                                                               0.0s
 => [builder 1/8] FROM docker.io/library/adoptopenjdk:11-jdk-hotspot@sha256:615cb1c1de2c42dc5de6af9f60089d1651ef15bf7f246362be426a929e36a429      16.8s
 => => resolve docker.io/library/adoptopenjdk:11-jdk-hotspot@sha256:615cb1c1de2c42dc5de6af9f60089d1651ef15bf7f246362be426a929e36a429               0.0s
 => => sha256:d6c521b7af7182630bf79cd88feb57d689d41cc814a84dde0e671ee09381e661 6.58kB / 6.58kB                                                     0.0s
 => => sha256:a70d879fa5984474288d52009479054b8bb2993de2a1859f43b5480600cecb24 28.57MB / 28.57MB                                                   1.6s
 => => sha256:c4394a92d1f8760cf7d17fee0bcee732c94c5b858dd8d19c7ff02beecf3b4e83 848B / 848B                                                         0.6s
 => => sha256:10e6159c56c084c858f5de2416454ac0a49ddda47b764e4379c5d5a147c9bf5f 187B / 187B                                                         0.7s
 => => sha256:615cb1c1de2c42dc5de6af9f60089d1651ef15bf7f246362be426a929e36a429 1.70kB / 1.70kB                                                     0.0s
 => => sha256:6134b42993d24d3ea371e9917422f2ad369b0dd52436a15ec09d6c337b41a416 1.37kB / 1.37kB                                                     0.0s
 => => sha256:e04b772c31f76720583412a2507c5c53889985db45169a85f0d3cd7f842e041a 16.03MB / 16.03MB                                                   2.3s
 => => sha256:829aace300712fbc22a01a55f7581113a5a44b31718a09d4e34a9b4858f57c32 194.98MB / 194.98MB                                                 9.7s
 => => extracting sha256:a70d879fa5984474288d52009479054b8bb2993de2a1859f43b5480600cecb24                                                          2.6s
 => => extracting sha256:c4394a92d1f8760cf7d17fee0bcee732c94c5b858dd8d19c7ff02beecf3b4e83                                                          0.0s
 => => extracting sha256:10e6159c56c084c858f5de2416454ac0a49ddda47b764e4379c5d5a147c9bf5f                                                          0.0s
 => => extracting sha256:e04b772c31f76720583412a2507c5c53889985db45169a85f0d3cd7f842e041a                                                          1.6s
 => => extracting sha256:829aace300712fbc22a01a55f7581113a5a44b31718a09d4e34a9b4858f57c32                                                          6.9s
 => [builder 2/8] COPY gradlew .                                                                                                                   0.2s
 => [builder 3/8] COPY gradle gradle                                                                                                               0.1s
 => [builder 4/8] COPY build.gradle .                                                                                                              0.0s
 => [builder 5/8] COPY settings.gradle .                                                                                                           0.0s
 => [builder 6/8] COPY src src                                                                                                                     0.0s
 => [builder 7/8] RUN chmod +X ./gradlew                                                                                                           0.4s
 => [builder 8/8] RUN ./gradlew bootJar                                                                                                           62.5s
 => [stage-1 2/2] COPY --from=builder build/libs/*.jar app.jar                                                                                     0.1s 
 => exporting to image                                                                                                                             0.1s
 => => exporting layers                                                                                                                            0.1s
 => => writing image sha256:88a2c90301f896b37bf32c931640ba487fce9c2d3971b2010599dab6ce8dae3c                                                       0.0s
 => => naming to docker.io/library/exp-aws-fargate

Docker 컨테이너 실행

Docker image 생성이 완료되었으면, 로컬에서 image를 container로 실행해봅니다.

$ docker run -d -p 8080:8080 exp-aws-fargate

1aec8c5b1dec49aef4cd593e4f9dd0ea0a1a7d24f8df2593454bcdd6de2039c6

container를 실행한 뒤, 처음에 만든 healthCheck API를 호출하여 정상 실행되었는지 확인해봅니다.

OK가 웹 브라우저에 노출되면 우리의 웹 애플리케이션을 container로 실행하는데 성공입니다 :)

Amazon ECR에 Docker Image 올리기

AWS ECS에 container를 서비스하려면, 로컬에서 우리가 만든 Docker image를 AWS ECR에 올려두어야 합니다.

여기서 AWS ECR란, Docker Hub 처럼 Docker image를 원격에서 관리/배포 등을 할 수 있는 AWS 서비스 입니다.

 

AWS ECR 서비스를 이용하기 위해서, AWS 콘솔에서 IAM Role을 설정해야합니다.

AWS Console에서 IAM 서비스 화면에서 사용자 추가 버튼을 선택해주세요.

 

사용자 이름과 액세스 유형을 다음과 같이 선택해주세요.

 

사용자가 사용할 권한을 추가해주세요, 여기서는 AmazonEC2ContainerRegistryFullAccess를 권한을 추가합니다.

 

태그는 선택 사항이므로 skip 합니다.

신규 IAM 사용자에 대한 최종 검토를 합니다.

 

사용자 만들기 버튼을 선택하면, 다음 화면으로 이동되는데 여기서 .csv 파일을 다운로드하여 보관합니다.

*비밀 액세스 키는 완료 페이지를 나가게되면 다시 확인이 불가능하니 주의해주세요!

AWS ECR 서비스로 이동해서 레포지토리를 생성해봅시다.

 

포지토리 이름을 설정해줍니다.

 

이제 AWS ECR 레포지토리가 생성되었으므로, 로컬에있는 Docker image를 AWS ECR로 Push 할 수 있습니다.

 

AWS ECR 레포지토리에 우리가 만든 Docker image를 Push 하기 위해서,

다음과 같이 aws configure 명령어를 사용하여 .csv 파일을 참고하여 aws-cli를 설정합니다.

(aws-cli가 설치가 안되신 분들은 여기에서 설치 후 진행해주세요.)

$ aws configure

AWS Access Key ID [****************ABCD]: <access_key>
AWS Secret Access Key [****************EFGH]: <secret_access_key>
Default region name [ap-northeast-2]: ap-northeast-2
Default output format [json]: json

 

다시 AWS ECR 페이지로 돌아가서, 아까 생성한 exp-repo를 선택하여 푸시 명령 보기 버튼을 클릭합니다.

팝업으로 나오는 푸시 명령을 순서대로 입력하면 AWS ECR에 로컬의 Docker image를 Push 됩니다.

 

1. 인증 토큰을 검색하고 레지스트리에 대해 Docker 클라이언트를 인증

$ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 123456789.dkr.ecr.ap-northeast-2.amazonaws.com

 

2. 이미 Docker image를 빌드했다면 skip 합니다.

$ docker build -t exp-aws-fargate .

 

3. 위에서 빌드한 Docker image(exp-aws-fargate:latest)로 변경 해주세요.

$ docker tag exp-aws-fargate:latest 123456789.dkr.ecr.ap-northeast-2.amazonaws.com/exp-repo:latest

 

4. Docker image를 AWS 레포지토리로 Push

$ docker push 123456789.dkr.ecr.ap-northeast-2.amazonaws.com/exp-repo:latest

 

AWS ECR로 우리가 만든 Docker image가 업로드된 것을 확인하실 수 있습니다!

여기까지 AWS ECR에 우리가 만든 Docker image를 올리는 것에 알아보았습니다.

다음 포스팅에서는 이제 AWS ECR에 올라가있는 Docker image를 Faragte로 배포 해보겠습니다.

감사합니다 🙌

 

 


참고

devminchan.github.io/develop/ecs_fargate_deploy_01

728x90
반응형

'Infra > AWS' 카테고리의 다른 글

[AWS] Amazon SNS  (0) 2023.12.20
[AWS] Amazon SQS  (2) 2023.11.30
[AWS] AmazonMQ (feat. ActiveMQ)  (0) 2023.10.31
Comments