[도커] AWS ECS Node backend Sever & MongoDB Atlas

목표

ECS를 활용해 간단한 백엔드 서버를 올리고, 몽고 아틀라스를 활용해 데이터 베이스를 연결하기!

장점

대규모 애플리케이션을 구축하고자 할 때 데이터 베이스 관리전문가가 아니라면, 가용성과 데이터 베이스 노드와 백업을 처리하고 싶지 않을때 MongoDB  Atlas같은 관리형 서비스를 사용하는 것이 좋다


MongoDB Atlas

https://www.mongodb.com/cloud/atlas/lp/try4?utm_content=rlsavisitor&utm_source=google&utm_campaign=search_gs_pl_evergreen_atlas_core_retarget-brand_gic-null_apac-all_ps-all_desktop_eng_lead&utm_term=mongodb%20atlas&utm_medium=cpc_paid_search&utm_ad=e&utm_ad_campaign_id=14412646476&adgroup=131761130772&gclid=Cj0KCQjwqc6aBhC4ARIsAN06NmPqjJtSDgUX_biziVTJWMjOfvLMA8PhkvY8l_iz4GmprHWnmB0ARJIaAjfqEALw_wcB 

 

MongoDB Atlas: Cloud Document Database

Cloud-hosted MongoDB service on AWS, Azure, and GCP

www.mongodb.com

계정이 없다면, 계정을 생성하고 로그인을 한다. 그리고 새로운 데이터 베이스를 생성할거다.

Build a Database 를 선택한다.

그리고 Shared 를 선택해서 무료로 생성한다.

aws 서비스를 사용할 것이니 선택하고 나는 노스 버지니아에서 만들것이니까 같은 지역을 선택해주면 좋을지 모르겠다만 선택해준다. 그리고 Create Cluster를 선택

보안을 위해 Username과 password를 입력할 수 있게 해놓은 곳이 있는데, 비밀번호는 오른쪽 자동할당을 이용할 것 같으면 복사해두고 어딘가에 저장을 해두는게 나중에 다른곳에서 사용하기 용이하다. 그리고 설정을 마친다.

 

그러면 이런 화면을 대시보드에서 확인할 수 있는데, 클러스터의 이름 옆에 Connect를 누른다.

이렇게 연결할 수 있는 옵션들이 나오는데 나는 ECS를 사용해서 어플리케이션을 올리고 그것을 이 몽고 Atlas와 연결할 것이니 두번째 Connect your application을 클릭한다.

그러면 이렇게 Node.js와 MongoDB Atlas를 연결할 수 있는 연결부를 제공해준다. 이 부분을 잘 복사해놓고 어딘가에 저장해둔다.


Code

MongoDB Atlas 연결부 (app.js)

mongoose.connect(
  `mongodb+srv://${process.env.MONGODB_USERNAME}:${process.env.MONGODB_PASSWORD}@${process.env.MONGODB_URL}/${process.env.MONGODB_DATABASE}?retryWrites=true&w=majority`,
  {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  },
  (err) => {
    if (err) {
      console.error('FAILED TO CONNECT TO MONGODB');
      console.error(err);
    } else {
      console.log('CONNECTED TO MONGODB!!');
      app.listen(80);
    }
  }
);

위에서 받은 연결부를 기준으로 내가 만든 어플리케이션의 app.js 에서 연결부를 작성해주되, 하드코딩을 하지 말고 환경변수로 빼서 작업을 한다.


backend.env

MONGODB_USERNAME=june
MONGODB_PASSWORD=
MONGODB_URL=
MONGODB_DATABASE=goals-dev

이렇게 아까 몽고 Atlas에서 데이터베이스를 만들고 받은 정보를 베이스로 연결하기 위한 환경변수를 채운다.


Dockerfile

FROM node

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

EXPOSE 80

ENV MONGODB_USERNAME=june
ENV MONGODB_PASSWORD=secret
ENV MONGODB_URL=mongodb
ENV MONGODB_DATABASE=goals_dev 

