[AWS] Cloudfront: Function
Cloudfront Function์ Cloudfront์์ ์์ฒญ์ด๋ ์๋ต์ ๊ฐ๋ก์ฑ์ ์กฐ์ํ ์ ์๋ ์ฃ์ง ์์ค ๋ถ๊ฐ๊ธฐ๋ฅ์ด๋ค.
Lambda Edge์๋ ๋น์ทํ ๋๋์ผ๋ก ๋์ํ๋, ์กฐ๊ธ ๋ค๋ฅด๋ค.
**Lambda Edge **
-
Lambda Edge๋ ์ด๋ฏธ์ง ์ต์ ํ ๊ฐ์ ์๋นํ ๋ฌด๊ฑฐ์ด ์ฐ์ฐ์ ํฌํจํ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ ์ ํฉํ๋ค.
-
์๋ต์ด๋ ์์ฒญ ๋ฑ ๋ค์ํ ์์ ์ ํธ๋ฆฌ๊ฑฐ๊ฐ ๊ฐ๋ฅํ๊ณ , ํ์ฅ์ฑ์ด ๋ฐ์ด๋๋ค.
-
๊ทธ๋์ ๋ฌด๊ฒ๊ณ ๋น์ผ ํธ์ด๋ค.
Cloudfront Function
-
Function์ ๊ฐ๋จํ HTTP ์๋ต ํค๋ ์กฐ์์ด๋ ๋ฆฌ๋๋ ์ ๊ฐ์ ๋งค์ฐ ๊ฐ๋ฒผ์ด ์กฐ์์ ์ ํฉํ๋ค.
-
๋งค์ฐ ์์ ์ฝ๋๋ง ์ฌ๋ฆด ์ ์๊ณ , ์ ํ์ ์ธ ๋์ ์ ๋น ๋ฅด๊ณ , ํจ์ฌ ๋ง์ ์ฃ์ง์ ๋ฐฐํฌ๋์ด ๋ฌผ๋ฆฌ์ ์ผ๋ก๋ ๋น ๋ฅด๋ค. 1๋ฐ๋ฆฌ์ด ๋ฏธ๋ง์ ์คํ์๊ฐ์ ๋ณด์ฅํ๋ค.
-
๋น์ฉ์ด ์ ๋ ดํ๋ค.
์๋๋ ์ฐจ์ด์ ์ ๋น๊ตํ ๋ํ๋ค.
๋น์ฉ
https://aws.amazon.com/ko/cloudfront/pricing/
๋น์ฉ์ ์ ๋ ดํ ํธ์ด๋ค. ๋จ์ํ ํ์๋ก๋ง ๋น์ฉ์ ๋ถ๊ณผํ๋ค.
100๋ง๊ฑด๋น 0.1 ๋ฌ๋ฌ๋ฅผ ๋ฏ๋๋ค.
์์ : ๋ค๊ตญ์ด ์ฒ๋ฆฌํ๊ธฐ
Cloudfront ํค๋์ Function ๊ธฐ๋ฐ์ ๋ฆฌ๋๋ ์
์ ์์ฉํด์ ๋ค๊ตญ์ด ๋ผ์ฐํ
์ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ด๊ฒ ๋ค.
์ฌ๊ธฐ์๋ ๋ทฐ์ด ์์ฒญ ํธ๋ฆฌ๊ฑฐ๋ง์ ์์ฉํด์ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค. ๊ตณ์ด ์ค๋ฆฌ์ง ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ธฐ ์ ์๋ URI๋ ๊ตญ๊ฐ ์ ๋ณด๋ ๋ค ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ค๋ฆฌ์ง์์ ๋ฐํ๋ ์๋ต ํค๋๊ฐ์๊ฑธ ์กฐ์ํ ์ผ์ด ์๋ค๋ฉด ๋ทฐ์ด ์์ฒญ ํธ๋ฆฌ๊ฑฐ๋ง์ผ๋ก ์ถฉ๋ถํ๋ค.
1. ํจ์ ๋ง๋ค๊ธฐ
๋จผ์ Cloudfront ์ฝ์๋ก ์ด๋ํด์
Function ํญ์ ์ง์
์์ฑ์ฐฝ์ผ๋ก ๋ค์ด๊ฐ๋ค.
์ด๋ฆ ์ ๋นํ ์ง๊ณ ๋ง๋ค๋ฉด ๋๋ค.
์ด๋ ๊ฒ ๋จ๋ฉด ๋ ๊ฒ์ด๋ค.
2. ํจ์ ์ฝ๋ ์์ฑํ๊ธฐ
Function ์ฝ์์ ๋ค์ด๊ฐ๋ฉด AWS Lambda ์ฒ๋ผ ์์ฒด์ ์ธ ์๋ํฐ๋ฅผ ๋ฐ๋ก ์ ๊ณตํ๋ค. ๊ทธ๋ฆฌ ํธํ์ง ์์ง๋ง
๊ฐ๋ฐ, ๋ผ์ด๋ธ 2๊ฐ์ ์คํ
์ด์ง๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ค.
๋จผ์ ๊ฐ๋ฐ ์ฝ๋์๋ค๊ฐ ์๋ ์ฝ๋๋ฅผ ์ง์ด๋ฃ์.
function handler(event) {
const request = event.request;
const supported_countries = ["de", "it", "fr", "kr"];
if (request.uri.substr(3, 1) != "/") {
const headers = request.headers;
let newUri;
const country = headers["cloudfront-viewer-country"];
if (country) {
const countryCode = country.value.toLowerCase();
if (supported_countries.includes(countryCode)) {
newUri = "/" + countryCode + request.uri;
}
}
if (newUri === undefined) {
const defaultCountryCode = "en";
newUri = "/" + defaultCountryCode + request.uri;
}
const response = {
statusCode: 302,
statusDescription: "Found",
headers: {
location: { value: newUri },
},
};
return response;
}
return request;
}
๋ก์ง์ ๊ทธ๋ฆฌ ๋ณต์กํ์ง ์๋ค.
- ์ด๋ฏธ ๋ค๊ตญ์ด ๋ผ์ฐํ ์ด ๋ /de... ๊ฐ์ ๊ฒฝ๋ก๋ผ๋ฉด request.uri.substr(3, 1) != "/"์ ๊ฑธ๋ ค์ ๋ฆฌ๋๋ ์ ์์ด ๊ทธ๋๋ก ๋ฐํํ๋ค. ์๋๋ผ๋ฉด ๋ค๊ตญ์ด ๋ผ์ฐํ ์๋ํ๋ค.
- Cloudfront์์ ์์ฒด์ ์ผ๋ก ๊ตญ๊ฐ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด ๋ฐ๋ cloudfront-viewer-country๋ผ๋ ํค๋๋ฅผ ๊ฐ์ ธ๋ค๊ฐ, ๊ตญ๊ฐ๋ฅผ ๊ตฌ๋ถํ๋ค. ๊ตญ๊ฐ์ฝ๋๋ ISO ํ์ค์ ๊ธฐ๋ฐํ๋ค.
- ๊ตญ๊ฐ์ฝ๋๊ฐ ์๊ฑฐ๋ ๋ชจ๋ฅด๋๊ฑฐ๋ฉด ์์ด /en๋ก ๋ผ์ฐํ ํ๋ค.
- ๊ทธ๋ ๊ฒ ํด์ ๋ ์ผ, ์ดํ๋ฆฌ, ๋ถ๋์, ํ๊ตญ์ด ๋ค์ด์ค๋ฉด /kr/, /de/, ... ๊ฐ์ ๊ฒฝ๋ก๋ก ๋ฆฌ๋๋ ์ ํ๋๋ก ๊ตฌ์ฑํ ๊ฒ์ด๋ค. (location ํค๋ ํ์ฉ)
์ฌ๊ธฐ์๋ location์ผ๋ก ๋ ๋๊ฒจ์ uri๊น์ง ๋ณ๊ฒฝ๋๊ฒ ํ๋ ๋ฐฉ๋ฒ์ ์ทจํ์ง๋ง, request.uri๋ฅผ ๋ณ๊ฒฝํด์ ๋ฐํํ๋ ๋ฐฉ๋ฒ๋ ์๋ค. ๊ทธ๋ฌ๋ฉด ๋ฆฌ๋๋ ์ ์์ด S3 ์ค๋ฆฌ์ง๋ง ๋ฐ๋ ์ฑ ๋์ผํ uri๋ก ๊ฐ์ ธ์ฌ ์๋ ์์ ๊ฒ์ด๋ค.
์๋ฌดํผ ์ ๋ ๊ฒ ๋ฃ์ด์ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฅํ๊ณ , ํ ์คํธ ๊ธฐ๋ฅ์ ํ์ฉํด์ ์ ๋์ํ๋์ง ํ์ธํด๋ณด์.

๋์ถฉ ์๋ฌด๊ฒ๋ ์๋ฃ์์๋๋ /en๋ก ๋์ ธ์ฃผ๋ ๊ฒ์ ๋ณผ ์ ์๊ณ
๋ฃ์ด์ ์๋ฉด ๋ฃ์๋๋ก ๋์ฌ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฒ์ ๋ฒํผ์ ๋๋ฌ์ ๋ผ์ด๋ธ๋ก ๋ฐฐํฌํ๋ฉด ๋์ด๋ค.


3. ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ฑํ๊ธฐ (S3, Cloudfront)
์ผ๋จ Function์ ๋ณด์กฐ์ ์ธ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ถ๊ณผํ๊ณ , ํ์ธ์ ์ํด์๋ ํ ์คํธ์ ์ ์ธํ ํด์ผ ํ๋ค.
๋จผ์ ๋ค๊ตญ์ด์ ํด๋นํ๋ index.html ํ์ผ๋ค์ s3 ๋ฒํท์ ์ฌ๋ ค๋๋ค.

์ด์ ๋๋ก
Cloudfront ์บ์์ค์ ๋ ์ข ๋ฐ๊ฟ์ค์ผ ํ๋ค.
cloudfront-viewer-country๋ผ๋ ํน์ ํค๋๋ฅผ Cloudfront๊ฐ ์ค๋ฆฌ์ง์ ์ ๋ฌํด์ค์ผ ๊ทธ๊ฑธ Function์ด ๋ฐ์์ ์ฒ๋ฆฌํ ์ ์๋๊ฑด๋ฐ, ๊ธฐ๋ณธ ์บ์ ์ค์ ์ ํค๋๋ฅผ ์ ๋ถ ์น๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทผ๋ฐ ์์ฑํ์ผ๋ก ์ ๊ณตํด์ฃผ๋ ์ ์ฑ ์ค์ cors ์ค์ ๊ณผ cloudfront ํค๋ ์ค์ ์ด ๋์์ ๋ค์ด์๋๊ฒ ์์ด์ ๋ ์ง์ ๋ง๋ค์ด์ผ ํ๋ค. ์ง์ฆ์ด ๋๋ค.
์ ์ฑ
> ์๋ณธ ์์ฒญ์ผ๋ก ์ด๋
์ ์ฑ
์ ์ด๋ ๊ฒ ์ ๋นํ ๋ง๋ค์ด์ค๋ค.
๋น์ฅ ํ์ํ Cloudfront Viewer Country ํค๋์ S3 ์ ๊ทผ์ ํ์ํ CORS ์ ์ฉ ํค๋๋ค. ํค๋๋ฅผ ์๋ฌด๊ฒ๋ ๋๊ธฐ์ง ์์ ๋๋ CORS๊ฐ ๋ฐ์ํ์ง ์์์ ๊ด์ฐฎ์๋ฐ, ์ปค์คํ
ํค๋๋ฅผ ๋ณด๋ด๊ธฐ ์์ํ๋ฉด ์ด๋ ๊ฒ ๋ผ์์ค์ผ ํ๋๋ผ.
"๋์"์ ํธ์ง์ฐฝ์ผ๋ก ์ด๋ํด์

