글

2019.10.30 EC2에 클론서버 만들어보려다가 HSTS 때문에 삽질한 이야기

일단 현재 실섭을 Clone해서 똑같은 환경으로 만들어 보는 것을 목표로 하고 있다. 웹서버, wsgi를 제외한 다른 사항들은 거의 다 마무리가 되었는데, 웹서버(nginx)를 설정하다가 뻘짓을 했다. 일단 도메인, 서버네임 설정을 하나도 안 한 상태로 add_head 'Strict-Transport-Security' 설정을 했다. 기간은 1년으로... 진짜 nginx의 기본 옵션에 말 그대로 저거 하나만 추가한 셈. 그렇게 하니 HSTS 때문에 내 PC, 정확히는 내 PC의 브라우저에서 접속이 계속해서 https로만 강제되고 접속이 거부되었다. 처음에는 nginx의 설치문제 혹은 service를 잘못 등록한 문제인 줄 알고 별의 별 짓을 다 해보았는데 안되어서 절망했다 ㅜㅜ. nginx만 한 수십번 지웠다 재설치 한듯..ㅎㅎ (덕분에 유용한 명령어도 알아가지만...) 어쨌든 대체 nginx가 왜 장난 치는지 이해가 안 되던 중에 인스턴스에서 curl 루프백 하니까 페이지가 뜬다. 여기서 헐! 싶었다. 여태까진 nginx가 문제라 생각했는데 nginx는 잘 돌아가고 있었다. 뭔가 이상하다 싶어서 parallels를 키고 IE를 통해 접속하니까 잘 됨! 와이파이 끄고 폰으로 들어가도 잘 보인다... 허걱! 사실 이 문제가 지속될 때 시작할 때 저 망할 헤더를 추가한 뒤에 갑자기 접속이 안되길래 "아 이거 htst문제 아니야..?" 라고 짐작하고 넘어갔는데 이 후에는 nginx의 문제라고 시야가 점차 좁혀졌다. 그 순간 다시 HTST를 의심하기 시작했고 역시나 내 PC에서 접속하니 HTTP가 아닌 HTTPS로 접속이 강제되는 것을 볼 수 있었다 ㅠㅠ 그래서 크롬에서 htst 설정 된 사이트를 해제하려고 가서 query domain에 IP주소, nginx 설정의 서버네임등등을 계속 넣어봤지만 모두 not found. 중간에 내가 서버이름을 바꾸었다가 다시 되돌려놨다가 등등 어지럽힌 기억도 ...

2019.10.23 Dockerfile로 우분투에 Python, MySQL, Node 설정하기.

# build # ubuntu, flask, mysql FROM ubuntu:16.04 # prevent interactive alert message asking root account password from mysql ENV DEBIAN_FRONTEND noninteractive RUN apt-get update -y RUN apt-get install -y python python-pip python-dev build-essential RUN apt-get install -y mysql-server RUN apt-get install -y curl # Install node RUN curl --silent --location https://deb.nodesource.com/setup_10.x | bash - RUN apt-get install --yes nodejs RUN apt-get install --yes build-essential WORKDIR /app ADD . /app RUN pip install -r requirements.txt # This needs to be done to start mysql server # service mysql start ENTRYPOINT ["chown -R mysql:mysql /var/lib/mysql /var/run/mysqld"] 설치 과정 중에 몇가지 문제가 있었다. 1. 우분투 18.04 버전에서 mysql 설치가 제대로 안 되던 점. FROM ubuntu:latest -> ubuntu:16.04로 변경하는 것으로 처리했다. (난 굳이 18버전을 쓸 일이 없기 때문에) 2. interactive shell에 값을 입력하면 뻗는 문제 두 번째 마주한 문제는 mysql 설치시 root password를 설정하라고 interactive shell이 뜨는데 여기에 값을 입력하면 이후 진행이 안된다. 그냥...

2019.10.22 AWS의 VPC 세팅