CMD ["npm", "start"]

도커파일에서도 똑같은 항목들로 만들어준다. 하지만 값이 완전히 일치할 필요는 없다. ECS에서 컨테이너를 생성할때 환경변수를 설정할 수 있는데 거기에 값만 똑같이 넣어주면된다.


Docker hub push

도커 허브의 레포지토리를 하나 만든다 그리고 이름을 잘 기억해두거나 복사해둔다.

docker build --platform amd64 -t crowssnest/docker-nodejs-demo .

수정한 도커파일이 있는곳에서 M1 맥북기준 --platform amd64 옵션을 넣어서 빌드를 해준다.

그냥 빌드를 하고 docker tag를 사용해서 해도 이미지의 이름을 바꿔도 되지만, 빌드를  할 때 처음부터 -t 옵션을 사용해서 빌드하고 이미지 이름에 docker hub의 레포지토리이름을 넣으면 docker push를 할 때 편리하다.

 docker push crowssnest/docker-nodejs-demo

이렇게 레포지토리의 이름을 넣어서 푸쉬를 한다

도커허브에서 새로운 이미지가 만들어졌는지 확인을 한다. 그리고 아마존의 콘솔로 가보자.


ECS 구성하기

클러스터

클러스터가 없다면 클러스터를 새로 생성한다. 나는 클러스터가 있어서 기존꺼를 사용하려고 한다.


vpc

ECS 전용으로 VPC를 새로 만들어주려고 한다. 나는 172.31.0.0으로 지정하여 만들었다.

그리고 퍼블릭과 프라이빗 서브넷을 각각 두개씩 지정했다.


보안그룹

지금 만든 VPC를 선택해서 보안그룹을 생성해준다.

내가 만든 백앤드 서버가 80번 포트에서 작동하니 80번을 열고, 그리고 몽고를 연결했으니 27017포트 그리고 ssh 22번 포트를 설정한다. (https도 하고싶으면 443포트를 연다.)


작업정의

다시 ECS 콘솔로 돌아와서 작업정의에 들어간다.

AWS 완전관리형인 FARGATE를 사용할 것이다.

적당한 이름을 작업정의에 지정해준다. 그리고 task role ecsTaskExecutionRole을 넣어준다. 그리고 리눅스를 선택한다.

작업 사이즈도 연습용이니까 과금이 되지 않도록 작은 사이즈를 선택한다.


Environment                                             

e

컨테이너 이름을 적당히 지정해주고, 이미지 이름에는 도커허브의 레포지토리의 이름을 넣어준다.

ecsExecutionRole이 이미지를 당겨와서 사용해줄것이다.

그리고 80번에서 작동하는 서버니 80을 매핑해준다.

Environment에서 command에서 app.js를 실행할 수 있도록  node, app.js 명령을 넣어준다.

그리고 환경변수를 넣는곳에서 backend.env에 있는 내용을 넣어준다.

그리고 Add를 눌러준다.

그리고 작업정의 생성을 눌러준다.


클러스터 안 서비스 생성

생성한 클러스터에 들어가서 Services라고 되어있는 곳에서 Create를 누른다.

Fargate를 선택하고 리눅스 그리고 아까 생성한 작업정의를 잘 확인해서 넣어주낟. 그리고 서비스의 이름을 적당히 설정해주고, 필요에 따라 테스크의 갯수를 설정해준다.

그리고 쭈욱 내려서 Next를 누른다.

헬스체크를 로드밸런서로 해야하는데  EC2 console로 가서 로드밸런서를 만들어준다.


ECS 전용 ALB 만들기 & 타겟그룹

나는 ECS로 HTTP 통신을 할것이니 ALB를 선택해서 만들어준다.

이름을 적당히 설정해주고

ECS 전용으로 만들었던 VPC를 선택해준다. 서브넷을 선택할때는 퍼블릭으로 설정해둔다.

