ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AWS ECS 개념 및 Node 서버 배포 - 2
    카테고리 없음 2022. 3. 4. 17:40

    저번에는 원론적인 설명만 했다면 이번에는 실제로 node 로 개발한 간단한 백엔드를 ecs에 배포를 해 볼 예정이다.

    필자는 Mac기준 으로 작성 하였으며 다음아래 환경은 미리 설정을 해야한다.

    • aws-cli
    • Docker Desktop
    • aws 계정

    간단한 Node 앱 생성 및 docker build


    먼저 간단하게 Express 기반 Node 서버를 생성 해줄 것이다.

    const app = require("express")();
    
    app.get("/", (req, res) => {
        res.json({
            message: true
        });
    });
    
    app.listen(4000, () => {
        console.log("Server started");
    });

    정상적으로 동작하는 것을 확인한다.

    그 다음은 dockerfile을 작성해준다.

     

    FROM node:10.13-alpine
    
    WORKDIR /home/app
    COPY . .
    
    RUN npm install
    CMD node app.js

     

    그 다음 다음과 같은 커멘드로 빌드가 되는 것을 확인한다.

    docker build -t sample-app .
    
    [+] Building 11.9s (9/9) FINISHED                                                                                                                                                                            
     => [internal] load build definition from Dockerfile                                                                                                                                                    0.0s
     => => transferring dockerfile: 125B                                                                                                                                                                    0.0s
     => [internal] load .dockerignore                                                                                                                                                                       0.0s
     => => transferring context: 2B                                                                                                                                                                         0.0s
     => [internal] load metadata for docker.io/library/node:10.13-alpine                                                                                                                                    3.6s
     => [1/4] FROM docker.io/library/node:10.13-alpine@sha256:22c8219b21f86dfd7398ce1f62c48a022fecdcf0ad7bf3b0681131bd04a023a2                                                                              5.7s
     => => resolve docker.io/library/node:10.13-alpine@sha256:22c8219b21f86dfd7398ce1f62c48a022fecdcf0ad7bf3b0681131bd04a023a2                                                                              0.0s
     => => sha256:e29c348960786753767bba75889dd8bbd8aa549ed8bdfdc73da314b29fa6466c 951B / 951B                                                                                                              0.0s
     => => sha256:93f2dcbcddfe316c539840c1ecae800605270cd27d3d4044dfa18ff65fc8c64a 5.14kB / 5.14kB                                                                                                          0.0s
     => => sha256:4fe2ade4980c2dda4fc95858ebb981489baec8c1e4bd282ab1c3560be8ff9bde 2.21MB / 2.21MB                                                                                                          0.9s
     => => sha256:c245f6a8ecc59b205ac5e40f7e49ec7e73e6e449cd957c4b5c01f3248497833f 20.27MB / 20.27MB                                                                                                        3.7s
     => => sha256:82bdc9503d509b4d9a45c074f0377b9337b5bf9b14086e08934a5a06b2ad056c 1.26MB / 1.26MB                                                                                                          1.0s
     => => sha256:22c8219b21f86dfd7398ce1f62c48a022fecdcf0ad7bf3b0681131bd04a023a2 2.03kB / 2.03kB                                                                                                          0.0s
     => => extracting sha256:4fe2ade4980c2dda4fc95858ebb981489baec8c1e4bd282ab1c3560be8ff9bde                                                                                                               0.2s
     => => extracting sha256:c245f6a8ecc59b205ac5e40f7e49ec7e73e6e449cd957c4b5c01f3248497833f                                                                                                               1.7s
     => => extracting sha256:82bdc9503d509b4d9a45c074f0377b9337b5bf9b14086e08934a5a06b2ad056c                                                                                                               0.1s
     => [internal] load build context                                                                                                                                                                       5.4s
     => => transferring context: 994.45kB                                                                                                                                                                   4.9s
     => [2/4] WORKDIR /home/app                                                                                                                                                                             0.5s
     => [3/4] COPY . .                                                                                                                                                                                      0.1s
     => [4/4] RUN npm install                                                                                                                                                                               1.8s
     => exporting to image                                                                                                                                                                                  0.1s
     => => exporting layers                                                                                                                                                                                 0.1s
     => => writing image sha256:c8919dbdb772849c769dd8aeeffb61c9c4a472b48d4898a8b93e39e4cdc652e7                                                                                                            0.0s
     => => naming to docker.io/library/sample-app

    빌드 된 이미지 확인

    도커 실행

    docker run -d -p 4000:4000 --name sample-app-container sample-app

    docker ps 로 도커 상태 확인 

    도커가 잘 실행되고 있다.

     

     

    AWS ECR 에 Docker Image 를 Push


    먼저 AWS에 Iam 계정을 하나 생성한다.

     

    EC2 Container Registery Full Access 권한을 준다.

    사용자 추가 후 Secret key 와 Access Key를 확인 및 저장한다.

     

    이제 Iam 사용자를 생성했으니 ECR 레지스트리를 생성하겠다.

    리포지토리를 생성 했으니 aws-cli 를 통해 이미지를 푸시하면 되겠다.

     

    코드의 루트 파일로 이동하여 aws-cli 셋팅을 해준다.

    aws configure
    AWS Access Key ID [****************WXPP]: <Access Id>
    AWS Secret Access Key [****************wt/U]: <Secret Key>
    Default region name [None]: ap-northeast-2
    Default output format [None]: json

    그 다음 생성한 레지스트리로 가서 푸시 명령 보기를 선택한다.

    해당 팝업에 나와있는 그대로 실행하면 된다.

    잘 push 된 듯 하다.

     

    네트워크 환경 구성


    VPC 환경을 먼저 셋팅하도록 하겠다.

    VPC 를 생성 했으면 VPC 내부의 subnet은 가용영역이 2개 이상이여야 하니 subnet도 같이 생성 한다.

     

    잘 생성됬다. 굿

     

    VPC 셋팅은 끝났고 인터넷게이트웨이를 생성해준다.

    VPC 라우팅 테이블의 라우트만 해주면 VPC는 셋팅이 끝난다.

     

    모든 대상을 인터넷 게이트웨이와 연결해준다.

     

    클러스터, Task Definition, ALB, 서비스 생성


    이제 클러스터를 생성한다.

    간단하게 생성 가능하다.

     

    이제 새롭게 작업정의를 생성 하면 된다.

    필자는 Serverless 인 Fargate로 생성하였다.

     

    이제 컨테이너 정의에서 컨테이너 추가를 하면 되는데 이미지는 ECR에 있는 이미지를 복사 하여 넣으면 된다.

    작업정의 까지 완료 하였으면 ALB를 생성한다. 왜 서비스를 바로 안하냐고 할 수 도 있는데 서비스랑 alb랑 연결을 해줘야 할 때 ALB가 있어야 하기 때문에 ALB를 먼저 생성한다.

     

    만들어놓은 ECS VPC 로 생성 한다.

    새롭게 보안 그룹 구성을 해준다.

    인스턴스, IP, Lambda 중에 대상유형을 선택할 수 있는데, Fargate 기반이므로 IP를 선택한다.

    다음으로 넘어가서 검토사항 끝나면 ALB가 생성이 된다.

    ALB도 생성을 다 했겠다 그럼 이제 서비스만 생성하면 된다.

     

    서비스는 FARGATE 기반이고 먼저 정의한 작업 정의로 서비스를 만들어준다.

    Node 서버가 4000번에서 돌아가고 있음으로 4000번 포트를 열어준다.

    VPC를 ECS VPC로 설정해준다.

     

    그 다음 사용할 로드벨런서와 로드밸런싱을 설정 해준다.

    오토 스케일링은 따로 설정하지 않고 서비스를 생성합니다.

    서비스가 생성완료 되었다.

    EC2 에 로드밸런서 탭에 ECS가 사용중인 로드 밸런서를 확인해보면 DNS 이름이 나와 있다.

    해당 도메인을 복사해 API 요청을 한다.

     

     

     

    정상응답! 끝!

    댓글

Designed by Tistory.