'SQS'는 아마존 웹 서비스(AWS)에서 제공하는 메시지 큐 서비스입니다. SQS는 분산 애플리케이션, 마이크로서비스 및 서버리스 애플리케이션에서 메시지를 보내고 받는 데 사용됩니다.
메시지 큐는 송신자와 수신자 간의 비동기적인 통신을 위해 사용되며, 메시지를 보내고 받는 방식으로 작동합니다.
송신자는 메시지를 큐에 보내고, 수신자는 해당 큐에서 메시지를 가져와 처리합니다.
이러한 방식으로 메시지 큐를 사용하면, 다양한 애플리케이션 간에 안정적이고 확장 가능한 통신을 구축할 수 있습니다.
SQS는 서버리스 환경에서 사용하기 적합하며, 다양한 AWS 서비스와 통합할 수 있습니다.
SQS를 사용하면 메시지 큐 관리 및 처리를 간편하게 수행할 수 있습니다.
SQS는 여러 사용자가 동시에 큐를 사용할 수 있으므로, 고성능 및 확장성이 보장됩니다.
1. 아마존 웹서비스에 가입을 합니다.
2. https://ap-northeast-2.console.aws.amazon.com/sqs/v2/home?region=ap-northeast-2#/ 에 들어가서 SQS 페이지로 갑니다.
3. 대기열을 생성합니다.
4. iam 에서 sqs 권한을 생성합니다.
full 권한이 있습니다.
sqs 액세스 정책도 해당 iam 으로 변경합니다.
(iam 정보는 iam 쪽에 있습니다.)
Github Action 을 적용하기 위해서는 우선 Github 에 Action을 적용할 저장소가 필요하다.
우선 Github Action을 적용하기 위한 프로세스를 간략하게 나열하겠다.
위의 프로세스로 작업을 해 보겠다.
필자는 이미 올렸다.
우선 프로젝트 폴더 Root 위치에 .github/workflows 폴더를 만들었다.
그 후, 필자는 blank.yml 이라는 파일을 생성했다.
name: CI/CD
on:
push:
branches: [ master ]
jobs:
build:
runs-on: self-hosted
steps:
- name: Pull Master Branch
run: |
cd /var/www/roadmap/ && sudo git pull origin master
- name: Deploy with React Build
run: |
sudo sh /var/www/roadmap/deploy.sh
필자는 master 브랜치에 push 를 할 경우 action 을 잡았다.
jobs 에 runs-on 은 따로 Linux 서버를 이용하기 때문에 self-hosted 로 적용했다.
그리고 steps 에는 sudo sh /var/www/roadmap/deploy.sh 했는데, 해당 코드는 React 프로젝트를 빌드하고 Django 가 Build 된 정보를 추적할 수 있도록 설정하고, collectstatic 하고, nginx 및 uwsgi 를 재부팅 하는 코드를 작성했다.
그래서 Action 으로 는 이 .sh 파일을 실행하도록 명령한 것이다.
필자는 이미 git clone 으로 해당 프로젝트를 다운로드 받았다.
필자는 Linux 인데 sudo su - 로 접속 후 ./config.sh --url ... 를 작성하면 sudo 로는 못한다는 에러가 난다... 이때 앞에 RUNNER_ALLOW_RUNASROOT="1" ./config.sh --url... 같이 하면 된다.
해당 작업을 전부 하고, service 로 올리기 위해 sudo ./svc.sh install 작업을 한다.
그 후, 서비스를 실행한다. sudo ./svc.sh start
서비스를 종료하고 싶으면 sudo ./svc.sh uninstall 한다.
이제 모든 작업이 완료 되었다!!!
프로젝트를 수정해서 master 에 push 하면 이제 자동으로 배포 작업을 할 것이다!!
아주 편리해졌다!!
아래 사진은 Action 을 수행한 모습이다.
오랜만에 글을 올리네요.
요즘 너무 바빠서 블로그에 손을 대지 못했는데 기존에 프로젝트를 하면서 새로운 지식을 얻게 되어, 이렇게 기록을 합니다!
프로젝트를 하면서 알림을 보내야하는 경우가 있습니다.
이때, 이메일로 보낼 수도 있지만 이메일로 보내는 경우 비용(개발자 리소스)이 많이들기 때문에 슬랙으로 모니터링 할 수 있는 방법을 기록하려고 합니다.
슬랙에 스페이스를 만들고 더보기를 클릭합니다.
앱을 클릭합니다.
검색창에 in 으로 검색을 한 후, 수신 웹후크의 추가 버튼을 클릭합니다.
그러면 아래와 같은 화면 웹 브라우저가 켜집니다. 이때 Slack에 추가를 클릭합니다.
원하는 채널을 선택합니다.
설정을 완료하면 아래와 같은 웹후크 url 이 나옵니다.
이 웹후크 URL 를 기록합시다.
추가로 아래 쪽으로 스크롤 하다보면 이 웹후크 설정 내용을 확인할 수 있습니다.
웹후크 시, 웹후크에서 보내는 아이콘의 이미지를 수정한다던지 그렇습니다.
웹후크를 실행하는 방법은 http 통신으로 가능합니다.
예제를 보면 curl 로 이용할 수도 있죠.
아래와 같이 사용할 수 있죠!
하지만 저는 python 프로젝트에서 이를 사용하려고 합니다.
그러면 python 코드로 이것을 간단하게 모듈화 하여 사용합시다.
def notify_slack(channel_url: str, text: str):
payload = json.dumps({
'text': text,
})
requests.post(
url=channel_url,
data=payload,
)
(requests 모듈을 설치했습니다. pip install requests)
위 코드에서 channel_url 을 복사했던 링크입니다.
text 는 전달할 메시지입니다.
이제 함수를 실행하면 정상적으로 텍스트가 전달됩니다.
동글이: 안녕하세요~! 저는 동글이에요!
네모니: 안녕하세요~! 저는 네모니에요!
글을 작성할 때, 도와줄 캐릭터를 만들어 보았다.
파이썬에는 코드의 실행 시간을 측정해 줄 수 있는 timeit 이라는 라이브러리가 존재합니다.
timeit 은 python 기본 라이브러리로 2.7 버전부터 존재합니다.
timeit 공식문서: https://docs.python.org/ko/3/library/timeit.html
timeit 을 사용하는 가지 방법이 있습니다.
1. cli 를 이용한 실행
2. 코드에서의 실행
기본적으로 cli 에서 실행한 모습을 살펴봅시다.
python -m timeit '"-".join(str(n) for n in range(100))'
위 cli 의미는 '' 안에 있는 코드를 10,000 번 반복하라는 의미입니다.
(기본 반복 값은 10,000 번이다.)
이번에는 동일한 내용으로 코드에서 실행해봅시다.
import timeit
print(timeit.timeit('"-".join(str(n) for n in range(100))', number=10000))
지금까지는 함수 자체를 호출하는 것이 아닌 문자열에 특정 코드를 입력하는 방식으로 접근했습니다.
이번에는 직접 특정 부분을 호출하는 식으로 timeit 을 사용해봅시다.
import timeit
print(timeit.timeit(lambda: "-".join(map(str, range(100))), number=10000))
실전에 사용할 법한 예제를 가져왔습니다.
1 ~ 20,000 까지 요소를 가지고 있는 랜덤한 리스트가 랜덤한 개수만큼 안에 있다고 가정합시다.
# random_ints 의 길이가 100 혹은 150 혹은 랜덤한 갯수입니다.
random_ints = [1, 4, 7, 256, 222, 123, ...]
1 ~ 20,000 중 랜덤한 숫자 10개 를 고릅니다.
저는 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 으로 간단하게 예를 들겠습니다.
그러면 random_ints 에서 이 랜덤한 숫자 10개 중 겹치는게 어떤 것들이 있는지 알아내는 코드를 짜봅시다.
(코드 작성할 때는 랜덤 함수를 넣지 않고 정적으로 1 ~ 1000 으로 넣었습니다.)
import random
random_ints1 = [i for i in range(1, 20001)]
random_ints2 = [i for i in range(1, 11)]
together_has_int = []
for random_int2 in random_ints2:
if random_int2 in random_ints1:
together_has_int.append(random_int2)
print(together_has_int)
위와 같은 코드를 짤 수 있습니다.
저는 random_ints1 에 1 ~ 1000 개의 숫자를 생성했고, random_ints2 에 1 ~ 10 의 숫자를 생성했습니다.
이중에서 겹치는 요소를 together_has_int 라는 리스트에 넣기 위해 생성했습니다.
이런 코드도 짤 수 있지만 python 에 집합(set) 자료형을 이용할 수도 있습니다.
import random
random_ints1 = {i for i in range(1, 20001)}
random_ints2 = {i for i in range(1, 11)}
together_has_int = random_ints1 & random_ints2
print(together_has_int)
코드는 집합(set) 자료형으로 생성하니 더욱 가독성이 좋아보이네요
이중에 위에 코드가 더 빠를까요? 혹은 아래코드가 더 빠를까요??
이럴 때, timeit 을 사용할 수 있습니다!
import timeit
def test_list():
random_ints1 = [i for i in range(1, 20001)]
random_ints2 = [i for i in range(1, 11)]
together_has_int = []
for random_int2 in random_ints2:
if random_int2 in random_ints1:
together_has_int.append(random_int2)
return together_has_int
print('test_list', timeit.timeit(test_list, number=10000))
def test_set():
random_ints1 = {i for i in range(1, 20001)}
random_ints2 = {i for i in range(1, 11)}
together_has_int = random_ints1 & random_ints2
return together_has_int
print('test_set', timeit.timeit(test_set, number=10000))
놀랍도록!! 집합(set) 자료형을 이용한 케이스가 더욱 느렸습니다!
집합(set) 자료형은 요소가 많으면 시간이 더 늘어나는 게 보이네요!
1번째 시도
2번째 시도
Django 와 React 프로젝트를 진행하면서 배포를 하기 위해서는 Git 레포지토리에 push 하고 서버 컴퓨터에 pull 을 받은 상태에서, 매번 React 프로젝트를 Build 한 다음 Build 된 폴더를 Django 가 가리키는 static 폴더로 옮기고 collectstatic 해야한다.
그 후, 웹서버와 웹서버게이트웨이 인터페이스를 재실행 해줘야 하는 불변함을 매번 겪어야 한다.
간단하게 이 순서를 나열하면
벌써 재배포를 하기 위해서 여러 작업이 필요하다.
더 간단하게 하기 위해 CI/CD 툴을 이용했다.
CI/CD 를 도와주는 것 중에 필자가 자주 이용하는 Github 자체에 이 역할을 수행해 주는 Github Action 이라는 것이 있다고 했다.
Github Action 은 간단하게 설명하면 로컬에서 Github 원격저장소에 하는 일련의 행위 중 (예: push 등) 무언가를 하면 해당 Github 원격 저장소를 Github Action 으로 연결된 특정 서버에서 어떤 역할(명령어 실행) 을 할 수 있도록 도와주는 것이다.
더욱 간단하게 설명하면 아래 사진과 같다.
다음 장에서 직접 구현해서 프로젝트에 적용해 보자!