보안그룹도 ecs 전용으로 만들었던 보안그룹을 넣어준다.

그리고 타겟그룹을 선택해야하는데 지금 있는 타겟그룹이 없으니, 타겟그룹을 만들러 가야한다.


타겟그룹

Fargate를 기반으로 만드는 것이니 IP addresses를 선택해준다. 그리고 그룹 네임을 적당하게 설정하고 포트 번호는 내가 ecs에 올리는 애플리케이션이 80번에서 돌아가는 서버이니 80이 맞는지 확인을 잘 해준다.

헬스체크 경로는 /goals를 입력해준다.

내가 올린 ecs의 app.js를 보면 경로가 루트가 아닌 '/goals'에 엔드포인트가 되어 있어 있는 것을 볼 수있다. 그래서 여기서 서버가돌아가는지 확인할 수 있다.

그리고 next를 누르고 넘어간 뒤 등록을 하지 않고, 그냥 Create target group을 눌러서 생성을 한다.

타겟그룹이 잘 생성이 된것을 확인한다.

그리고 다시 로드밸런서로 돌아가서 타겟그룹설정에서 새로고침을 눌러서 새로 만든 타겟그룹을 넣어준다.

그렇게 로드 밸런서를 생성한다.

로드 밸런서가 프로비저닝 중인것을 확인할 수 있다. 이 와중에 다른설정을 마무리해보자


다시 서비스 생성

다시 ecs 서비스 생성으로 돌아와서, ecs전용으로 만든 Vpc를 넣고 보안그룹을 넣어준다.

그리고 아까 만든 Application Load Balancer를 클릭하고 이름을 확인한다. 그리고 밑에 Add to load balancer를 클릭한다.

프로덕선 리스너 포트를 토글해서 80을 눌러주고 타겟 그룹 이름에는 아까 만든 타겟그룹이 맞는지 확인한다.

그리고 넥스트 스텝을 쭉 눌러서 스킵한 뒤 서비스를 생성한다.

그러면 이렇게 서비스 안에 태스크가 생셔서 PENDING 상태인것을 확인할 수 있다.

그리고 Logs를 확인해보면 CONNECTED TO MONGODB!! 이렇게 ECS 애플리케이션과 MongoDB Atlas가 연결된것을 확인할 수 있다.

타겟그룹을 봐도 Healthy가 되어있다.

포스트맨으로 애플리케이션이 연결되어있는 ALB주소에 GET요청을 보내도 잘 반환되어 오는것을 볼수 있다. 정상 작동한다.

post를 보내도 잘 반환해준다.

그리고 다시 get으로 확인해봐도 방금 post로 넣은 값이 잘 확인되는것을 볼 수 있다.


Route53

server.crowsnest.click 도메인을 ecs alb에 연결한 뒤 저장을 해준다.

그리고 포스트맨으로 연결한 도메인을 넣고 Get을 하면 확인이 된다.

물론 주소창으로도 들어갈 수 있다.


HTTPS

로드밸런서에 리스터를 보면 HTTP 80으로 되어있는것을 볼 수 있다.

클릭하고 Edit을 누른다.

원래는 프로토콜에 HTTP가 되어있지만, 토글을 해서 HTTPS 로 변경해준다. 그리고 현재 보이는 부분에서는 다른 설정은 안만지고 내린다.

'

ACM 인증서를 첨부해준다. 없으면 밑에 요청해서 받아오도록 한다. 나는 이미 만들어서 넣기만 하면 된다.

Save Changes를 눌러서 저장한다.

 

f

그러면 이렇게 도메인을 입력하여서 접속하였을 때 HTTPS로 보안접속 되는 것을  볼 수 있다.

JUNE .

20'S LIFE IN SYDNEY and BUSAN

    이미지 맵

    DevOps Study/Docker 다른 글

    이전 글

    다음 글