티스토리 뷰
AWS EC2에서 작업을 하다가 HTTPS 설정을 해야하는 필요한 이슈가 발생했다.
HTTPS 설정을 하기 위해서는 SSL/TLS 인증서를 발급받아야 한다.
SSL/TLS 인증서를 서버에 적용하기 위해서는 몇 가지 방법이 있다.
1. secure sign과 같은 정식 발급해주는 곳에서 발급 받고 가이드 대로 적용하기
https://www.sslcert.co.kr/guides/Spring-Boot-SSL-Certificate-Install
2. Let's encrypt를 사용하기(얘는 자동 갱신도 됨)
https://jiwontip.tistory.com/83
3. ACM(AWS Certificate Manager) 사용하기
https://docs.aws.amazon.com/ko_kr/acm/latest/userguide/acm-overview.html
1번은 유료+자동갱신이 안된다.(매번 유료로 수동 갱신을 해야한다)
2번은 수동으로 제법 많은 작업을 해줘야 한다.(자동갱신을 하려면...)
그래서 AWS 사용자라면 너무나 자연스럽게 ACM의 사용을 생각할 것이다.
그런데, ACM을 선뜻 골라서는 안될 이유가 있다.
모든 서비스에 바로 적용할 수 없기 때문이다. 예를 들어, EC2에 바로 적용할 수 없다.
https://docs.aws.amazon.com/ko_kr/acm/latest/userguide/acm-services.html
위 문서를 보면 최 상단에 ELB(Elastic Load Balancing)이 있는걸 확인할 수 있다.
그렇다. 불행히도 EC2와 로드밸런서를 연동해야 ACM을 사용할 수 있다.
(EC2 내부에 ACM에서 발급받은 인증서를 사용할 수도 있다고는 하는데 그렇게까지 해야하나 싶음)
그래서 ACM을 적용할 인프라 상황부터 정리하면, 그냥 public한 EC2를 구성했다.
이제부터 방법을 정리할 건데, 여기서부터 알아야할 사실은 원래는 이렇게 시작하면 안된다.
도메인이 붙고 로드밸런서가 붙어서 반드시 로드밸런서를 통해서만 통신이 되야하는데,
이렇게 public하게 EC2를 구성해버리면 EC2에 바로 접근이 가능하다.
private하게 구성하는건 기회가 되면 정리해보겠다.
시작하기 전에 ACM과 Route53에서 도메인은 발급 받았다고 가정한다.
1. EC2에 WAS 배포
2. 대상 그룹(Target Group) 설정
3. ALB 설정
4. Route 53에서 발급받은 도메인에 ALB 연결
이 순서대로 진행한다.
1. EC2에 WAS 배포하기
간단한 기능을 가지는 서버 배포했다. 배포는 수동으로 진행 : https://akku-dev.tistory.com/53
@RestController
public class AnimalController {
@GetMapping("/wolf-sounds")
public ResponseEntity<Object> getWolf(String sound) {
String wolf = null;
if(sound.contains("아우우")) {
wolf = "하얀 늑대";
} else if(sound.contains("하우우")) {
wolf = "파란 늑대";
} else if(sound.contains("와우우")) {
wolf = "검은 늑대";
} else if(sound.contains("캬우우")) {
wolf = "빨간 늑대";
} else {
wolf = "회색 늑대";
}
return ResponseEntity.ok(wolf);
}
}
기본적으로 외부에서 접근하기 위한 보안 그룹지정 같은건 알아서 했으리라 생각한다..
배포가 잘 됐나 확인
2. 대상 그룹 설정
AWS EC2에 가면 대상그룹이 있다.
대상 그룹을 만드는데 주의할 점이 두 가지 있다.
프로토콜 : 포트 부분과 상태 검사 부분인데(여기서 굉장히 헛발질을 많이 했다)
프로토콜 : 포트는 WAS에서 요청을 받기 위해 열어둔 포트를 지정해야 한다.
상태 검사는 상태검사 라이브러리가 있어서, 그 API를 이용했다.
대상 그룹을 만들었으면 이제 로드밸런서와 대상 그룹을 연결해야 한다.
3. ALB 설정
ALB 설정에 주의할 점은, ALB에서 VPC 서브넷은 두 개 이상 지정해야만 한다는 것과
HTTPS로 지정하면, 보안 리스너 설정이란게 나와서 미리 발급받아둔 ACM을 지정하자.
위 예시에선 대상 그룹이 지정되지 않았지만, 이전에 만들어뒀던 대상 그룹을 지정하면 된다.
나머지 부분은 손댈 필요가 없다.
로드 밸런서니까 당연히 서브넷 별로 EC2를 지정해 트래픽을 분산해야하지만 이번 예시에는 하나의 EC2만 사용했다.
4. Route 53에서 발급받은 도메인에 ALB 연결
앞서 언급했듯이, Rout53에서 도메인은 미리 발급 받았다고 가정한다.
서브도메인을 만들고 별칭으로 로드밸런서의 ARN을 넣으면 끝난다.
이러면 모든 과정이 끝난다.
테스트를 해보면 아주 잘 설정이 된 것을 확인할 수 있다.
마치며
서두에도 언급했지만 이렇게 구성하면 안된다.
ALB는 public VPC안에 두어도 되는데, EC2는 private VPC 안에 구성해야'만' 한다.
TLS/SSL 인증서를 쓰기 위한 예시를 들기위해서 간편하게 인프라를 구성하기 위해 이렇게 정리했다는 걸 다시 한번 짚고 넘어간다.
사실 HTTPS로 연동되는 API가 필요했던 거여서 그거에 대한 작업은 다음에 수행할 것 같다.
이미 만들어둔걸 트래킹하면서 한거라 빠진게 있을 수도 있다..
'개발 > AWS' 카테고리의 다른 글
Amazon S3 파일 주기적으로 삭제하기 : SpringBoot에서 미리 서명된 URL(pre-signed URL) 써보기 (0) | 2024.03.28 |
---|---|
AWS S3 버킷을 퍼블릭하게 사용하기 : SpringBoot에서 퍼블릭하게 업로드하기 (0) | 2024.03.08 |
AWS Lambda@Edge로 이미지 사이즈 줄이기(webp 변환) (0) | 2024.01.16 |
꼭 읽어줬으면 하는 AWS Lambda@Edge의 특이 사항들 정리 (0) | 2024.01.16 |
Go + serverless framework로 Lambda 관리하기 (0) | 2024.01.12 |
- Total
- Today
- Yesterday
- elasticsearch
- EKS
- lambda
- AWS EC2
- OpenAI
- 람다
- java
- docker
- 티스토리챌린지
- Elastic cloud
- springboot
- AWS
- serverless
- OpenFeign
- ChatGPT
- openAI API
- Kotlin
- cache
- 후쿠오카
- Spring
- AOP
- CloudFront
- terraform
- Log
- 스프링부트
- 오블완
- MySQL
- S3
- GIT
- JWT
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |