전체 글
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - AWS CodePipeline을 활용한 CI CD개요
CI CD는 코드 작성 -> 빌드 -> 테스트 -> 릴리즈 -> 배포과정을 자동화 하는 과정이라고 했습니다. 당연히 100%자동화는 불가능 할 수도 있지만, 이를 최대한 쉽게 해보자는 취지입니다. 코드부터 빌드까지가 CI ( Continuous Integration )이고, 테스트 -> 배포과정을 CD (Continuous Deploy, Delivery)과정이라고 합니다. 이를 위해서 AWS Codebuild, CodeDeploy, Codepipleline을 활용하겠습니다. CI/CD in AWS 일단 맨처음에 개발자가 Git에 Master로 커밋을 한겁니다. 그럼 순간에 커밋이 되었다는 액션에 트리거가 되어서, Code Build라는 대로 들어가게 됩니다. CodeBuild는 Build -> Test작..
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - (인프라) 마이크로 아키텍처 개발 시 문제점들
처음 마이크로서비스 도입할 때 겪은 문제점들 우선 모놀로식을 배포할 때는 그냥 하나의 코드 뭉테기를 배포하면 끝이였습니다. 하지만 마이크로 서비스는 이를 하기 위해 상당히 복잡한 프로세스 + 오랜 시간이 필요하게 됩니다. 그리고 에러가 났을 때 Debugging하기가 매우 힘들어집니다. 왜냐하면 이미즐 업로드 하는 과정에서 에러가 났다고 해 봅시다. 그럼 이게 이미지 업로드 하는 서비스 내부의 코드 문제인지, 아님 다른 서비스와 소통할 때 발생하는 문제인지 알 수가 없게 됩니다. 그래서 디버깅을 해서 에러를 잡아내기 위해서는 수십개의 서비스의 로그파일을 확인해야 합니다. 그리고 너무 서비스가 거대해서 한 눈에 알아볼 수 없습니다. CI/CD 도입 CI/CD란 빌드 -> 테스팅 -> 배포의 모든 과정을 자..
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - (인프라) 마이크로서비스 아키텍쳐 개발 시 고려해야 하는 사항들
초기 설계의 중요성 마이크로 서비스를 개발하는데 있어서, 가장 중요한 점은 독립성이 최 우선이기도 하지만, API설걔에 있어서 거의 변경사항이 없다고 봐야한다고 할 정도로 완벽하게 설걔를 해야 한다는 점입니다. 마이크로 서비스는 모놀리식과는 다르게 회사의 규모가 큰 경우에 진행되고, 각각의 서비스가 하나의 팀인 경우가 많게 됩니다. 그러면 각 팀마다의 소통은 별로 없을 수도 있고, 이에 따라 API의 설계가 자꾸 바뀌면 매우 골치아파집니다. 그리고 마이크로 서비스에 있어서 스키마 관리도 매우 중요합니다. 만약에 서비스1에서 shop_name이 있고, 서비스2에도 shop_name이 있다면 이는 매우 효율적이지 못한 DB구조입니다. 따라서 각각의 서비스는 id와 최소의 정보만으로 정보들을 참조할 수 있게끔..
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - 데이터복제 이벤트 처리 Internal HTTP
이번에는 Flask의 main쪽을 수정을 해 보면서, 내부 HTTP연결을 통해서 두 서비스간에 소통을 하는 방법에 대해 간단히 알아보겠습니다. 그래고 저번시간에 코드도 잘못된 것이 있으므로 최종으로 코드의 틀을 완성하고 테스팅하는 시간이라고 보시면 됩니다. /boss/main.py from flask import Flask, jsonify, abort from flask_sqlalchemy import SQLAlchemy from flask_cors import CORS from dataclasses import dataclass from producer import publish import requests app = Flask(__name__) app.config['SQLALCHEMY_DATABASE..
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - 데이터복제 이벤트 처리 ( RabbitMQ )
우선 두 DB의 SYNC를 맞춰주기 위해 먼저 order로 REST API가 불러져서DB의 상태가 바뀌게 되면, boss에도 RabbitMQ를 통해 이를 알려주고 이의 DB도 바꾸어 보는 실습을 해보겠습니다. 실습 이를 위해서는 먼저 order의 producer.py의 publish함수를 수정해줘야 합니다. API를 부를 떄, boss에서 필요한 method, body정보를 받아와야 하기 때문입니다. https://python.hotexamples.com/examples/pika.spec/BasicProperties/-/python-basicproperties-class-examples.html 이번 실습에서 사용할 pika의 중요구문입니다. 이를 기준으로 진행하겠습니다. /order/user_order..
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - (개발) Docker 패키징과 구동 테스트
이제 여태까지는 python consumer.py를 backend bash쉘로 들어가서 직접 브로커로부터 오는 메시지를 확인해야 했습니다. 하지만 이러한 명령어를 치기 귀찮으니까, 그냥 하나의 컨테이너를 만들어서 거기서 아예 CMD로 python consumer.py를 command로 주어 백그라운드에서 확인할 수 있게 해 보겠습니다. 이를 위해서는 당연히 docker-compose.yml을 조금 수정해야 합니다. Django /docker-compose.yml version: '3.8' services: backend: build: context: . dockerfile : Dockerfile command: 'python manage.py runserver 0.0.0.0:8000' ports: - 8..
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - (개발) RabbitMQ Setup 및 이벤트 구독 테스트
이번에는 이저에 Django에서 했던 과정을 똑같이 Flask에 옮겨서 간단히 테스팅해보도록 하는 시간을 가져보도록 하겠습니다. /boss/consumer.py from pika import URLParameters, BlockingConnection # 파라미터 설정 params = URLParameters('amqps://vjmczupx:MOf1ZIEhCOj58rh-oSQd0Mrg_BpiVfUD@dingo.rmq.cloudamqp.com/vjmczupx') # 커넥션 ( 인스턴스에 접근 하는 것 ) connection = BlockingConnection(params) # 통로 ( 채널 )을 뚫어주는 것 channel = connection.channel() # 나는 order로 보낸 메세지만 받겠다..
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - (개발) RabbitMQ설치 및 설정 & Setup및 이벤트 발행 테스트
우선 RabbitMQ설정을 하기 위해 이를 설정하기 쉽게 도와주는 CloudAMQP에 가입하고 인스턴스 하나를 만들도록 하겠습니다. 여기서 지역은 ap-northeast-2로 바꾸어주어 하나 생성했습니다. 실습 이제 본격적으로 RabbitMQ의 pika를 이용해서 publisher와consumer를 만들어서 브로커를 통해서 이들간의 메세지 전달을 간단히 테스팅해보는 시간을 가져보도록 하겠습니다. RabbitMQ는 AMQP(Advanced Message Queuing Protocol)을 구현되었습니다. AMQP는 queue, exchange, binding이라는 세가지 개념으로 구성됩니다. - queue는 메세지를 보관하고 소비자가 메시지를 선택하기를 기다립니다. - exchange는 게시자가 새 메시지를..
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - (개발) 도메인 서비스 구현 - Flask, Model + Migrate
바로 이전에 등록한 docker-compose.yml을 실행시켜보도록 하겠습니다. 그러면 8001번 포트와 컨테이너의 5001번 포트와 연결시켜 주었기 때문에 아래와 같이 8001번 포트에서 Flask로 접속이 잘 됩니다. 이제 본격적으로 Flask에 Model을 만들고 migrate까지 해 보겠습니다. 이전에 flask_migrate, flask_script를 사용하는 과정에서 Flask 2.x.x을 사용하면 컨테이너에서 경로문제가 생기므로 일단 deprecated된 Flask 1.1.2버전을 사용하여 해결하도록 하겠습니다. 그리고 이를 하기 위해서 jinja2 2.1.3과 itsdangerous 2.0.1을 명시적으로 requirements.txt에 작성하고 reinstall을 해주었습니다. ( 1...
[ DevOps ] - AWS 기반 대규모 아키텍트 설계 - (개발) 도메인 서비스 구현 - Flask, Docker
이번에는 Flask로 독립적인 서비스를 하나 더 만들어 보겠습니다. Flask는 Django보다 더 쉽지만, 나중에 번거로운 작업을 해야할 때가 많습니다. 각자의 장단점이 뚜렷하게 있는 것이죠 이제 본격적으로 기본적인 Flask틀을 짜고 Dockerfile, docker-compose.yml파일까지 작성해서 기본 페이지를 만들어 보도록 하겠습니다. /requirements.txt Flask == 2.1.0 Flask-SQLAlchemy == 2.5.1 SQLAlchemy == 1.3.20 Flask-Migrate == 2.5.3 Flask-Script == 2.0.6 Flask-Cors == 3.0.9 requests == 2.25.0 mysqlclient == 2.0.1 pika == 1.1.0 jin..