본문으로 바로가기

최근 저는 MSA(Micro Service Architecture)를 다루면서 클라우드 서비스를 주로 사용합니다. 클라우드 서비스에는 여러 서비스가 있지만 그 중에서도 처음 다루기 쉬운 것은 바로 AWS(Amazon Web Service)이지 않나 생각합니다.



Why AWS?

클라우드 서비스에는 굉장히 많이 있지만 그 중에서도 제가 사용하려 하는 클라우드 서비스는 IaaS, PaaS입니다. 실제로 제가 결산 포스트에도 올렸 듯이 Slack 메신저를 이용해서 블로그 방문자 수 데이터를 받는 일도 AWS를 이용해서 서비스하고 있습니다. 물론 다른 클라우드 서비스(Google Cloud Platform, Microsoft Azure)들도 존재하지만 처음 가입했을 때 1년 동안 천천히 이런 저런 서비스를 경험해보고 사용할 수 있고, 무엇보다 처음 사용하는 사람이 익숙하는 데 시간을 고려한 것이 AWS 만큼 서비스하는 것도 없다 생각해서 저는 AWS를 선택하였습니다.



API Gateway

API Gateway는 AWS에서 제공하는 서비스 중에 하나로, 자신이 클라우드에서 만든 코드를 사용자가 사용할 수 있도록 URL을 제공해주는 기능입니다. 

그런데, API Gateway를 통해 URL을 제공받으면 다음과 같은 URL을 제공받게 됩니다.


https://qwer1234abcdedf.execute-api.us-east-2.amazon.aws.com/api_name


위 URL은 AWS에서 제공해주는 URL입니다. 하지만 보다시피 URL이 길고 외우기도 쓰기도 매우 복잡한 형태입니다. 그래서 저는 현재 제가 사용하고 있는 도메인으로 이를 바꿔보고자 합니다.


https://awsapis.yourdomain.kr/api_name


위와 같이 도메인을 사용하면 사용자가 직접 사용하는 데도 짧은 URL로 제공되기 때문에 사용하기가 편해집니다. 물론 저도 마찬가지겠지요? 



HTTPS 사용

사용자 도메인을 사용하려는 데, 한 가지 보이는 것이 있습니다. 바로 HTTPS 프로토콜인데요. AWS에서는 HTTP 프로토콜을 권장하지 않고, HTTPS 프로토콜 사용을 권장하기 때문에 먼저 본인이 사용하려는 도메인의 인증서가 필요할 것입니다. 하지만 문제되지 않죠. 우리에게는 Let's Encrypt라는 좋은 것이 있으니깐요. 


Let's Encrypt (무료 SSL 인증서) 설치와 활용


꽤 오래된 글이지만, Let's encrypt에 대해서 잘 모르시갰다면, 위의 버튼을 클릭하여 참고해보세요. 


간단히 요약하자면, 원래 SSL 인증은 CA나 SSL 대행사에서 진행하여 인증서를 발급하고, 인증하는 과정입니다, 그러나 Let's Encrypt는 자체적으로 개발한 ACME(Automated Certificate Management Environment) 프로토콜을 사용하고 있어 도메인 인증, 인증서 발급을 자동화 한 것이죠. 


Let's Encrypt가 아니더라도, AWS Certificate Manager 통해서 인증서를 발급 받는 방법이 있습니다.
만약 AWS Certificate Manager로 인증서를 발급 받고자 하는 경우, 아래의 인증서 생성 과정은 생략하시고, 매니저의 지침을 따르시면 됩니다.



ACME 계정 인증

인증서를 발급받기 위해서는 먼저 ACME 계정이 있어야 합니다. ACME 계정은 SSL/TLS 인증에서 CA의 역할을 맡게 됩니다. 이 CA에는 여러분들의 이메일 주소가 들어가게 됩니다.

$ sudo apt install golang

이 작업을 진행하기 위해서는 Go 언어가 필요합니다. 리눅스의 경우 위 명령어를 사용하여 Go 언어를 설치할 수 있습니다. OS X의 경우, brew 등의 패키지 매니저를 통해 설치하시기를 권장합니다.


$ go get -u https://github.com/google/acme

go 명령어를 이용해서 acme 소스 코드를 가져온 뒤 컴파일합니다. 컴파일 한 뒤의 바이너리 파일은 ~/go/bin 에 존재하게 됩니다.


