[AWS] ECS를 통한 배포 자동화

sang yun Lee·2023년 5월 14일
0

Devops 실습

목록 보기
7/21
post-thumbnail

개요


서버에 트래픽이 많아지면 서버의 확장을 고려하게 된다. AWS ECS 를 사용하면 원하는 개수만큼의 서버를 손쉽게 프로비저닝 및 배포할 수 있으며 트래픽 등에 따라 자동으로 스케일 아웃(수평 확장)이 진행되게 할 수 있어 급격한 트래픽에 대비할 수 있다. 또한 ECSFargate 를 함께 사용하면 불변 인프라를 구성하기에 용이하다. (Fargate 는 도커 이미지를 사용하기에 불변 인프라와 잘 들어맞는다)

목표


  • ECSfargate 를 사용하여 서버를 프로비져닝 및 배포해본다.
  • fargateSecret Manager를 적용해 환경변수를 설정해본다.

실습


실제 서버의 환경을 시뮬레이션하기 위해 하나의 DB서버와 다중의 벡엔드 서버를 구현해보자.
(현업에서는 DB서버를 fargate로 생성하지는 않을테지만 공부차원에서 ECS로 생성할 예정)

STEP 1 : 몽고 DB 서버 배포

  1. 몽고DB용 task 생성

    • 몽고DB 최신 이미지 mongo:latest 를 사용
    • 포트로 27017 기입 (몽고DB 포트) 및 사용할 몽고디비 ID, PWD 기입
    • 사용할 몽고디비 ID, PWD 기입 (MONGO_INITDB_ROOT_USERNAME, MONGO_INITDB_ROOT_PASSWORD)
    • 나머지는 기본값으로 하고 생성한다.
  2. NLB 로드밸런서 생성

    • 가용영역 전부 체크
    • 리스너 추가
    • 대상그룹 생성
  3. 클러스터 서비스 생성

    • https://velog.velcdn.com/images/arnold_99/post/e24f484f-e15c-485b-a1dd-0d1cb17383c1/image.png https://velog.velcdn.com/images/arnold_99/post/c2d45e35-8da3-48c7-8129-ee66b0c8df64/image.png

로드밸런서에서는 하나의 가용영역(az)안에 하나의 서브넷만 사용가능하므로 주의한다.

보안그룹에는 80포트와 27017포트를 허용하는 보안그룹을 사용한다.

https://velog.velcdn.com/images/arnold_99/post/39982620-a58f-4bd3-862a-279411a96396/image.png

https://velog.velcdn.com/images/arnold_99/post/affbdd82-0a82-499d-a022-d9d3fac3bd84/image.png

STEP 2 : 서버 이미지 ECS 배포와 db연결

  1. ECR private repository생성
    https://velog.velcdn.com/images/arnold_99/post/3edf3276-2af3-4943-88f0-e99453893d1d/image.png

  2. 생성 옵션

https://velog.velcdn.com/images/arnold_99/post/94f5f6f4-d02f-4375-8605-3c9ec28d4a09/image.png

  1. 생성한 리포지토리에 들어가서 푸시명령 확인하기

https://velog.velcdn.com/images/arnold_99/post/1744269f-fb10-4364-a64d-b1cb683e9b20/image.png

  1. 이미지를 다음 명령어를 순서대로 입력하여 빌드한다.

https://velog.velcdn.com/images/arnold_99/post/b0e18e72-2c7b-47c7-a52d-dc89e100a8a8/image.png

  1. 민감한 정보 Screts Manger에 저장
    backend 코드에서 MONGO_URL로 환경변수를 받아와서 사용하기에 MONGODB 연결 URL을 담아준다.

https://velog.velcdn.com/images/arnold_99/post/fb48ba45-7e74-47f5-b1a7-0167e1f9f045/image.png

https://velog.velcdn.com/images/arnold_99/post/0ab1ecb3-05d2-49f6-b8da-e5785636d95e/image.png

  1. 테스크 정의 생성
    이미지 URL은 위에서 생성한 ECR의 URL을 입력해주고
    포트 매핑을 추가하여 사용중인 포트를 입력해준다.
    https://velog.velcdn.com/images/arnold_99/post/2163eb2d-2e17-4748-bc6f-00b2e23fb5a4/image.png

    키는 실제로 애플리케이션에서 사용할 환경 변수 이름입니다.

    값 유형은 ValueFrom으로 설정해 둡니다.

    값은 Secrets Manager에 저장되어 있는 보안 암호의 키/값의 ARN으로 지정합니다. 다음과 같은 형식입니다.

    arn:aws:secretsmanager:ap-northeast-2:725601756882:secret:VELOG_MONGO_URL-Rpur08:MONGO_URL::

    VELOG_MONGO_URL 은 보안 암호 이름입니다.

    Rpur08 일종의 해시값으로 ARN에서 확인할 수 있습니다.

    MONGO_URL은 보안 암호의 키입니다. 우리는 MONGO_USERNAME 등으로 지정하면 됩니다.

    https://velog.velcdn.com/images/arnold_99/post/7fe37db0-077f-4285-8967-9bd20373433f/image.png
    다음 옵션은 기본값으로 설정하고 생성한다.