AWS의 VPC VPC란 독립 네트워크 그룹 같은 개념이다. VPC안에서 실제 사용할 네트워크망은 서브넷으로 더 잘게 쪼갤 수 있다. 서브넷 안에 EC2, RDS등 실제 리소스가 배치 된다. AWS를 기준으로 10.0.0.0 ~ 10.255.255.255 , 172.16.0.0 ~ 172.31.255.255 , 192.168.0.0 ~ 192.168.255.255 의 3개의 VPC 사설 아이피 대역이 있다. VPC간 통신을 원하면 VPC 피어링이라는 서비스를 사용할 수 있다. VPC 내부에서 인스턴스가 요청을 하면 VPC 라우터(라우트 테이블)가 받아서 목적지로 요청을 인도한다. 이 때 VPC에서 외부로 통하는 관문은 인터넷 게이트웨이이다. CIDR 블록은 아이피주소와 그 뒤에 붙는 넷마스크 숫자로 구성된다. 넷마스크 숫자는 해당 IP대역에서 가질 수 있는 최대 IP의 갯수를 결정한다. (2의 32승-넷마스크 숫자가 해당 IP 대역에서 가질 수 있는 최대 IP 갯수) (2) 설치단계 VPC는 DNS 해석기능과 DNS 호스트네임 이 모두 활성화 되어 있는데 DNS 해석기능은 [naver.com](<http://naver.com>) 을 211.12.31.56 과 같은 IP로 바꾸는 것. DNS 호스트네임은 VPC내부에서 생성되는 인스턴스에 퍼블릭 DNS 호스트네임을 할당해주는 기능. 라우트테이블은 VPC를 생성할 때 자동으로 하나 생성이 되며 VPC에서 subnet을 생성할 때 그 subnet과 매칭이 된다. ACL은 서브넷으로 들어오는 트래픽 제어, 보안그룹은 인스턴스의 트래픽을 제어한다. VPC를 생성하면 이에 따라 같이 생성되는 것들이 총 7가지 정도 된다. (보안그룹, ACL, Route table..등) 먼저 VPC는 마치 wrapper 같은 역할을 한다. 독립 네트워크 단위의 가장 겉에 있는 그룹이고, 실제로 인스턴스들은 VPC 내의 서브넷에 위치한다. 따라서 VPC 생성 후에 네트워크 그룹인 ...

2019.09.16 git commit 되돌리기, cherry-pick, commit 제외하기

상황 : - 잘못한 커밋 -> Master Branch Merging -> 커밋1 -> 커밋2 -> 현재 - 현 상태에서 커밋1은 제외하고 싶음 여러 뻘짓을 해봤지만 아래 방법이 가장 깔끔했다. ``` Master에서 Pull로 최신화를 한 뒤 새로운 Branch를 만든다. 새로운 Branch에서 잘못 된 커밋이 섞인 Branch의 Commit을 Cherry-pick한다. ``` What I did, What was wrong? 1) Rebase로는 안되는가? 사실 현재와 커밋2 사이에는 여러 커밋이 더 있었다. 먼저 git rebase -i HEAD~커밋2 전 커밋까지 rebase를 했다. 이 후에 커밋2가 rebase할 때 빠진거를 깨닫고 다시 rebase를 하려고 하니 현재 상태와 커밋2간에 conflict이 났다. 왜인지는 잘 모르겠다. * 터미널에서 git rebase -i HEAD~(커밋갯수)를 하면 Interactive 모드가 실행된다. 메시지 창에서 커밋 내역을 조작할 수 있는데, 커밋 Hash 앞에 접두사에 pick을 붙이면 그 Commit은 히스토리에 남긴다는 뜻이고, 접두사에 squash를 붙이면 history에는 남기지 않겠다는 뜻이다. 하나의 pick 을 가진 채로 나머지 commit들은 모두 squash해버리면 pick으로 살린 커밋에 sqaush가 붙은 커밋들의 내역이 모두 들어간다. * HEAD~2 는 현재 포함 2개의 커밋이라는 것. 2) Reset으로는 안되는가? Reset으로 잘못한 커밋까지 되돌아가서 (git reset --mixed HEAD~5) 반영하고 싶은 Commit을 다시 올릴려고 했으나 Master를 Merging했던 브랜치도 reset이 되면서 merging 내역들도 unstage 되는 불상사가 일어났다. 더불어 터미널에서 git log를 해보니 얘는 master branch의 로그들을 출력하고.. 그래서 master에 이미 올라간 내역도 자칫...

2019.09.04 Python Strip()의 몰랐던 부분