๋ฐฉ๊ธ ๋ง๋ ์์ฒญ ์ ์ฑ ์ ๋ผ์์ฃผ๊ณ

ํจ์๋ ๋ทฐ์ด ์์ฒญ์๋ค๊ฐ ๋ฃ์ด์ค๋ค.

์ด๋ฌ๋ฉด ์ธํ ์ด ๋ค ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ํ๊ตญ์์ ์ ๊ทผํ ๋๋

ํ๊ตญ์ด ๋ฒ์ ์ผ๋ก ๋ผ์ฐํ
๋ ๊ฒ์ด๊ณ
๋ฏธ๊ตญ์์ ์ ๊ทผํ๋ฉด
์์ด
๋ถ๋์์์ ์ ๊ทผํ๋ฉด
๋ถ์ด ๋ฒ์ ์ผ๋ก ๋ ๊ฒ์ด๋ค.
์ด๋ฐ ๋๋์ผ๋ก ์ฌ์ฉํ๋ฉด ๋๋ค.
์ฐธ์กฐ
https://aws.amazon.com/ko/blogs/aws/introducing-cloudfront-functions-run-your-code-at-the-edge-with-low-latency-at-any-scale/
https://stackoverflow.com/questions/48633610/how-do-i-get-cloudfront-viewer-country-to-appear-in-response-headers