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-executor
Lambda (Python)์ API Gateway๋ฅผ ํตํด ๋ ธ์ถ๋๋code-grader
Lambda (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
ํ์ผ์ ์ฐธ์กฐํ์ญ์์ค.