$ acme reg -gen -accept mailto:[email protected]

먼저 ACME 계정을 생성해봅니다. 자신의 유효한 이메일 주소를 넣어주면 됩니다.


그러면 여러분들의 이메일 주소로 만들어진 CA가 여기에 생성이 됩니다.



인증 개인키 생성 및 도메인 인증

SSL 인증은 공개키 암호화 기법을 사용하고 있기 때문에 암호화 통신에서 복호화를 담당할 개인키가 필요합니다. 


$ openssl genrsa -out awsapis.yourdomain.kr.key 2048

openssl 명령어를 이용해서 키를 생성해줍니다.

자 이제 키를 생성했으면 도메인과 연동하는 작업을 거쳐야겠죠?


$ acme cert -k awsapis.yourdomain.kr.key -dns=true awsapis.yourdomain.kr

방금 생성한 키와 연동할 도메인을 입력해줍니다. 그러면 아래와 같은 화면이 뜰 것입니다.


Add a TXT record for _acme-challenge.awsapis.yourdomain.kr with the value "Ab$c#[email protected]@[email protected]" and press enter after it has propagated.

그럼 설정하고자 하는 도메인 업체를 통해서 TXT record 값을 설정해주시고, enter를 누르시면 됩니다. 


cert url: https://acme-v01.api.yourdomain.kr/yourCode

마지막으로 도메인 제공 업체에 위 value 값을 넣어주시면 됩니다.



인증서 가져오기

이제 개인키에 내 도메인을 입력했으니 남은 것은 AWS와 연동하는 것이죠? 먼저 처음은 AWS 인증 관리자를 통해 인증서를 가져오도록 합니다.


Region을 us-east(미국, 버지니아 북부)로 한 다음, AWS Ceritificate Manager를 열고, 인증서 가져오기 버튼을 클릭하여 Let's encrypt로 생성한 인증서를 가져오도록 합니다.


항목에 해당하는 값을 입력한 후, 검토 및 가져오기를 클릭합니다.


개인키는 백업하라는 메시지와 함께 인증서 유효기간과 알고리즘 등을 확인합니다.

Import를 클릭하면, AWS CloudFront에 가져온 인증서가 추가됩니다.



사용자 지정 도메인 이름 추가

이제 인증서도 가져왔으니, 마지막으로 API Gateway에 내 도메인을 추가해보도록 하죠. API Gateway에서 사용자 지정 도메인 이름 생성 버튼을 클릭해줍니다.


도메인 이름을 넣고, ACM 인증서에 여러분들이 아까 등록했던 인증서가 표시될 것입니다. 해당 인증서를 누르고 저장을 클릭합니다.

CloudFront로 여러분들의 도메인이 생성될 것입니다. 약 1시간 정도 소요됩니다.


생성된 CloudFront 도메인을 CNAME 레코드에 입력하면, 이제 여러분들의 REST API가 여러분들의 도메인으로 설정됩니다.



마치며...

처음 적어보는 AWS 포스팅입니다. 기본적인 SSL 통신 개념이 많이 포함되어 있다보니 처음 접하시는 분들은 아마 내용 이해가 어려울 수도 있습니다. 클라우드 서비스는 기본적으로 서버 구축에 대한 지식이나 튜닝 등의 기술이 없이도 개발자들이 쉽게 개발에만 집중하고, 배포하는 데 어려움을 겪지 않도록 하는 서비스들이 많이 있습니다. 하지만 이렇게 여러분들의 서비스로 만들고자 하는 경우에는 이러한 여러 개념들이 숙지되어 있어야 합니다.


특히 REST API는 요즘 각광 받는 기술 중에 하나로, 마이크로 서비스 아키텍처 뿐만 아니라 SPA(Single Page Application)에서도 많이 사용되기 때문에 알아두시면 매우 좋습니다.


P.S: 클라우드 관련 포스팅을 하는 데 있어 여러가지 고민이 있었습니다. 특히 AWS같은 클라우드 서비스는 요금 과다 문제도 있고, 여러가지 보안 이슈도 있다보니 글을 쓰는 데 매우 여러 번 검토하고 있습니다. 제 중요한 개인 정보가 털려서는 안되니깐요. 여러분들도 클라우드를 사용하실 때 이 부분 반드시 신중히 검토하시고 사용하시기 바랍니다.


comments powered by Disqus

티스토리 툴바