TIL - 2021.02.19

Wanna be __·2021년 2월 19일
2

TIL

목록 보기
18/45
post-thumbnail

Today, I Learned

  1. Elastic Beanstalk을 사용하고 있는 경우 Load Balancing을 해준다.
    맞다.. Elastic Beanstalk을 사용하고 있는 경우 Load Balancing을 해준다...
    다시 강조해도 부족하니 Elastic Beanstalk을 사용하고 있는 경우 Load Balancing을 해준다!

    처음에 EC2로의 외부 접속을 불허한 채, 나의 IP를 통한 http, https의 접근만을 허용하고자 하고싶었다. 그렇게 EC2의 보안그룹(이하 sg-1)에서 나의 IP만으로 수정하고 새로고침하니, 웬걸 아무 접속도 들어가지 않았다. 그래서 다음과 같은 생각을 해보았다.

    첫번째, 보안그룹설정이 잘못 되었을것이다.
    두번째, EB는 EB만의 보안그룹이 있을것이다.
    세번째, Route 53에서 IP기반으로 접근을 제어할 수 있는 방법은 없을까?
    네번째, Load Balancing을 하고 있으니 Load Balancing의 보안 그룹을 바꿔야겠다.
    다섯번째, 지금 사용하고 있는 Lb가 application LB이니, Network LB로 바꾸어 EC2에 들어오기 전에 필터링을 해 주어야 겠다!
    여섯번째, 왜 안되는거지?

    결과를 놓고보면, 첫번째와 네번째 생각이 맞고, 두번째와 세번째, 다섯번째 생각은 틀렸다.

    제일 먼저 우선 Load Balancing의 보안그룹을 확인하니 지금 EC2의 보안그룹과 다른 보안그룹을 사용하고 있었다(sg-2) 이때는 별 생각을 하지 않은채, "어? 이거 다르게 해놨는데 작동되고 있었네"하는 생각으로 LB의 보안그룹도 sg-1으로 바꿔주었다. -> 여기서 꼬이기 시작하였다.

    이후 sg-1의 인바운드 규칙을 이리 저리 수정해보았지만, http, https의 IP를 모두 허용했을 때에만 접속이 가능했고, 나의 IP만 허용하면 접속이 되지 않았다. 그래서 LB의 역할과 종류에 대하여 찬찬히 찾아보았고,

    Network LB도 만들어보고.. EB의 리스너도 다시 보고, nginx에 찍히는 로그도 보다 보니, 여기서 수상한 점을 발견하였다.

    생각해보니, 각기 다른 IP에서 접속이 되고 있을건데, 로그에 찍히는 IP는 많아야 2가지를 넘어가지 않았다. 나는 이게 EC2가 Respond 하는 Private IP이겠거니 하고 넘겼었는데, 이 두가지 IP가 로드밸런싱을 하고 있는 네트워크의 IP와 일치한다는 것을 알게 되었다.

    아 그렇다면, 다시 sg-1의 http와 https의 설정에서 해당 IP를 열어주면 되겠구나!

    맞다. 맞는 생각이다. 다만 실수한게 있다면 나는 아까 LB에도 같은 보안 그룹을 연결해 주었던 것이 여기서 문제가 되었다. AWS DOCS에는 Private IP로 접근하다고 했으니, Private IP로 열어주었다가, 작동하지 않길래 다시 Public IP로 접근을 열어주었지만, 여전히 작동하지 않았다.

    다시 고민하다보니, 좀 아까 서로 같은 보안그룹으로 설정해놨던 것을 알아차렸고, LB의 보안그룹을 다시 sg-2로 설정하여 여기에 내가 접속을 허가하고자 하는 IP를 입력해주었고, EC2의 보안그룹은 전체 허용(LB의 Private IP만 해도 되겠지만)설정을 하니 내가 원하는 설정을 할 수 있었다.

    예전부터 그려오던 전체적인 프로젝트의 구조에 대해서 다시 짚고 넘어가자.

    AWS Elastic Beanstalk을 사용하여, MultiDocker환경을 구성하여 웹서버를 만들었다.
    Nginx의 reverse_proxy를 통하여 api와 일반 프론트 서버로의 proxy를 전달한다.

    이 EB는 위와 같이 다른 많은 AWS service들과 상호작용 하게 되는데, 우선 user는 domain을 통하여 접근하였을때, Route53을 통해 AWS Name Server에 있는 나의 EB로 오게 된다. 근데 EB를 오기 전, Load Balancing을 거친다. 여기서 LB가 각종 request들을 1차적으로 받고, 다시 나의 EC2로 넘겨주는 식이다.

    EB의 EC2 와 LB의 보안그룹을 동일하게 설정하고서 해당 보안그룹에서 나의 IP만허용하게 되면, LB까지의 request는 정상적으로 전송될 것이다. 다만 해당 LB가 진짜 나의 서버인 EC2로의 request를 전송할 수가 없다! 왜냐면 보안그룹에 따라 거기도 나의 IP만 허용해두었는데, LB -> EC2의 reqeust는 나의 IP가 아닌 LB의 IP를 사용하는 것이 당연하기 때문...

    반대로, LB의 Private IP를 보안그룹에서 허용하게 되면, 애초에 내가 보내는 request가 LB로 접근이 되지 않기 때문에, 무의미한 시도가 된다..

    아주 단순한 작업을 하고자 했으나, 늘 그랬든 더 많은 시간을 들였고, 다행히 더 많은 것을 알 수 있었다.

  2. Load Balancing에서 Heatlth check 신호에 대한 응답이 Nginx 80번을 듣는 Block 에서 https 로 proxy_pass 되기 때문에 301번 응답을 받게 되고, 이에 따라서 Health check에서는 상태가 안좋다는 신호를 띄움