https://velog.velcdn.com/images/arnold_99/post/b618b3f5-23c6-45e8-a30f-8c955bd21b1d/image.png

  1. 사용하고 있는 테스크 역할에 권한을 추가해준다.
    SecretsManagerReadWrite을 추가해준다.
    https://velog.velcdn.com/images/arnold_99/post/615c5d1d-5374-438e-9744-cfd74113e7c0/image.png

  2. 벡엔드 클러스터 서비스 생성

https://velog.velcdn.com/images/arnold_99/post/518c17c1-296b-4e39-801e-c2a5537ae95a/image.png
https://velog.velcdn.com/images/arnold_99/post/3cf97641-dc2c-4518-9bd0-fbbca5643b6b/image.png
9. 보안그룹은 포트 3000이 열려있는 보안그룹을 선택해준다.
https://velog.velcdn.com/images/arnold_99/post/5ee6eedd-6251-4a2f-be69-6444e1b75d62/image.png

  1. 로드밸런서는 ALB로 서비스와 함께 새로 생성해준다.

https://velog.velcdn.com/images/arnold_99/post/6a6b6e21-0abe-4b06-9872-a99d23d37785/image.png

mongoDB 이미지 ECS 배포

mongoDB 이미지 ECR에 업로드

ECR private repository생성

생성 옵션

생성한 리포지토리에 들어가서 푸시명령 확인하기

이미지를 다음 명령어를 순서대로 입력하여 빌드한다.

aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 725601756882.dkr.ecr.ap-northeast-2.amazonaws.com
docker pull mongo
docker tag mongo:latest 725601756882.dkr.ecr.ap-northeast-2.amazonaws.com/velog-mongo:latest
docker push 725601756882.dkr.ecr.ap-northeast-2.amazonaws.com/velog-mongo:latest

An error occurred (UnrecognizedClientException) when calling the GetAuthorizationToken operation: The security token included in the request is invalid. Error: Cannot perform an interactive login from a non TTY device

해당 오류가 발생할시 해결법 링크

클러스터 생성

주의! 하나의 가용영역 즉 az 하나에 한개의 서브넷만 사용하도록 한다

테스크 정의 생성

이미지 URL은 위에서 생성한 ECR의 URL을 입력해주고

포트 매핑을 추가하여 mongo의 포트인 27017을 입력해준다.

앱 프로토콜은 NONE으로 설정해준다.

환경 변수를 추가하여 mongoDB의 사용자와 비밀번호를 적어준다.

MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example

CPU와 메모리는 기본값으로 사용하고 태스크역할과 실행역할만 설정하고 넘어간다.

처음 생성하는 경우 역할이 뜨지 않을 수 있다. 그경우에는 비우고 넘어간다.

NLB 로드밸런서 생성

가용영역 전부 선택

대상그룹 생성

클러스터 서비스 생성

로드밸런서에서는 하나의 가용영역(az)안에 하나의 서브넷만 사용가능하므로 주의한다.

보안그룹에는 80포트와 27017포트를 허용하는 보안그룹을 사용한다.

서버 이미지 ECS 배포와 db연결

ECR private repository생성

생성 옵션

생성한 리포지토리에 들어가서 푸시명령 확인하기

이미지를 다음 명령어를 순서대로 입력하여 빌드한다.

민감한 정보 Screts Manger에 저장

backend 코드에서 MONGO_URL로 환경변수를 받아와서 사용하기에 MONGODB 연결 URL을 담아준다.

테스크 정의 생성

이미지 URL은 위에서 생성한 ECR의 URL을 입력해주고

포트 매핑을 추가하여 사용중인 포트를 입력해준다.

키는 실제로 애플리케이션에서 사용할 환경 변수 이름입니다.

값 유형은 ValueFrom으로 설정해 둡니다.

값은 Secrets Manager에 저장되어 있는 보안 암호의 키/값의 ARN으로 지정합니다. 다음과 같은 형식입니다.

arn:aws:secretsmanager:ap-northeast-2:725601756882:secret:VELOG_MONGO_URL-Rpur08:MONGO_URL::

VELOG_MONGO_URL 은 보안 암호 이름입니다.

Rpur08 일종의 해시값으로 ARN에서 확인할 수 있습니다.

MONGO_URL은 보안 암호의 키입니다. 우리는 MONGO_USERNAME 등으로 지정하면 됩니다.

다음 옵션은 기본값으로 설정하고 생성한다.

사용하고 있는 테스크 역할에 권한을 추가해준다.

SecretsManagerReadWrite을 추가해준다.

벡엔드 클러스터 서비스 생성

보안그룹은 포트 3000이 열려있는 보안그룹을 선택해준다.

로드밸런서는 ALB로 서비스와 함께 새로 생성해준다.

0개의 댓글