API Gateway์ ๋๋ฉ์ธ์ ๋ด ๋๋ฉ์ธ์ผ๋ก ์ค์ ํ๊ธฐ
์ต๊ทผ ์ ๋ 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 ์ธ์ฆ์ CA๋ SSL ๋ํ์ฌ์์ ์งํํ์ฌ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๊ณ , ์ธ์ฆํ๋ ๊ณผ์ ์ ๋๋ค, ๊ทธ๋ฌ๋ Let's Encrypt๋ ์์ฒด์ ์ผ๋ก ๊ฐ๋ฐํ ACME(Automated Certificate Management Environment) ํ๋กํ ์ฝ์ ์ฌ์ฉํ๊ณ ์์ด ๋๋ฉ์ธ ์ธ์ฆ, ์ธ์ฆ์ ๋ฐ๊ธ์ ์๋ํ ํ ๊ฒ์ด์ฃ .
๋ง์ฝ 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:yourid@youremail.com
๋จผ์ 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#de@f@ghijKl!@mnoPqrstuVwxyZ" 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๊ฐ์ ํด๋ผ์ฐ๋ ์๋น์ค๋ ์๊ธ ๊ณผ๋ค ๋ฌธ์ ๋ ์๊ณ , ์ฌ๋ฌ๊ฐ์ง ๋ณด์ ์ด์๋ ์๋ค๋ณด๋ ๊ธ์ ์ฐ๋ ๋ฐ ๋งค์ฐ ์ฌ๋ฌ ๋ฒ ๊ฒํ ํ๊ณ ์์ต๋๋ค. ์ ์ค์ํ ๊ฐ์ธ ์ ๋ณด๊ฐ ํธ๋ ค์๋ ์๋๋๊น์. ์ฌ๋ฌ๋ถ๋ค๋ ํด๋ผ์ฐ๋๋ฅผ ์ฌ์ฉํ์ค ๋ ์ด ๋ถ๋ถ ๋ฐ๋์ ์ ์คํ ๊ฒํ ํ์๊ณ ์ฌ์ฉํ์๊ธฐ ๋ฐ๋๋๋ค.
'Cloud Platform > AWS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Serverless framework๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ฝ๊ฒ ์๋ฒ ๋ฐฐํฌํ๊ธฐ (0) | 2018.05.30 |
---|---|
Serverless ์์ํด๋ณด๊ธฐ (0) | 2018.04.23 |