이전 프로젝트를 진행하면서 로컬 환경에서는 https를 이용해 웹 애플리케이션을 제작했었는데,
막상 AWS를 통해 https로 배포를 하려고 하니 여러가지 문제가 발생하면서 단체 멘붕에 빠진 적이 있었다.
결국 코드를 뜯어고쳐 http로 배포를 한 슬픈 기억이... 또르르
그래서 이번 프로젝트는 아예 프로젝트 초반부터 미리 배포를 진행하며 어플리케이션 제작과 배포를 같이 병행해 나가는 방식으로
프로젝트를 진행하게 되었다.
HTTPS 이해
배포에 있어서는 통신프로토콜에 대한 이해가 절대적으로 필요하다.
만약 https에 대한 전체적인 이해가 없다면 아무리 다른 사람의 블로그를 읽으며 따라 하더라도 결국 멘붕에 빠지는 순간이 올 것이다. 필자가 그랬다.
그래서 일단은 https에 대한 간단한 이해를 하고 넘어가야 한다.
https의 필수개념은 암호화와 복호화를 공개키와 개인키를 통해 한다는 점이다.
아마 express https 튜토리얼을 보면 아래와 같이 코드가 나와있는 것을 본 적이 있을 것이다.
let server;
if(fs.existsSync("./key.pem") && fs.existsSync("./cert.pem")){
const privateKey = fs.readFileSync(__dirname + "/key.pem", "utf8");
const certificate = fs.readFileSync(__dirname + "/cert.pem", "utf8");
const credentials = { key: privateKey, cert: certificate };
server = https.createServer(credentials, app);
server.listen(HTTPS_PORT, () => console.log("server runnning"));
} else {
server = app.listen(HTTPS_PORT)
}
module.exports = server;
여기서 fs.readFileSync는 공개키와 개인키를 변수에 할당하는 메소드인데,
실제 배포에서는 서버에서 클라이언트에게 이 암호화 키를 넘겨줘서 암호화된 데이터만 수신되도록 한다.
따라서 원래는 배포 서버의 디렉터리에 해당 키들이 저장이 되어있어야 한다. "원래는"
HTTPS AWS 배포
하지만 AWS를 통해 https 배포를 하려는 분들에게는 이런 안내가 없어서 당황할 것이다.
엥? 그런 거 설명하는 블로그는 없는데? EC2에 공개키 개인키 저장하란 말이 없는데?
맞다. 그래서 필자도 하루를 꼬박 날렸다.
이유는 AWS에서는 보다 편하고 안전하고 쉽게(?) https 배포를 할 수 있도록 여러 장치를 마련해놓았기 때문에 그렇게 할 필요가 없는 것이다.
https 공개키 개인키는 인증 만료기간이 있다. 만약 공인 웹사이트로부터 키를 발급받아 서버에 직접 저장하고 https 배포를 하게 되면 만료 문제 혹은 여러 이슈들이 발생한다고 한다.(이건 필자가 직접 해본 방법이 아니라 자세히는 잘 모르겠다.)
반면에 AWS는 간편하게 이를 해결할 수 있는 장치를 마련해 놓았는데 바로 아래 장치들이다.
- Route53
- AMC
- CloudFront
- ELB
아래 개념도를 한 번 살펴보자. (필자가 만들었다. 쑥쓰...)
개념도에서 볼 수 있듯이 ELB(로드밸런서)를 기점으로 HTTPS의 영역과 HTTP의 영역이 나누어진다.
자세히 설명하자면 로드밸런서와 EC2는 http통신을 하기 때문에 EC2에 키를 넣을 필요가 없다.
EC2로 가는 모든 요청은 ELB에서 처리하며 EC2는 ELB와만 통신을 하게 되는 개념이다.
외부와의 HTTPS 통신을 ELB가 처리해야 하므로 로드밸런서는 인증서(키)가 필요하게 된다.
그래서 다른 블로그를 통해 볼 수 있듯이 로드밸런서를 설정하면서 AMC와 Route53로 발급한 인증서를 설정해주는 것이다.
Target Group???
AWS 배포와 관련된 블로그를 보면 업데이트 이전 버전이라 디스플레이가 안 맞거나 혹은 있던 버튼이 없어지고 없던 버튼이 생기는 것이 많이 있다.
그중 필자를 가장 괴롭혔던 부분은 아래 로드밸런서 생성에서 target group 설정이었다.
블로그에는 아래 설명이 없어 여기서 설명드리고자 한다.
target group이란 말 그대로 로드밸런서가 타깃으로 하는 대상을 말한다.
위 개념도에서 로드밸런서가 대화하는 타깃은 ec2이므로 여기서는 create target group을 선택한후 타겟으로 하는 ec2를 선택해주면 된다.
이름은 아무거나 지어도 상관없다.
필자의 경우 port를 80으로 설정했다. 왜냐하면 http로 ec2와 통신을 할 것이고 ec2 포트도 80번을 열어놓았기 때문이다.
그리고 여기서 진짜 중요한 점!
타겟 그룹을 만들고 타깃을 꼭꼭 등록해줘야 한다.
아래에서 register targets를 클릭하고 가능한 인스턴스에서 include as pending below를 해서 타깃을 꼭 등록해줘야 마무리된다.
이번 https 배포를 도전하면서 많은 생각이 들었다.
아.. 이래서 devops가 따로 있구나...
그리고 나는 devops가면 안 되겠다... ㅋㅋㅋ
'Random' 카테고리의 다른 글
자바스크립트 파일을 브라우저에 한번에 로딩하면 어떻게 될까? (0) | 2022.03.19 |
---|---|
Axios 요청과 fetch 요청의 차이 (0) | 2022.03.05 |
[Docker] Image를 Docker hub에 등록하기 (0) | 2022.02.11 |
[Docker] Image 생성후 container 실행하기 (0) | 2022.02.10 |
[Docker] 우분투/Linux Mint Docker 설치 에러 (0) | 2022.01.31 |