AWS Amplify์์ Next.js SSR ์ฑ์ด ๊นจ์ง๋ ์ด์ (๊ทธ๋ฆฌ๊ณ ๋ฐํ์ ํ๊ฒฝ ๋ณ์ ํด๊ฒฐ๋ฒ)
Next.js App Router + SSR ์ฑ์ Vercel์์ AWS Amplify๋ก ์ด์ ํ ๋, ๊ฒ์ผ๋ก ๋ณด๊ธฐ์๋ ๋ชจ๋ ๊ฒ ์ ์์ฒ๋ผ ๋ณด์ผ ์ ์์ต๋๋ค.
- ๋น๋๋ ์ฑ๊ณตํ๊ณ
- ํ๊ฒฝ ๋ณ์๋ ์ค์ ๋์ด ์๊ณ
- IAM ๊ถํ๋ ๋ค ๋ง์ถฐ๋จ๋๋ฐ
๋ง์ ๋ฐฐํฌํ๊ณ ๋๋ฉด ์ฑ์ด ๋ฐํ์์์ 500 ์๋ฌ์ ํจ๊ป ์ฃฝ์ต๋๋ค.
๋ก๊ทธ๋ฅผ ๋ณด๋ฉด ํญ์ ๊ฐ์ ๋ฉ์์ง์ฃ .
โํ๊ฒฝ ๋ณ์๊ฐ ์์ต๋๋คโ
์ ๋ Cognito + API Gateway + Lambda + RDS๋ฅผ ์ฌ์ฉํ๋ ์ค์ ํ๋ก๋์ ์ฑ์ ์ฎ๊ธฐ๋ฉด์ ์ด ๋ฌธ์ ๋ฅผ ๊ทธ๋๋ก ๊ฒช์์ต๋๋ค.
์ด ๊ธ์์๋:
- ์ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง
- Amplify์์ ์ค์ ๋ก ๋์ํ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ฌด์์ธ์ง
๋ฅผ ์ ๋ฆฌํฉ๋๋ค.
๊ทผ๋ณธ ์์ธ: Amplify์ ๋น๋ ํ์ vs ๋ฐํ์ ํ๊ฒฝ ๋ณ์ ์ฐจ์ด
AWS Amplify Web Compute(SSR) ์์ ํ๊ฒฝ ๋ณ์๋ Vercel๊ณผ ๋์ ๋ฐฉ์์ด ๋ค๋ฆ ๋๋ค.
Vercel์์๋ ์ ๋๋ ์ด์
Vercel์์๋ ํ๊ฒฝ ๋ณ์๊ฐ:
- ๋น๋ ํ์
- ๋ฐํ์ (SSR, route handler, server component)
๋ชจ๋์์ ์๋์ผ๋ก ์ฃผ์ ๋ฉ๋๋ค.
๊ทธ๋์ ์ด๋์๋ :
process.env.MY_VAR
๊ฐ โ๊ทธ๋ฅโ ์ ๋์ํฉ๋๋ค.
Amplify์์๋ ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๊น?
Amplify๋ ๋ค๋ฆ ๋๋ค.
- ๋น๋ ํ์์๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฃผ์ ํด ์ค๋๋ค
- ํ์ง๋ง SSR ๋ฐํ์(Compute ํ๊ฒฝ) ์๋ ์๋์ผ๋ก ์ ๋ฌ๋์ง ์์ต๋๋ค
๊ฒฐ๊ณผ์ ์ผ๋ก:
- โ ๋น๋๋ ์ฑ๊ณต
- โ SSR ๋ฐํ์์์ ํฌ๋์
- โ route handler์์
process.env.MY_VAR === undefined
์ด ํ์์ ๋ฒ๊ทธ๊ฐ ์๋๋ผ ์ค๊ณ๋ ๋์์ ๋๋ค.
AWS ๋ฌธ์์๋ ๋์ค์ง๋ง, Vercel์ ์ต์ํ๋ฉด ๊ฑฐ์ 100% ๋์น๊ฒ ๋๋ ํฌ์ธํธ์ ๋๋ค.
ํํ ๋ณด์ด๋ ์ฆ์๋ค
๋๋ถ๋ถ ์๋์ ๊ฐ์ด ๋ํ๋ฉ๋๋ค.
-
๋ชจ๋ ํ์ด์ง์์
500์๋ฌ -
๋ก๊ทธ์:
- ํ๊ฒฝ ๋ณ์๊ฐ ํ๊บผ๋ฒ์ ์ ๋ถ ์์
- ๋๋ AWS SDK ํธ์ถ ์
CredentialsProviderError
-
๋ก์ปฌ๊ณผ Vercel์์๋ ์ ์
-
Amplify์์๋ง ์คํจ
์ ๋๋ก ๋์ํ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ
1๏ธโฃ ๋น๋ฐ ๊ฐ์ AWS Secrets Manager๋ก ์ด๋
Cognito client secret ๊ฐ์ ๋ฏผ๊ฐํ ๊ฐ์:
- AWS Secrets Manager์ ์ ์ฅ
- Amplify์ Compute role์ ์๋ ๊ถํ ๋ถ์ฌ:
secretsmanager:GetSecretValue
์ด๋ ๊ฒ ํ๋ฉด ๋ฐํ์ ํ๊ฒฝ ๋ณ์ ์ฃผ์ ์ ์์กดํ์ง ์์๋ ๋ฉ๋๋ค.
2๏ธโฃ ๋ฐํ์ ํ๊ฒฝ ๋ณ์๋ฅผ ๋น๋ ์์ ์ ๊ตฝ๊ธฐ(bake)
API URL, redirect URI ๊ฐ์ ๋น๋ฐ์ด ์๋ ๊ฐ์ Amplify ๊ถ์ฅ ๋ฐฉ์์ด ๋ฐ๋ก ์์ต๋๋ค.
๐ ๋น๋ ์ค์ .env.production ํ์ผ์ ์ง์ ์์ฑํ๋ ๋ฐฉ์์
๋๋ค.
amplify.yml ์์:
build:
commands:
- env | grep '^COGNITO_' >> .env.production
- env | grep '^REPORTS_API_BASE_URL' >> .env.production
- pnpm build
์ด๋ ๊ฒ ํ๋ฉด:
- Amplify์ ๋น๋ ํ๊ฒฝ
- Next.js SSR ๋ฐํ์ ๊ธฐ๋์น
์ฌ์ด์ ๊ฐ๊ทน์ ๋ฉ์ธ ์ ์์ต๋๋ค.
3๏ธโฃ ์๋ฒ ์ฌ์ด๋ ์ค์ ์ฝ๋ ์ ๊ฒ (์ค์)
Secrets Manager๋ก ์ฎ๊ธด ๋ค์๋
์๋ฒ ์ฝ๋์์ NEXT_PUBLIC_*๋ฅผ ์ฐธ์กฐํ๋ฉด ์ ๋ฉ๋๋ค.
โ Amplify์์ ๊นจ์ง๋ ํจํด:
process.env.NEXT_PUBLIC_SOMETHING
โ ์ฌ๋ฐ๋ฅธ ํจํด:
process.env.SOMETHING
์ ๋ฆฌํ๋ฉด:
-
NEXT_PUBLIC_*โ ๋ธ๋ผ์ฐ์ / ํด๋ผ์ด์ธํธ ์ ์ฉ -
์๋ฒ์์๋:
- ๋น๋ฐ ๊ฐ โ Secrets Manager
- ์ผ๋ฐ ๊ฐ โ
.env.production์ผ๋ก ์ฃผ์ ๋ env
์ Amplify์์๋ง ๊นจ์ง๊น?
-
Vercel์ SSR ๋ฐํ์์ env vars๋ฅผ ์๋ ์ฃผ์
-
Amplify๋:
- ๋น๋ ํ๊ฒฝ
- ์ปดํจํธ ๋ฐํ์
์ ๋ช ํํ ๋ถ๋ฆฌํจ
- Next.js๋ ๋ฐํ์ env๊ฐ ์๋ค๊ณ ๊ฐ์
- Amplify์์๋ ๊ทธ ์ฐ๊ฒฐ์ ์ง์ ๋ง๋ค์ด์ค์ผ ํจ
์ด๊ฑธ ์๊ณ ๋๋ฉด, ํด๊ฒฐ ์์ฒด๋ ์ด๋ ต์ง ์์ต๋๋ค.
TL;DR
Amplify์์ Next.js SSR ์ฑ์ด ๊นจ์ง๋ค๋ฉด:
- ๋น๋ฐ ๊ฐ โ AWS Secrets Manager
- ๋ฐํ์ env โ ๋น๋ ์ค
.env.production์ ๊ธฐ๋ก - ์๋ฒ ์ฝ๋์์
NEXT_PUBLIC_*์ฌ์ฉ ๊ธ์ง - Logging role ๋ง๊ณ Compute role ๊ถํ ํ์ธ
์ด๋ ๊ฒ ํ๋ฉด Amplify SSR๋ ์์ ์ ์ผ๋ก ๋์ํฉ๋๋ค.
์๋๋ ์๋ฏธ๋ฅผ ์ ํํ ์ ์งํ ํ๊ธ ๋ฒ์ญ์ด์ผ. ๊ฒฝ๊ณ ์ฑ์ ์ด๋ฆฌ๊ณ , ๊ธฐ์ ๋ฌธ์ ํค์ผ๋ก ์ ๋ฆฌํ์ด.
IAM Role ๊ด๋ จ ์ฃผ์์ฌํญ (๋์น๊ธฐ ์ฌ์ด ํฌ์ธํธ)
AWS Amplify๋ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ IAM Role์ ์ฌ์ฉํ๋ฉฐ, ์ด ๋์ ํผ๋ํ๋ฉด SSR ์ฑ์ด ์กฐ์ฉํ(silent) ๊นจ์ง ์ ์์ต๋๋ค.
-
Service role
- Amplify ์์ฒด๊ฐ ์ฌ์ฉํ๋ ์ญํ
- ๋น๋, ๋ฐฐํฌ, ๋ก๊ทธ ์์ง ์ฉ๋
- ์ฑ ์๋ฒ ์ฝ๋์๋ ์ฌ์ฉ๋์ง ์์
-
Compute role
- Next.js SSR ๋ฐํ์์์ ์๋ฒ ์ฝ๋๊ฐ ์คํ๋ ๋ Assume ๋๋ ์ญํ
๋ฐํ์์์ AWS ์๋น์ค(์: Secrets Manager)์ ์ ๊ทผํ๋ ค๋ฉด ๋ฐ๋์ Compute role์ ์ฑ์ ์ง์ ํด์ผ ํฉ๋๋ค.
์ด๋ฅผ ์ค์ ํ์ง ์์ผ๋ฉด:
- SSR ๋ฐํ์์๋ AWS ์๊ฒฉ ์ฆ๋ช ์ด ์ ํ ์๊ณ
- ๊ทธ ๊ฒฐ๊ณผ
CredentialsProviderError๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
Compute role์๋ ์๋ฒ ์ฝ๋์ ์ค์ ๋ก ํ์ํ ์ต์ ๊ถํ๋ง ๋ถ์ฌํด์ผ ํฉ๋๋ค
(์: secretsmanager:GetSecretValue).
์ด ์ญํ ์ ๋ก๊ทธ/๋น๋์ฉ Service role๊ณผ ์์ ํ ๋ณ๊ฐ์ด๋ฉฐ, Amplify ์ฝ์์์ ๋ช ์์ ์ผ๋ก ์ค์ ํด์ผ๋ง ์ ์ฉ๋ฉ๋๋ค.