ALPACO ํ๋ก์ ํธ: Terraform ์ธํ๋ผ ์ฌ์ฉ ๊ฐ์ด๋
์ด ๋ฌธ์๋ Terraform์ ์ฌ์ฉํ์ฌ ALPACO ํ๋ก์ ํธ์ AWS ์ธํ๋ผ๋ฅผ ์ดํดํ๊ณ , ๋ฐฐํฌํ๋ฉฐ, ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋์ ๋๋ค.
1. ์๋ก
ALPACO ํ๋ก์ ํธ๋ AWS ํด๋ผ์ฐ๋ ์ธํ๋ผ๋ฅผ ์ฝ๋ํ๋๊ณ , ๋ฐ๋ณต ๊ฐ๋ฅํ๋ฉฐ, ๋ฒ์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ์ ์ํ๊ณ ํ๋ก๋น์ ๋ํ๊ธฐ ์ํด Terraform์ ํ์ฉํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ํ๊ฒฝ ์ ๋ฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ณ ๋ณต์กํ ํด๋ผ์ฐ๋ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ๋จ์ํํฉ๋๋ค.
์ด ๊ฐ์ด๋์์๋ ๋ค์ ๋ด์ฉ์ ๋ค๋ฃน๋๋ค:
- ์ฌ์ฉ๋ ํต์ฌ ๊ธฐ์ ๋ฐ ์์น.
- Terraform ์ฝ๋์ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ.
- ๋ฐฐํฌ๋ฅผ ์ํ ์ฌ์ ์ค๋น ์ฌํญ.
- ๊ฐ ์ธํ๋ผ ๋ชจ๋์ ๋ํ ๋จ๊ณ๋ณ ๋ฐฐํฌ ์ง์นจ.
- CI/CD ํตํฉ ๊ณ ๋ ค ์ฌํญ.
- ์ํฌ๋ฆฟ(๋ฏผ๊ฐ ์ ๋ณด) ๊ด๋ฆฌ.
2. ํต์ฌ ๊ธฐ์ ๋ฐ ์์น
- Terraform: ์ฃผ์ IaC(Infrastructure as Code) ๋๊ตฌ์
๋๋ค.
- ๋ชจ๋์ฑ(Modularity): ์ธํ๋ผ๋ ๋
ผ๋ฆฌ์ ๋ชจ๋(์:
app,api,cognito,chatbot)๋ก ๋ถํ ๋ฉ๋๋ค. - ์๊ฒฉ ์ํ(Remote State): Terraform ์ํ๋ ํ์
๊ณผ ์์ ์ ์ํด S3 ๋ฒํท์ ์ ์ฅ๋๊ณ DynamoDB ํ
์ด๋ธ์ ์ฌ์ฉํ์ฌ ์ ๊น๋๋ค. ์ด S3 ๋ฒํท๊ณผ DynamoDB ํ
์ด๋ธ์
backend-setup๋ชจ๋์ ์ํด ์์ฑ๋ฉ๋๋ค. - ๋ณ์(Variables): ๋ค์ํ ํ๊ฒฝ์ด๋ ์ค์ ์ ๋ํ ๊ตฌ์ฑ ๋งค๊ฐ๋ณ์ํ.
- ์ถ๋ ฅ(Outputs): ๋ค๋ฅธ ๋ชจ๋์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ฑ์์ ์ฌ์ฉํ ์ ์๋๋ก ์ค์ํ ๋ฆฌ์์ค ์๋ณ์ ๋ ธ์ถ.
- ๋ชจ๋์ฑ(Modularity): ์ธํ๋ผ๋ ๋
ผ๋ฆฌ์ ๋ชจ๋(์:
- ํ์ฉ๋ AWS ์๋น์ค:
- S3: Terraform ์ํ ์ ์ฅ, ํ๋ก ํธ์๋ ์ ์ ์์ฐ ํธ์คํ .
- DynamoDB: Terraform ์ํ ์ ๊ธ, ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ ์ ์ฅ (์ปค๋ฎค๋ํฐ ๊ฒ์๋ฌผ, ๋ฌธ์ , ์ ์ถ ๊ธฐ๋ก ๋ฑ).
- Cognito: ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ.
- API Gateway: ๋ฐฑ์๋ ์๋น์ค๋ฅผ ์ํ RESTful API ๋ ธ์ถ.
- Lambda: ๋ฐฑ์๋ ๋ก์ง์ ์ํ ์๋ฒ๋ฆฌ์ค ์ปดํจํ (์ปค๋ฎค๋ํฐ API, ๋ฌธ์ API, ์ฝ๋ ์คํ, ์ฑ๋ด, ๋ฌธ์ ์์ฑ).
- Lambda Layers: Lambda ํจ์๋ฅผ ์ํ ๊ณต์ Node.js ์์กด์ฑ ๊ด๋ฆฌ.
- CloudFront:
- ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ CDN(Content Delivery Network).
- ์ฑ๋ด ๋ฐ ๋ฌธ์ ์์ฑ๊ธฐ์ ๊ฐ์ ์๋น์ค๋ฅผ ์ํด OAC(Origin Access Control)๋ฅผ ํตํด Lambda ํจ์ URL์ ์์ ํ๊ฒ ๋ ธ์ถ.
- IAM: ์์ ํ ์ ๊ทผ ์ ์ด๋ฅผ ์ํ ์ญํ , ์ ์ฑ , ๊ถํ.
- Route 53: ์ฌ์ฉ์ ์ง์ ๋๋ฉ์ธ์ ์ํ DNS ๊ด๋ฆฌ (
app๋ชจ๋์์ ์ฌ์ฉ). - ACM (AWS Certificate Manager): ์ฌ์ฉ์ ์ง์ ๋๋ฉ์ธ์ ์ํ SSL/TLS ์ธ์ฆ์ (
app๋ชจ๋์์ ์ฌ์ฉ, CloudFront์ฉ ์ธ์ฆ์๋us-east-1๋ฆฌ์ ์ ์์ฑ). - CloudWatch Logs: Lambda, API Gateway ๋ฑ์ ๋ก๊ทธ ์ ์ฅ.
- Lambda ๋ฐํ์:
- Node.js (์ปค๋ฎค๋ํฐ API, ์ฑ๋ด, ๋ฌธ์ ์์ฑ๊ธฐ v3, ๋ฌธ์ API, ์ ์ถ API์ฉ)
- Python (์ฝ๋ ์คํ ์๋น์ค์ฉ)
- Lambda Layer ์์กด์ฑ ๊ด๋ฆฌ:
nodejsํ์ ๋๋ ํ ๋ฆฌ์ ์ง์ npm install(์:infrastructure/api/layers/common-deps/nodejs).- ๋ ๋ณต์กํ ๋ ์ด์ด์ ๊ฒฝ์ฐ Docker ๊ธฐ๋ฐ ๋น๋ ์ฌ์ฉ,
nodejs๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ก ์ถ๋ ฅ (์:infrastructure/problem-generator-v3/layers/).
- CI/CD: ์๋ํ๋ ํ
์คํธ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ํด GitHub Actions๊ฐ ๊ณํ/์ฌ์ฉ๋ฉ๋๋ค (์ธ๋ถ ์ฌํญ์ ๋ชจ๋๋ณ README ๋๋
PLAN.md์ฐธ์กฐ).
3. ์ฌ์ ์ค๋น ์ฌํญ
์์ํ๊ธฐ ์ ์ ๋ค์ ์ฌํญ์ด ์ค์น ๋ฐ ๊ตฌ์ฑ๋์ด ์๋์ง ํ์ธํ์ญ์์ค:
-
AWS CLI: ์ ์ ํ ์๊ฒฉ ์ฆ๋ช ๋ฐ ๊ธฐ๋ณธ ๋ฆฌ์ ์ผ๋ก ๊ตฌ์ฑ๋์ด์ผ ํฉ๋๋ค.
aws configure - Terraform: ์ต์ ์์ ๋ฒ์ (์: v1.x).
- Node.js & npm: Node.js ํจ์์ฉ Lambda Layer ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ์ํด ํ์ํฉ๋๋ค.
- Docker: (์ ํ ์ฌํญ์ด์ง๋ง,
problem-generator-v3์ ๊ฐ์ ํน์ Lambda Layer ๋น๋์ ํ์ํฉ๋๋ค). - Git: ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ํด ํ์ํฉ๋๋ค.
- Google Cloud ํ๋ก์ ํธ ์๊ฒฉ ์ฆ๋ช
:
- Google Client ID ๋ฐ Secret: Cognito Google ๋ก๊ทธ์ธ์ ์ํด ํ์ (
infrastructure/cognito). - Google AI API Key: Gemini ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ์๋น์ค๋ฅผ ์ํด ํ์ (
infrastructure/chatbot,infrastructure/problem-generator-v3).
- Google Client ID ๋ฐ Secret: Cognito Google ๋ก๊ทธ์ธ์ ์ํด ํ์ (
- ์ฌ์ฉ์ ์ง์ ๋๋ฉ์ธ (์ ํ ์ฌํญ):
app๋ชจ๋์ ์ฌ์ฉ์ ์ง์ ๋๋ฉ์ธ์ผ๋ก ๋ฐฐํฌํ๋ ๊ฒฝ์ฐ, ํด๋น DNS ๊ด๋ฆฌ์ ์ ๊ทผํ ์ ์์ด์ผ ํฉ๋๋ค (์: Route 53 ํธ์คํ ์์ญ).
4. ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ ๊ฐ์
Terraform ์ฝ๋๋ infrastructure/ ๋๋ ํ ๋ฆฌ ์๋์ ๊ตฌ์ฑ๋ฉ๋๋ค:
capstone-2025-04/
โโโ infrastructure/
โ โโโ backend-setup/ # Terraform ์ํ ๋ฐฑ์๋ (S3, DynamoDB)
โ โโโ cognito/ # ์ฌ์ฉ์ ์ธ์ฆ (Cognito)
โ โโโ app/ # ํ๋ก ํธ์๋ ํธ์คํ
(S3, CloudFront, OIDC ์ญํ )
โ โโโ api/ # ์ปค๋ฎค๋ํฐ API (API GW, Lambda, DynamoDB, Layer)
โ โโโ problems-api/ # ๋ฌธ์ API (API GW, Lambda, ๋ฌธ์ ์์ฑ๊ธฐ์ DynamoDB ์ฌ์ฉ)
โ โโโ problem-generator-v3/ # ๋ฌธ์ ์์ฑ ์๋น์ค v3 (Lambda URL, CF, DynamoDB, Layer)
โ โโโ code-execution-service/ # ์ฝ๋ ์ฑ์ ๊ธฐ ๋ฐ ์คํ๊ธฐ (API GW, Lambdas, DynamoDB)
โ โโโ submissions-api/ # ์ ์ถ API (API GW, Lambda, ์ฝ๋ ์คํ ์๋น์ค์ DynamoDB ์ฌ์ฉ)
โ โโโ chatbot/ # ์ฑ๋ด ์๋น์ค (Lambda URL, CF, Layer)
โ โโโ ... (๊ธฐํ ์ ์ฌ์ ๋ชจ๋ ๋๋ ๊ณต์ ํ์ผ)
โโโ backend/
โ โโโ lambdas/ # Lambda ํจ์ ์์ค ์ฝ๋
โ โโโ community-lambda-functions/
โ โโโ chatbot-query/
โ โโโ problem-generator-v3/
โ โโโ code-executor/
โ โโโ code-grader/
โ โโโ problems-api/
โ โโโ submissions-api/
โโโ ... (ํ๋ก ํธ์๋ ์ฝ๋ ๋ฑ)
infrastructure/ ๋ด์ ๊ฐ ํ์ ๋๋ ํ ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์์ฒด main.tf, variables.tf, outputs.tf ๋ฐ backend.tf(์๊ฒฉ ์ํ ์ฌ์ฉ ์)๋ฅผ ๊ฐ์ง ๊ณ ์ ํ Terraform ๋ชจ๋์ ๋ํ๋
๋๋ค.
5. ์ ์ญ ์ค์ : Terraform ์ํ ๋ฐฑ์๋
์ด๊ฒ์ ๊ธฐ์ด ๋จ๊ณ์ด๋ฉฐ ๊ฐ์ฅ ๋จผ์ ์ํํด์ผ ํฉ๋๋ค.
๋ชจ๋: infrastructure/backend-setup/
- ๋ชฉ์ : Terraform ์ํ ํ์ผ์ ์ ์ฅํ S3 ๋ฒํท๊ณผ ์ํ ์ ๊ธ์ ์ํ DynamoDB ํ ์ด๋ธ์ ์์ฑํฉ๋๋ค.
- ์ํ ๊ด๋ฆฌ: ์ด ๋ชจ๋ ์์ฒด๋ ์๊ฒฉ ์ํ๋ฅผ ์ํ ๋ฆฌ์์ค๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋ก์ปฌ ์ํ ํ์ผ(
terraform.tfstate)์ ์ฌ์ฉํฉ๋๋ค. -
๋ฐฐํฌ:
cd infrastructure/backend-setup terraform init terraform plan terraform apply - ์ถ๋ ฅ:
tfstate_bucket_name๊ณผtfstate_lock_table_name์ ๊ธฐ๋กํด ๋์ญ์์ค. ์ด ๊ฐ๋ค์ ๋ค๋ฅธ ๋ชจ๋ ๋ชจ๋์์ ์ฌ์ฉ๋ฉ๋๋ค.output.txt์์:tfstate_bucket_name = "alpaco-tfstate-bucket-kmu"tfstate_lock_table_name = "alpaco-tfstate-lock-table"
6. ๋ชจ๋๋ณ ๋ฐฐํฌ ์ง์นจ
backend-setup์ด ์๋ฃ๋ ํ ๋ค๋ฅธ ๋ชจ๋์ ๋ฐฐํฌํ ์ ์์ต๋๋ค. ์์กด์ฑ์ผ๋ก ์ธํด ์์๊ฐ ์ค์ํ ์ ์์ต๋๋ค (์: API ๋ชจ๋์ Cognito ์ถ๋ ฅ์ ์์กดํ ์ ์์).
๊ฐ ๋ชจ๋์ ๋ํ ์ผ๋ฐ์ ์ธ Terraform ๋ช ๋ น์ด (๋ฌ๋ฆฌ ๋ช ์๋์ง ์๋ ํ):
- ๋ชจ๋ ๋๋ ํ ๋ฆฌ๋ก ์ด๋:
cd infrastructure/<module-name> -
Terraform ์ด๊ธฐํ:
terraform init \ -backend-config="bucket=<YOUR_TFSTATE_BUCKET_NAME_FROM_BACKEND_SETUP>" \ -backend-config="key=<module-specific-key-from-backend.tf>" \ -backend-config="region=<YOUR_AWS_REGION>" \ -backend-config="dynamodb_table=<YOUR_TFSTATE_LOCK_TABLE_NAME_FROM_BACKEND_SETUP>" \ -backend-config="encrypt=true"ํ๋ ์ด์คํ๋๋ฅผ ์ค์ ๊ฐ์ผ๋ก ๊ต์ฒดํ์ญ์์ค.
key๋ ๊ฐ ๋ชจ๋์backend.tfํ์ผ์ ์ ์๋์ด ์์ต๋๋ค. ์์:cognito๋ชจ๋์ ๊ฒฝ์ฐ ํค๋cognito/terraform.tfstate์ ๋๋ค. - ์คํ ๊ณํ ๊ฒํ :
terraform plan(ํ์ํ-var์ต์ ์ ๋ฌ) - ๋ณ๊ฒฝ ์ฌํญ ์ ์ฉ:
terraform apply(ํ์ํ-var์ต์ ์ ๋ฌ) - ์ถ๋ ฅ ๊ฐ ๊ฒํ :
terraform output
6.1. Cognito (infrastructure/cognito/)
- ๋ชฉ์ : AWS Cognito ์ฌ์ฉ์ ํ์ ์ค์ ํ์ฌ Google ๋ก๊ทธ์ธ์ ์ง์ํ๊ณ , ์ฌ์ฉ์ ๊ทธ๋ฃน ๋ฐ ์ฌ์ฉ์๋ฅผ ๊ธฐ๋ณธ ๊ทธ๋ฃน์ ์ถ๊ฐํ๋ Lambda ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
- ์ฃผ์ ๋ฆฌ์์ค:
aws_cognito_user_pool,aws_cognito_identity_provider(Google),aws_cognito_user_pool_client,aws_cognito_user_group,aws_lambda_function(PostConfirmation ํธ๋ฆฌ๊ฑฐ). - ์ํฌ๋ฆฟ:
google_client_id:terraform.auto.tfvars๋๋ ๋ช ๋ น์ค(-var="google_client_id=...")์ ํตํด ์ ๊ณตํฉ๋๋ค.google_client_secret:terraform.auto.tfvars(์ด ํ์ผ์.gitignore์ ์ถ๊ฐ) ๋๋ ๋ช ๋ น์ค(-var="google_client_secret=...")์ ํตํด ์ ๊ณตํฉ๋๋ค. ์์infrastructure/cognito/terraform.auto.tfvars(.gitignore์ ์ถ๊ฐ):
google_client_id = "YOUR_GOOGLE_CLIENT_ID.apps.googleusercontent.com" google_client_secret = "YOUR_GOOGLE_CLIENT_SECRET" - ๋ฐฐํฌ: ์ผ๋ฐ์ ์ธ ๋ช
๋ น์ด๋ฅผ ๋ฐ๋ฆ
๋๋ค.
backend.tf๋key = "cognito/terraform.tfstate"๋ฅผ ์ง์ ํฉ๋๋ค. - ์ถ๋ ฅ:
cognito_user_pool_id,cognito_user_pool_client_id,cognito_user_pool_arn๋ฑ. Cognito์ ํตํฉ๋๋ ๋ค๋ฅธ ์๋น์ค์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
6.2. ์ฝ๋ ์คํ ์๋น์ค (infrastructure/code-execution-service/)
- ๋ชฉ์ : ์ฝ๋ ์คํ ๋ฐ ์ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
code-executorLambda (Python)์ API Gateway๋ฅผ ํตํด ๋ ธ์ถ๋๋code-graderLambda (Python)๋ฅผ ํฌํจํฉ๋๋ค. ์ ์ถ ๊ธฐ๋ก์ DynamoDB ํ ์ด๋ธ์ ์ ์ฅํฉ๋๋ค. - ์ฃผ์ ๋ฆฌ์์ค:
aws_lambda_function(x2),aws_dynamodb_table(์ ์ถ ๊ธฐ๋ก),aws_api_gateway_rest_api. - ์์กด์ฑ:
problem-generator-v3๋ชจ๋์ ์๊ฒฉ ์ํ์์problems_table_name๋ฐproblems_table_arn์ ์ฝ์ต๋๋ค.- API Gateway ๊ถํ ๋ถ์ฌ์(Authorizer)๋ฅผ ์ํด
cognito๋ชจ๋์ ์๊ฒฉ ์ํ์์cognito_user_pool_arn์ ์ฝ์ต๋๋ค.
- ๋ฐฐํฌ:
- ์์ ๊ณ ๋ ค:
problem-generator-v3๋ชจ๋์ด ๋จผ์ ๋ฐฐํฌ๋์ดproblems_table์ ์์ฑํด์ผ ํฉ๋๋ค. - ์ผ๋ฐ์ ์ธ ๋ช
๋ น์ด๋ฅผ ๋ฐ๋ฆ
๋๋ค.
backend.tf๋key = "code-execution-service/terraform.tfstate"๋ฅผ ์ง์ ํฉ๋๋ค.
- ์์ ๊ณ ๋ ค:
- ์ถ๋ ฅ:
code_grader_api_invoke_url,submissions_table_name_output,code_executor_lambda_arn๋ฑ.
6.3. ๋ฌธ์ ์์ฑ๊ธฐ v3 (infrastructure/problem-generator-v3/)
- ๋ชฉ์ : Google AI (Gemini)๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ๋ฅผ ์์ฑํ๊ณ DynamoDB์ ์ ์ฅํฉ๋๋ค. CloudFront๋ฅผ ํตํด Lambda ํจ์ URL๋ก ๊ธฐ๋ฅ์ ๋ ธ์ถํฉ๋๋ค.
- ์ฃผ์ ๋ฆฌ์์ค:
aws_lambda_function,aws_lambda_layer_version,aws_dynamodb_table(Problems-v3),aws_cloudfront_distribution,aws_cloudfront_origin_access_control. - ์์กด์ฑ:
code-execution-service๋ชจ๋์code_executor_lambda_arn์ด ํ์ํฉ๋๋ค (๋ณ์๋ก ์ ๋ฌ).
- ์ํฌ๋ฆฟ:
google_ai_api_key:terraform.auto.tfvars๋๋ ๋ช ๋ น์ค์ ํตํด ์ ๊ณตํฉ๋๋ค. ์์infrastructure/problem-generator-v3/terraform.auto.tfvars(.gitignore์ ์ถ๊ฐ):
google_ai_api_key = "YOUR_GOOGLE_AI_API_KEY" - Lambda Layer: ์ด ๋ชจ๋์ Docker ๊ธฐ๋ฐ ๋น๋ ์คํฌ๋ฆฝํธ (
layers/build-layer.sh)๋ฅผ ์ฌ์ฉํ์ฌ Node.js ์์กด์ฑ์ ํจํค์งํฉ๋๋ค. ์ด ์คํฌ๋ฆฝํธ๋package-lock.json๋๋ ๋น๋ ์คํฌ๋ฆฝํธ๊ฐ ๋ณ๊ฒฝ๋๋ฉด Terraform์ ์ํดnull_resource๋ฅผ ํตํด ์๋์ผ๋ก ์คํ๋ฉ๋๋ค.- ๋ก์ปฌ์์ ๋ฐฐํฌํ๋ ๊ฒฝ์ฐ Docker๊ฐ ์คํ ์ค์ธ์ง ํ์ธํ์ญ์์ค.
build-layer.sh์คํฌ๋ฆฝํธ๋backend/lambdas/problem-generator-v3/์์package.json๋ฐpackage-lock.json์ ๋ณต์ฌํ์ฌ ๋ ์ด์ด๋ฅผ ๋น๋ํฉ๋๋ค.
- ์ํ ์์กด์ฑ ๋ฐฐํฌ ์ ๋ต (
code-execution-service๊ด๋ จ):problem-generator-v3/readme.md์ ์ธ๊ธ๋ ๋ฐ์ ๊ฐ์ด, ์ด ๋ชจ๋์code-execution-service์code_executor_lambda_arn์ ์์กดํ๊ณ ,code-execution-service๋ ์ด ๋ชจ๋์problems_table_arn์ ์์กดํฉ๋๋ค.- 1๋จ๊ณ:
problem-generator-v3๋ฐฐํฌ (์ด๊ธฐ)variables.tf์code_executor_lambda_arn์ ์์ ์ ํจํ ARN ๋ฌธ์์ด๋ก ์ค์ ํ๊ฑฐ๋ ๊ธฐ๋ณธ๊ฐ์ด ํ๋ ์ด์คํ๋์ธ ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋๊ณ ๋ฐฐํฌํฉ๋๋ค.problem-generator-v3์ ๋ํดterraform apply๋ฅผ ์คํํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉดproblems_table์ด ์์ฑ๋ฉ๋๋ค.
- 2๋จ๊ณ:
code-execution-service๋ฐฐํฌcode-execution-service์ ๋ํดterraform apply๋ฅผ ์คํํฉ๋๋ค. ์ด ๋ชจ๋์problem-generator-v3์ ์ํ์์problems_table_arn์ ์ฝ์ดcode_executor_lambda๋ฅผ ์์ฑํฉ๋๋ค.code_executor_lambda_arn์ถ๋ ฅ์ ๊ธฐ๋กํฉ๋๋ค.
- 3๋จ๊ณ:
problem-generator-v3๋ฐฐํฌ (์ ๋ฐ์ดํธ)- 2๋จ๊ณ์์ ์ป์ ์ค์ ARN์ผ๋ก
infrastructure/problem-generator-v3/variables.tf๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋terraform.auto.tfvars๋ฅผ ์ฌ์ฉํ์ฌcode_executor_lambda_arn์ ์ค์ ํฉ๋๋ค. problem-generator-v3์ ๋ํด ๋ค์terraform apply๋ฅผ ์คํํฉ๋๋ค.
- 2๋จ๊ณ์์ ์ป์ ์ค์ ARN์ผ๋ก
- 1๋จ๊ณ:
- ์ถ๋ ฅ:
cloudfront_distribution_domain,problems_table_name,problems_table_arn.
6.4. ์ปค๋ฎค๋ํฐ API (infrastructure/api/)
- ๋ชฉ์ : ์ปค๋ฎค๋ํฐ ๊ธฐ๋ฅ(๊ฒ์๋ฌผ, ๋๊ธ, ์ข์์)์ ์ํ ํต์ฌ ๋ฐฑ์๋์ ๋๋ค.
- ์ฃผ์ ๋ฆฌ์์ค:
aws_api_gateway_rest_api, ๋ค์์aws_lambda_function๋ฆฌ์์ค,aws_dynamodb_table(์ปค๋ฎค๋ํฐ),aws_lambda_layer_version. - ์์กด์ฑ:
- API Gateway ๊ถํ ๋ถ์ฌ์(Authorizer)๋ฅผ ์ํด
cognito๋ชจ๋์ ์๊ฒฉ ์ํ์์cognito_user_pool_arn์ ์ฝ์ต๋๋ค.
- API Gateway ๊ถํ ๋ถ์ฌ์(Authorizer)๋ฅผ ์ํด
- Lambda Layer (
common-deps):uuid์์กด์ฑ์ ํฌํจํฉ๋๋ค.-
terraform apply์ ์๋ ๋จ๊ณ (CI/CD์์ ์ฒ๋ฆฌํ์ง ์๋ ๊ฒฝ์ฐ):cd infrastructure/api/layers/common-deps/nodejs npm install cd ../../../.. # infrastructure/api๋ก ๋์๊ฐ๊ธฐ
- ๋ฐฐํฌ: ์ผ๋ฐ์ ์ธ ๋ช
๋ น์ด๋ฅผ ๋ฐ๋ฆ
๋๋ค.
backend.tf๋key = "api/community/terraform.tfstate"๋ฅผ ์ง์ ํฉ๋๋ค. - ์ถ๋ ฅ:
api_gateway_invoke_url,community_dynamodb_table_name.
6.5. ๋ฌธ์ API (infrastructure/problems-api/)
- ๋ชฉ์ : ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ฝ๊ธฐ ์ ์ฉ API ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ฃผ์ ๋ฆฌ์์ค:
aws_api_gateway_rest_api,aws_lambda_function(x2:getAllProblems,getProblemById). - ์์กด์ฑ:
problem-generator-v3๋ชจ๋์ ์๊ฒฉ ์ํ์์problems_table_name๋ฐproblems_table_arn์ ์ฝ์ต๋๋ค.
- Lambda ์ฝ๋: Lambda ํธ๋ค๋ฌ ์ฝ๋(
getAllProblems.mjs,getProblemById.mjs)๊ฐbackend/lambdas/problems-api/์ ์๋์ง ํ์ธํฉ๋๋ค. - ๋ฐฐํฌ: ์ผ๋ฐ์ ์ธ ๋ช
๋ น์ด๋ฅผ ๋ฐ๋ฆ
๋๋ค.
backend.tf๋key = "api/problems/terraform.tfstate"๋ฅผ ์ง์ ํฉ๋๋ค. - ์ถ๋ ฅ:
problems_api_invoke_url.
6.6. ์ ์ถ API (infrastructure/submissions-api/)
- ๋ชฉ์ : ์ ์ถ ๊ธฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ API ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ฃผ์ ๋ฆฌ์์ค:
aws_api_gateway_rest_api,aws_lambda_function(getSubmission). - ์์กด์ฑ:
code-execution-service๋ชจ๋์ ์๊ฒฉ ์ํ์์submissions_table_name_output๋ฐsubmissions_table_arn_output์ ์ฝ์ต๋๋ค.
- Lambda ์ฝ๋: Lambda ํธ๋ค๋ฌ ์ฝ๋(
getSubmission.mjs)๊ฐbackend/lambdas/submissions-api/์ ์๋์ง ํ์ธํฉ๋๋ค. - ๋ฐฐํฌ: ์ผ๋ฐ์ ์ธ ๋ช
๋ น์ด๋ฅผ ๋ฐ๋ฆ
๋๋ค.
backend.tf๋key = "api/submissions/terraform.tfstate"๋ฅผ ์ง์ ํฉ๋๋ค. - ์ถ๋ ฅ:
submissions_api_invoke_url.
6.7. ์ฑ๋ด (infrastructure/chatbot/)
- ๋ชฉ์ : Google AI (Gemini)๋ฅผ ์ฌ์ฉํ๋ AI ์ฑ๋ด ๋ฐฑ์๋ ์๋น์ค์ด๋ฉฐ, Lambda ํจ์ URL๊ณผ CloudFront๋ฅผ ํตํด ๋ ธ์ถ๋ฉ๋๋ค.
- ์ฃผ์ ๋ฆฌ์์ค:
aws_lambda_function,aws_lambda_layer_version,aws_cloudfront_distribution,aws_cloudfront_origin_access_control. - ์์กด์ฑ:
cognito๋ชจ๋์ ์๊ฒฉ ์ํ์์ Cognito ์ถ๋ ฅ(cognito_user_pool_id,cognito_user_pool_client_id๋ฑ)์ ์ฝ์ต๋๋ค.
- ์ํฌ๋ฆฟ:
google_ai_api_key:terraform.auto.tfvars๋๋ ๋ช ๋ น์ค์ ํตํด ์ ๊ณตํฉ๋๋ค. ์์infrastructure/chatbot/terraform.auto.tfvars(.gitignore์ ์ถ๊ฐ):
google_ai_api_key = "YOUR_GOOGLE_AI_API_KEY" - Lambda Layer (
chatbot_deps):@langchain/google-genai,jose๋ฑ์ ํฌํจํฉ๋๋ค.-
terraform apply์ ์๋ ๋จ๊ณ (CI/CD์์ ์ฒ๋ฆฌํ์ง ์๋ ๊ฒฝ์ฐ): ๋ ์ด์ด์ฉpackage.json์infrastructure/chatbot/layers/chatbot_deps/nodejs/์ ์์ต๋๋ค. ์ดnodejs๋๋ ํ ๋ฆฌ ๋ด์node_modules๊ฐ ์ฑ์์ง๋๋กnpm install์ ์คํํด์ผ ํฉ๋๋ค.# ํ๋ก์ ํธ ๋ฃจํธ์์: npm install --prefix ./infrastructure/chatbot/layers/chatbot_deps/nodejs ./infrastructure/chatbot/layers/chatbot_deps/nodejs # ๋๋ (package.json์ด backend/lambdas/chatbot-query์ ์๋์ ์ผ๋ก ์์กด์ฑ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ดํ๋ ๊ฒฝ์ฐ) # npm install --prefix ./infrastructure/chatbot/layers/chatbot_deps/nodejs ./backend/lambdas/chatbot-query๊ทธ๋ฌ๋ฉด
layer.tf๊ฐinfrastructure/chatbot/layers/chatbot_deps/์ ๋ด์ฉ์ ์์ถํฉ๋๋ค.
- ๋ฐฐํฌ: ์ผ๋ฐ์ ์ธ ๋ช
๋ น์ด๋ฅผ ๋ฐ๋ฆ
๋๋ค.
backend.tf๋key = "chatbot/terraform.tfstate"๋ฅผ ์ง์ ํฉ๋๋ค. - ์ถ๋ ฅ:
cloudfront_distribution_domain_name.
6.8. ์ ํ๋ฆฌ์ผ์ด์
ํ๋ก ํธ์๋ (infrastructure/app/)
- ๋ชฉ์ : Next.js ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ S3์ ํธ์คํ ํ๊ณ CloudFront๋ฅผ ํตํด ์ ๊ณตํฉ๋๋ค. ์ฌ์ฉ์ ์ง์ ๋๋ฉ์ธ ์ค์ ๋ฐ GitHub Actions ๋ฐฐํฌ๋ฅผ ์ํ IAM OIDC ์ญํ ์ ํฌํจํฉ๋๋ค.
- ์ฃผ์ ๋ฆฌ์์ค:
aws_s3_bucket,aws_cloudfront_distribution,aws_route53_record,aws_acm_certificate,aws_iam_role(GitHub Actions์ฉ). - ์ฌ์ ์ค๋น ์ฌํญ:
custom_domain_name(์:alpaco.us)์ ๋ํ Route 53 ํผ๋ธ๋ฆญ ํธ์คํ ์์ญ.
- ์ฌ์ฉ์ ์ง์ ๋๋ฉ์ธ ๋ฐ ACM ์ธ์ฆ์:
- CloudFront์ฉ ACM ์ธ์ฆ์๋ ๋ฐ๋์
us-east-1๋ฆฌ์ ์ ์์ฑ๋์ด์ผ ํฉ๋๋ค. ์ด ๋ชจ๋์providers.tf๋us-east-1์ฉ ๋ณ์นญ ๊ณต๊ธ์๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. - ์ธ์ฆ์์ฉ DNS ์ ํจ์ฑ ๊ฒ์ฌ ๋ ์ฝ๋๋ Route 53 ํธ์คํ ์์ญ์ ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.
- CloudFront์ฉ ACM ์ธ์ฆ์๋ ๋ฐ๋์
- OIDC ์ญํ : GitHub Actions๊ฐ ํ๋ก ํธ์๋ ์์ฐ์ S3์ ๋ฐฐํฌํ๊ณ CloudFront ์บ์๋ฅผ ๋ฌดํจํํ๊ธฐ ์ํด ๋งก์ ์ ์๋ IAM ์ญํ ์ ์์ฑํฉ๋๋ค.
- ๋ฐฐํฌ: ์ผ๋ฐ์ ์ธ ๋ช
๋ น์ด๋ฅผ ๋ฐ๋ฆ
๋๋ค.
backend.tf๋key = "app/terraform.tfstate"๋ฅผ ์ง์ ํฉ๋๋ค.- ๊ธฐ๋ณธ๊ฐ๊ณผ ๋ค๋ฅธ ๊ฒฝ์ฐ
github_repository๋ฅผ ์ ๋ฌํด์ผ ํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ๊ฐ๊ณผ ๋ค๋ฅธ ๊ฒฝ์ฐ
- ์ถ๋ ฅ:
application_url(์ฌ์ฉ์ ์ง์ ๋๋ฉ์ธ),cloudfront_distribution_domain_name,github_actions_deploy_role_arn.
7. ์ ์ฒด ๋ฐฐํฌ ์ ๋ต ๋ฐ ์์
๋ชจ๋ ๊ฐ ์์กด์ฑ(์ฃผ๋ก terraform_remote_state๋ฅผ ํตํด)์ผ๋ก ์ธํด ์ผ๋ฐ์ ์ธ ๋ฐฐํฌ ์์๊ฐ ๊ถ์ฅ๋ฉ๋๋ค:
infrastructure/backend-setup: (๋ก์ปฌ ์ํ) ์๊ฒฉ ์ํ๋ฅผ ์ํ S3/DynamoDB ์์ฑ.infrastructure/cognito: (์๊ฒฉ ์ํ ์ฌ์ฉ) ์ฌ์ฉ์ ํ ์์ฑ.google_client_id๋ฐgoogle_client_secretํ์.
infrastructure/problem-generator-v3(1๋จ๊ณ): (์๊ฒฉ ์ํ ์ฌ์ฉ)google_ai_api_keyํ์.- ํ๋ ์ด์คํ๋
code_executor_lambda_arn์ผ๋ก ๋ฐฐํฌํ๊ฑฐ๋ ๊ธฐ๋ณธ๊ฐ ํ์ฉ. - Docker๋ฅผ ์ฌ์ฉํ์ฌ Lambda ๋ ์ด์ด ๋น๋.
- ์ถ๋ ฅ:
problems_table_arn.
infrastructure/code-execution-service: (์๊ฒฉ ์ํ ์ฌ์ฉ)problem-generator-v3์ํ์์problems_table_arn์ฝ๊ธฐ.cognito์ํ์์cognito_user_pool_arn์ฝ๊ธฐ.- ์ถ๋ ฅ:
code_executor_lambda_arn,submissions_table_name_output,submissions_table_arn_output.
infrastructure/problem-generator-v3(2๋จ๊ณ - ์ ๋ฐ์ดํธ):code-execution-service์ถ๋ ฅ์์ ์ค์ code_executor_lambda_arn์ผ๋ก ์ ๋ฐ์ดํธ.- ๋ค์
terraform apply์คํ.
infrastructure/api(์ปค๋ฎค๋ํฐ API): (์๊ฒฉ ์ํ ์ฌ์ฉ)- ๋ ์ด์ด์ ๋ํด
npm installํ์. cognito์ํ์์cognito_user_pool_arn์ฝ๊ธฐ.
- ๋ ์ด์ด์ ๋ํด
infrastructure/chatbot: (์๊ฒฉ ์ํ ์ฌ์ฉ)- ๋ ์ด์ด์ ๋ํด
npm installํ์. - Cognito ์ํ ์ฝ๊ธฐ.
google_ai_api_keyํ์.
- ๋ ์ด์ด์ ๋ํด
infrastructure/problems-api: (์๊ฒฉ ์ํ ์ฌ์ฉ)problem-generator-v3์ํ์์problems_table_name์ฝ๊ธฐ.
infrastructure/submissions-api: (์๊ฒฉ ์ํ ์ฌ์ฉ)code-execution-service์ํ์์submissions_table_name_output์ฝ๊ธฐ.
infrastructure/app: (์๊ฒฉ ์ํ ์ฌ์ฉ)- ํ๋ก ํธ์๋ ํธ์คํ ์ค์ . OIDC ์ญํ ์ GitHub ์ ์ฅ์ ์ด๋ฆ ํ์.
์ต์ด ์ ์ฒด ๋ฐฐํฌ: ์ฒ์ ์ ์ฒด ๋ฐฐํฌ ์์๋ ์ผ๋ฐ์ ์ผ๋ก ์ ์์๋๋ก ๊ฐ ๋ชจ๋์ ์ ์ฉํ์ฌ ํ ๋ชจ๋์ ์ถ๋ ฅ์ด ๋ค์ ๋ชจ๋์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ํฉ๋๋ค (์๋์ผ๋ก ๋ณ์๋ฅผ ์ ๋ฌํ๊ฑฐ๋ terraform_remote_state๋ฅผ ํตํด ์๋์ผ๋ก ์ฝ์).
8. CI/CD (GitHub Actions)
- ์ํฌํ๋ก์ฐ ํ์ผ: GitHub Actions ์ํฌํ๋ก์ฐ(์:
.github/workflows/deploy-app.yml,.github/workflows/deploy-api.yml)๋ ํน์ ๋ชจ๋์ ๋ฐฐํฌ๋ฅผ ์๋ํํฉ๋๋ค. - OIDC ์ธ์ฆ: ์ํฌํ๋ก์ฐ๋ AWS์ ์ธ์ฆํ๊ธฐ ์ํด OIDC๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉฐ, ํ์ํ ๊ถํ์ ๊ฐ์ง IAM ์ญํ ์ ๋งก์ต๋๋ค (์: ํ๋ก ํธ์๋์ฉ
app๋ชจ๋์์ ์์ฑ๋ ์ญํ ๋๋ ๋ฐฑ์๋ ์๋น์ค์ฉ ์ ์ฉ ์ญํ ). - ์ํฌ๋ฆฟ:
- AWS ์๊ฒฉ ์ฆ๋ช (OIDC ์ญํ ARN์ ํตํด).
TF_STATE_BUCKET,TF_STATE_LOCK_TABLE:terraform init๋ฐฑ์๋ ๊ตฌ์ฑ์ฉ.GOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRET,GOOGLE_AI_API_KEY: ํด๋น ๋ชจ๋์ ํ์. GitHub Secrets๋ก ์ ์ฅํฉ๋๋ค.
- CI/CD ๋ด Terraform ๋ช
๋ น์ด:
terraform init -backend-config=...(๋ฒํท/ํ ์ด๋ธ ์ด๋ฆ์ ์ํฌ๋ฆฟ ์ฌ์ฉ).terraform plan -out=tfplan.terraform apply tfplan.
- ๋ ์ด์ด ๋น๋: CI/CD ํ์ดํ๋ผ์ธ์๋ ๋ค์ ๋จ๊ณ๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค:
- ๋จ์ Node.js ๋ ์ด์ด(
api,chatbot๋ฑ)์ ๊ฒฝ์ฐnpm install์คํ. problem-generator-v3์ ๊ฒฝ์ฐ Docker ๋น๋ ์คํฌ๋ฆฝํธ(build-layer.sh) ์คํ. ์ด๋ ํด๋น ๋ชจ๋์ ๋ํterraform apply์ ์ ์ํ๋์ด์ผ ํฉ๋๋ค.
- ๋จ์ Node.js ๋ ์ด์ด(
9. ์ํฌ๋ฆฟ(๋ฏผ๊ฐ ์ ๋ณด) ๊ด๋ฆฌ
- ๋ก์ปฌ ๊ฐ๋ฐ:
- ๊ฐ ๋ชจ๋ ๋๋ ํ ๋ฆฌ ๋ด์
terraform.auto.tfvarsํ์ผ์ ์ฌ์ฉํ์ฌ API ํค๋ ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ๊ณผ ๊ฐ์ ๋ฏผ๊ฐํ ๋ณ์๋ฅผ ์ ์ฅํฉ๋๋ค. - ์ค์: ์ํฌ๋ฆฟ ์ปค๋ฐ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ๋ก์ ํธ์
.gitignoreํ์ผ์*.auto.tfvars๋ฅผ ์ถ๊ฐํ์ญ์์ค.
- ๊ฐ ๋ชจ๋ ๋๋ ํ ๋ฆฌ ๋ด์
- CI/CD (GitHub Actions):
- ๋ฏผ๊ฐํ ๊ฐ์ GitHub Secrets(์:
GOOGLE_AI_API_KEY,AWS_OIDC_ROLE_ARN)๋ก ์ ์ฅํฉ๋๋ค. - ์ํฌํ๋ก์ฐ์ Terraform ๋จ๊ณ์ ์ด๋ฌํ ์ํฌ๋ฆฟ์ ํ๊ฒฝ ๋ณ์๋ก ์ ๋ฌํฉ๋๋ค. ์:
TF_VAR_google_ai_api_key: $.
- ๋ฏผ๊ฐํ ๊ฐ์ GitHub Secrets(์:
10. ๋ฌธ์ ํด๊ฒฐ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
terraform validate: ๊ณํ ๋๋ ์ ์ฉ ์ ์ ๊ตฌ๋ฌธ์ ํ์ธํ๊ธฐ ์ํด ์คํํฉ๋๋ค.terraform fmt: ์ฝ๋๋ฅผ ์ผ๊ด๋๊ฒ ํ์ํํฉ๋๋ค.- ์๊ณ ์ ์ง์ ์ธ ๋ณ๊ฒฝ: ๋ฌธ์ ํด๊ฒฐ์ ๋ ์ฝ๊ฒ ํ๋ ค๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ ์์ ๋จ์๋ก ์ ์ฉํฉ๋๋ค.
terraform_remote_state์ดํด:key์bucket์ด ์์กด์ฑ ๋ชจ๋์ ์ํ ํ์ผ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฐ๋ฆฌํค๋์ง ํ์ธํฉ๋๋ค. ์์กด์ฑ ๋ชจ๋์ ๋จผ์ ์ฑ๊ณต์ ์ผ๋กapply๋์ด์ผ ํฉ๋๋ค.- IAM ๊ถํ:
terraform apply๊ฐ ๊ถํ ์ค๋ฅ๋ก ์คํจํ๋ฉด ์์ฑ๋๊ฑฐ๋ ๋งก๊ฒจ์ง๋ IAM ์ ์ฑ ๋ฐ ์ญํ ์ ์ ์คํ๊ฒ ๊ฒํ ํ์ญ์์ค. AWS ์ฝ์(IAM Access Analyzer, CloudTrail)์ด ๋์์ด ๋ ์ ์์ต๋๋ค. - ์ํ ์์กด์ฑ: ์ด๋ฌํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ๋ชจ๋์ ๋ ๋ถ๋ฆฌํ๊ฑฐ๋
problem-generator-v3๋ฐcode-execution-service์ ๋ํด ๋ณด์ฌ์ค ๊ฒ์ฒ๋ผ ๋ค๋จ๊ณ ์ ์ฉ์ ์ฌ์ฉํด์ผ ํ ์ ์์ต๋๋ค. - CloudFront ์ ํ: CloudFront ๋ฐฐํฌ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ธ๊ณ์ ์ผ๋ก ์ ํ๋๋ ๋ฐ ๋ช ๋ถ ์ ๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
- Lambda Layer ๊ฒฝ๋ก: ๋ ์ด์ด์ฉ
data "archive_file"์source_dir์ด ์ค์น๋ ์์กด์ฑ์ด ์๋nodejs(๋๋python) ํด๋๋ฅผ ํฌํจํ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฐ๋ฆฌํค๋์ง ํ์ธํฉ๋๋ค.
์ด ๊ฐ์ด๋๋ ALPACO ํ๋ก์ ํธ์ Terraform ์ธํ๋ผ ์์
์ ๋ํ ํ์คํ ๊ธฐ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ ๊ตฌ์ฒด์ ์ธ ์ธ๋ถ ์ ๋ณด๋ ๊ฐ๋ณ ๋ชจ๋ README.md ํ์ผ์ ์ฐธ์กฐํ์ญ์์ค.