<'www.example.com'.strip('cmowz.') 의 결과가 example이라는 걸 아시면 이 글을 안 봐도 됩니다.> 보통의 레퍼런스에 의하면 strip(arg) 메소드는 어떤 String의 양 끝단에 위치한 arg를 지우는 메소드라고 설명이 많이 되어있다. arg가 없으면 공백을 제거. 근데 신기하게도 위와 같은 결과가 example이 나오는 것을 보고 좀 알아봤더니 몰랐던 면모를 알 수 있게 되었다. strip()은 재귀적으로 호출하며, 인자에 들어가는 항목들을 String이 아닌 Char로 보고 재귀한 결과에 누적해서 적용한다. 만약 arg가 'abc'라면 가장 바깥쪽에 있는 문자가 a인지 검사하고 a를 strip한다. 그리고 그 결과에 b가 있는지 검사하고 b를 지운다. 그리고는 c로 넘어가서 c를 검사하고 지운뒤 결과를 내보낼 것 같지만? 사실은 그렇지 않다. strip을 하면 'abc'가 [a, b, c]로 인식이 된다. 그리고 매번 target string이 a,b,c를 포함하고 있는지 계속해서 결과마다 확인하고 strip을 하게 된다. 즉 a로 strip-> 그 결과를 다시 a로 strip-> a가 없다면 b로 strip -> 결과가 없으면 그게 target string이 되고 다시 a strip check -> b strip check -> c strip check 이런식으로 매 결과마다 누적해서 strip이 적용된다. (reduce함수를 생각하면 되겠다)

2019.08.26 Git 튜토리얼 보며 따라하기 - Reflog

Reflog reflog는 git log와 비슷하지만, 다른 점이 있다면 git log는 사용자가 실행한 히스토리를 기록하는 반면, reflog는 시스템 차원에서 해당 repo에 일어난 일을 기록한다는 것의 차이 가 있다. git reflog --oneline (git log -g --oneline도 똑같이 동작한다) 2160b1a ( HEAD -> rebase-test , origin/master , origin/HEAD , master ) HEAD@{0}: rebase finished: refs/heads/rebase-test onto 2160b1afd5f97121ddcb9eb1d2f50e20eabb9165 03e7f95 HEAD@{1}: rebase: 2160b1a ( HEAD -> rebase-test , origin/master , origin/HEAD , master ) HEAD@{2}: rebase: checkout master 03e7f95 HEAD@{3}: checkout: moving from master to rebase-test 2160b1a ( HEAD -> rebase-test , origin/master , origin/HEAD , master ) HEAD@{4}: checkout: moving from rebase-test to master 03e7f95 HEAD@{5}: checkout: moving from master to rebase-test 2160b1a ( HEAD -> rebase-test , origin/master , origin/HEAD , master ) HEAD@{6}: pull: Fast-forward 605db11 HEAD@{7}: commit: app.js developing 871eaf4 HEAD@{8}: pull: Fast-forward 03e7f95 HEAD@{9}: rebase finished: refs/h...

[Python] Struct 사용하기

Struct Struct는 C 구조체를 Python String으로 변환해주는 모듈이다. C 구조체란 서로 다른 Type을 가진 변수들을 하나로 묶어서 일종의 Class처럼 만든 것이다. Javascript의 Constructor, Python의 DataClass를 생각하면 쉬울 것 같다. 파이썬 2.7까지는 pack이 string을 return 했지만 3부터는 bytes 타입을 return하는 듯 하다. import struct struct.pack('구조체로 만들 때 사용할 타입', *인자) 이런식으로 하면 bytes 타입의 결과가 리턴이 된다. ex) struct.pack('hhl', 1, 2, 3) # b'\\x00\\x01\\x00\\x02\\x00\\x00\\x00\\x03' struct.unpack('hhl', b'\\x00\\x01\\x00\\x02\\x00\\x00\\x00\\x03') # (1, 2, 3) calcsize('hhl') # 8 # hhl은 short, short, long type을 의미한다. # 즉 1,2,3을 각각 short, short, long 타입으로 변환한 구조체를 만들어준다. 이것의 활용례는 뭐가 있을지 생각해봤는데, Model 단위로 움직이는 데이터의 serialization 서버-클라 통신간에 민감한 정보가 있으면 struct, encrypt 과정을 거쳐 안전성을 올리기. 그리고 공식문서를 보면 미리 만들어진 namedtuple에 unpack하는 과정만으로도 쉽게 data를 insert하는 방법을 찾아볼 수 있었다. from collections import namedtuple Student = namedtuple('Student', 'name serialnum school gradelevel') Student._make(unpack...