http로 접근 할경우, 최초 301번 응답을 보낸 뒤, Nginx에서 https로 proxy를 넘기는 것을 볼 수있다.

두 가지 방법이 있을 수 있겠는데,
첫번째는, Health check 자체를 https신호로 보내게 하는 방법
두번째는, Heath check의 301 응답도 상태가 안좋은 것이 아니라 좋음으로 인식 되도록 설정을 바꾸는 방법.

첫번째로 시도하였으나, 일단 현재 구성해 둔 Nginx에는 443번 port를 듣고있는 블록이 없다. 즉, ACM 인증서를 발급 받았고, Loac Balancing을 통하여 외부 http request를 내부적으로 https로 변경하여 처리할 수 는 있으나, 직접적으로 https로 들어온 접근이 향하는 엔드 포인트가 http이기 때문에 hex Code가 출력되었다.

12.34.56.78 - - [19/Oct/2012:10:40:43 +0100] "Ou\xB3\x89\x8DiB\x82\x9D\xE8?wshxLF'\x0F\xB2o\xF6\xCD\xFC\xC2\x82ck\xC4\xF7\x0F\x01\xBC\x8B\xDA\x93|\xEAL\x81\xED`Rbr\x0F\xC1\xC8T\xDE\x07\x91\xF5|J\x5C\xBD70\x22\xD5\xA5p\xF4\xF4\xAA\xC2\xF2a\x19\xFE" 400 172 "-" "-"
12.34.56.78 - - [19/Oct/2012:10:41:29 +0100] "[8]\xCC\x7F\x1E\xA9\xE6f\xD7<\xA9\x18\xD9\xC0\xD0j~O\x90C\x8D]hVz\x84\x94y]\x95{.\x13m_];W1\x16\xEF\xD6\xE2" 400 172 "-" "-"

"For example, you're sending an HTTPS request to port 80 of your web server instead of 443. As a result, the HTTP endpoint gets a bunch of encrypted data, makes no effort to decrypt it"

이 글에서 도움을 받아 원인을 파악할 수 있었고 2번째 방법으로 시도하였다.

두번째는 간단했다. EC2 > 로드 밸런싱 > 대상 그룹에서

Health check settings의 Success codes에 301을 추가하여 해결하였다.
나의 EB 환경은 더이상 심각이 아니다!

그러나, 추가적으로 든 의문은 ssl 인증서를 발급받지 않고 ACM등으로 https접근을 routing하는 나의 방법의 경우 nginx에 443 port를 listen 하는 블록을 생성할 수가 없었는데.. 이 경우 https://로의 health check를 200 OK로 뜨게 하는 방법은 없는 것인지 더 알아봐야겠다.

C++

  1. const_cast<>, static_cast<>, dynamic_cast<>, reinterpret_cast<>
    형 변환 혹은 각종 형식 변화를 강제할 수 있는 연산자이다.

    유튜브 영상의 댓글을 보던 중, DDD에 대한 의견이 있길래, DDD를 찾아봤다.. Micro Architecture Structure랑 Domain Driven Design, Test Driven Design 에 대한 개념을 조금 더 알아봐야겠다.

profile
성장하는 개발자

0개의 댓글