์ด ๊ฐ์ด๋์์๋ ์ฌ์ ๋น๋๋ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ์ฌ Cloud Run์ Gemma 3 ๊ฐ๋ฐฉํ ๋ชจ๋ธ์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ณ , Google Gen AI SDK๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐํฌ๋ Cloud Run ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๋ดํฉ๋๋ค.
์์ํ๊ธฐ ์ ์
Google AI Studio๋ฅผ ์ฌ์ฉํ์ฌ Cloud Run์ ๋ฐฐํฌํ ๊ฒฝ์ฐ Google Gen AI SDK์ ์์ ํ๊ฒ ์ํธ์์ฉ ์น์ ์ผ๋ก ๊ฑด๋๋ฐ์ธ์.
Google AI Studio๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ Cloud Run์ ์ฌ์ฉํ์ฌ ์ ์๋น์ค๋ฅผ ๋ง๋ค๊ธฐ ์ ์ ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- Google Cloud ํ๋ก์ ํธ์์ Cloud Run ๊ฐ๋ฐ ํ๊ฒฝ์ ์ค์ ํฉ๋๋ค.
- gcloud CLI๋ฅผ ์ค์นํ๊ณ ์ด๊ธฐํํฉ๋๋ค.
- ๊ณ์ ์ ๋ค์ IAM ์ญํ ์ด ๋ถ์ฌ๋์๋์ง ํ์ธํฉ๋๋ค.
- Cloud Run ๊ด๋ฆฌ์(
roles/run.admin
) - ํ๋ก์ ํธ IAM ๊ด๋ฆฌ์(
roles/resourcemanager.projectIamAdmin
) - ์๋น์ค ์ฌ์ฉ๋ ์๋น์(
roles/serviceusage.serviceUsageConsumer
)
- Cloud Run ๊ด๋ฆฌ์(
-
Google Cloud ์ฝ์์์ IAM ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
IAM์ผ๋ก ์ด๋ - ํ๋ก์ ํธ๋ฅผ ์ ํํฉ๋๋ค.
- ์ก์ธ์ค ๊ถํ ๋ถ์ฌ๋ฅผ ํด๋ฆญํฉ๋๋ค.
-
์ ์ฃผ ๊ตฌ์ฑ์ ํ๋์ ์ฌ์ฉ์ ์๋ณ์๋ฅผ ์ ๋ ฅํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก Cloud Run ์๋น์ค๋ฅผ ๋ฐฐํฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ Google ๊ณ์ ์ด๋ฉ์ผ ์ฃผ์์ ๋๋ค.
- ์ญํ ์ ํ ๋ชฉ๋ก์์ ์ญํ ์ ์ ํํฉ๋๋ค.
- ์ญํ ์ ์ถ๊ฐ๋ก ๋ถ์ฌํ๋ ค๋ฉด ๋ค๋ฅธ ์ญํ ์ถ๊ฐ๋ฅผ ํด๋ฆญํ๊ณ ๊ฐ ์ญํ ์ ์ถ๊ฐํฉ๋๋ค.
- ์ ์ฅ์ ํด๋ฆญํฉ๋๋ค.
- PROJECT_NUMBER๋ฅผ Google Cloud ํ๋ก์ ํธ ๋ฒํธ๋ก ๋ฐ๊ฟ๋๋ค.
- PROJECT_ID๋ฅผ Google Cloud ํ๋ก์ ํธ ID๋ก ๋ฐ๊ฟ๋๋ค.
- PRINCIPAL์ ๋ฐ์ธ๋ฉ์ ์ถ๊ฐํ ๊ณ์ ์ผ๋ก ๋ฐ๊ฟ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก Cloud Run ์๋น์ค๋ฅผ ๋ฐฐํฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ Google ๊ณ์ ์ด๋ฉ์ผ ์ฃผ์์ ๋๋ค.
- ROLE: ๋ฐฐํฌ์ ๊ณ์ ์ ์ถ๊ฐํ ์ญํ ์ ๋๋ค.
- ํ ๋น๋ ๋ฐ ์์คํ
ํ๋ ํ์ด์ง์ Cloud Run Admin API ์๋์์
Total Nvidia L4 GPU allocation, per project per region
ํ ๋น๋์ ์์ฒญํฉ๋๋ค. - Cloud Run ๊ฐ๊ฒฉ ์ฑ ์ ํ์ด์ง๋ฅผ ๊ฒํ ํฉ๋๋ค. ํ๋ก์ ํธ ์ฌ์ฉ๋์ ๊ธฐ์ค์ผ๋ก ์์ ๋น์ฉ์ ์ฐ์ถํ๋ ค๋ฉด ๊ฐ๊ฒฉ ๊ณ์ฐ๊ธฐ๋ฅผ ์ฌ์ฉํ์ธ์.
SERVICE_NAME
์ Cloud Run ์๋น์ค์ ๊ณ ์ ์ด๋ฆ์ผ๋ก ๋ฐ๊ฟ๋๋ค.GEMMA_PARAMETER
๋ฅผ ์ฌ์ฉํ Gemma ๋ชจ๋ธ๋ก ๋ฐ๊ฟ๋๋ค.- Gemma 3 1B(
gemma-3-1b-it
):gemma3-1b
- Gemma 3 4B(
gemma-3-4b-it
):gemma3-4b
- Gemma 3 12B(
gemma-3-12b-it
):gemma3-12b
- Gemma 3 27B(
gemma-3-27b-it
):gemma3-27b
์ํ๋ ๊ฒฝ์ฐ ์ ์ฒด ์ด๋ฏธ์ง URL์ Gemma-on-Cloudrun GitHub ์ ์ฅ์์์ ๋น๋ํ Docker ์ด๋ฏธ์ง๋ก ๋ฐ๊ฟ๋๋ค.
- Gemma 3 1B(
REGION
์ Cloud Run์ด ๋ฐฐํฌ๋ Google Cloud ๋ฆฌ์ ์ผ๋ก ๋ฐ๊ฟ๋๋ค(์:europe-west1
). ๋ฆฌ์ ์ ์์ ํด์ผ ํ๋ ๊ฒฝ์ฐ GPU ๊ตฌ์ฑ์ ์ฐธ์กฐํ์ฌ GPU ์ง์ ๋ฐฐํฌ์ ์ง์๋๋ ๋ฆฌ์ ์ ์์๋ณด์ธ์.ํ๋ก์๋ฅผ ์์ํ๊ณ
cloud-run-proxy
๊ตฌ์ฑ์์๋ฅผ ์ค์นํ๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋๋ฉดY
๋ฅผ ์ ํํฉ๋๋ค.gcloud run services proxy ollama-gemma --port=9090
ํ๋ก์๋ฅผ ์คํ ์ํ๋ก ๋ ์ฑ ๋ณ๋์ ํฐ๋ฏธ๋ ํญ์์ ์์ฒญ์ ์ ์กํฉ๋๋ค. ํ๋ก์๋
localhost:9090
์์ ์คํ๋ฉ๋๋ค.curl http://localhost:9090/api/generate -d '{ "model": "gemma3:4b", "prompt": "Why is the sky blue?" }'
์ด ๋ช ๋ น์ด๋ ๋ค์๊ณผ ์ ์ฌํ ์คํธ๋ฆฌ๋ฐ ์ถ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
{"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.641492408Z","response":"That","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.687529153Z","response":"'","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.753284927Z","response":"s","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.812957381Z","response":" a","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.889102649Z","response":" fantastic","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.925748116Z","response":",","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.958391572Z","response":" decept","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.971035028Z","response":"ively","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.989678484Z","response":" tricky","done":false} {"model":"gemma3:4b","created_at":"2025-03-10T03:02:18.999321940Z","response":" question","done":false} ...
์ฝํ ์ธ ์์ฑ์ ๊ฒฝ์ฐ
/v1beta/{model=models/*}:generateContent
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ ๋ ฅGenerateContentRequest
๊ฐ ์ฃผ์ด์ง๋ฉด ๋ชจ๋ธ ๋๋ต์ ์์ฑํฉ๋๋ค.curl "<cloud_run_url>/v1beta/models/<model>:generateContent" \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ -X POST \ -d '{ "contents": [{ "parts":[{"text": "Write a story about a magic backpack. You are the narrator of an interactive text adventure game."}] }] }'
์คํธ๋ฆผ ์ฝํ ์ธ ์์ฑ์ ๊ฒฝ์ฐ
/v1beta/{model=models/*}:streamGenerateContent
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ ๋ ฅGenerateContentRequest
๊ฐ ์ฃผ์ด์ง๋ฉด ๋ชจ๋ธ์์ ์คํธ๋ฆฌ๋ฐ๋ ๋๋ต์ ์์ฑํฉ๋๋ค.curl "<cloud_run_url>/v1beta/models/<model>:streamGenerateContent" \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ -X POST \ -d '{ "contents": [{ "parts":[{"text": "Write a story about a magic backpack. You are the narrator of an interactive text adventure game."}] }] }'
OLLAMA_NUM_PARALLEL
๋ ์ถ๋ก ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊ฐ ๋ชจ๋ธ๋น ์ฌ์ฉํ ์ ์๋ ์์ฒญ ์ฌ๋กฏ ์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.--concurrency
๋ Cloud Run์ด Ollama ์ธ์คํด์ค์ ๋์์ ์ ์กํ๋ ์์ฒญ ์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.- GPU ๊ตฌ์ฑ
- ๊ถ์ฅ์ฌํญ: GPU๋ฅผ ์ฌ์ฉํ๋ Cloud Run์ AI ์ถ๋ก
- ๋ค์ํ AI ๋ฐํ์ ํ๋ ์์ํฌ๋ก Gemma 3 ๋ชจ๋ธ ์คํ
์ญํ ๋ถ์ฌ ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ
์ฝ์
gcloud
ํ๋ก์ ํธ์์ ๊ณ์ ์ ํ์ํ IAM ์ญํ ์ ๋ถ์ฌํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์.
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=PRINCIPAL \ --role=ROLE
๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊ฟ๋๋ค.
์ฌ์ ๋น๋๋ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ์ฌ Gemma ๋ชจ๋ธ ๋ฐฐํฌ
Cloud Run์ Cloud Run์์ Gemma ๊ฐ๋ฐฉํ ๋ชจ๋ธ์ ์๋นํ๊ธฐ ์ํด ์ฌ์ ๋น๋๋ ์ปจํ ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
Cloud Run์ Gemma ๋ชจ๋ธ์ ๋ฐฐํฌํ๋ ค๋ฉด ๊ถ์ฅ ์ค์ ๊ณผ ํจ๊ป ๋ค์ gcloud CLI ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ธ์.
gcloud run deploy SERVICE_NAME \ --image us-docker.pkg.dev/cloudrun/container/gemma/GEMMA_PARAMETER \ --concurrency 4 \ --cpu 8 \ --set-env-vars OLLAMA_NUM_PARALLEL=4 \ --gpu 1 \ --gpu-type nvidia-l4 \ --max-instances 1 \ --memory 32Gi \ --no-allow-unauthenticated \ --no-cpu-throttling \ --timeout=600 \ --region REGION
๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊ฟ๋๋ค.
๊ธฐํ ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ต์ | ์ค๋ช |
---|---|
--concurrency |
์ง์ ๋ ์ธ์คํด์ค์์ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ์ต๋ ์์ฒญ ์์
๋๋ค(์: |
--cpu |
์๋น์ค์ ํ ๋น๋ CPU์ ์์
๋๋ค(์: |
--set-env-vars |
์๋น์ค์ ์ค์ ๋ ํ๊ฒฝ ๋ณ์์
๋๋ค. ์๋ฅผ ๋ค๋ฉด |
--gpu |
์๋น์ค์ GPU ๊ฐ์
๋๋ค(์: |
--gpu-type |
์๋น์ค์ ์ฌ์ฉํ GPU ์ ํ์
๋๋ค(์: |
--max-instances |
์๋น์ค์ ์ต๋ ์ปจํ
์ด๋ ์ธ์คํด์ค ์์
๋๋ค(์: |
--memory |
์๋น์ค์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์์
๋๋ค(์: |
--no-invoker-iam-check |
ํธ์ถ์ IAM ๊ฒ์ฌ๋ฅผ ์ค์งํฉ๋๋ค. ์ฑ์ ๋ ์์ ํ๊ฒ ๋ณดํธํ๋ ๋ฐฉ๋ฒ์ ๊ดํ ๊ถ์ฅ์ฌํญ์ Google Gen AI SDK์ ์์ ํ๊ฒ ์ํธ์์ฉ์ ์ฐธ์กฐํ์ธ์. |
--no-cpu-throttling |
์ด ์ค์ ์ ์ปจํ ์ด๋๊ฐ ์์ฒญ์ ์ ๊ทน์ ์ผ๋ก ์ฒ๋ฆฌํ์ง ์๋ ๊ฒฝ์ฐ CPU ์ ํ์ ์ค์งํฉ๋๋ค. |
--timeout |
์๋ต์ด ๋ฐํ๋์ด์ผ ํ๋ ์๊ฐ์
๋๋ค(์: |
๊ธฐ๋ณธ ์ค์ ์ ์์ ํ๊ฑฐ๋ Cloud Run ์๋น์ค์ ๋ง์ถค ์ค์ ์ ์ถ๊ฐํด์ผ ํ๋ ๊ฒฝ์ฐ ์๋น์ค ๊ตฌ์ฑ์ ์ฐธ์กฐํ์ธ์.
๋ฐฐํฌ๋ ์๋น์ค๊ฐ ์๋ฃ๋๋ฉด run.app
์ผ๋ก ๋๋๋ Cloud Run ์๋ํฌ์ธํธ URL๊ณผ ํจ๊ป ์ฑ๊ณต ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
curl๋ก ๋ฐฐํฌ๋ Gemma ์๋น์ค ํ ์คํธ
์ด์ Gemma ์๋น์ค๋ฅผ ๋ฐฐํฌํ์ผ๋ฏ๋ก ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค. ํ์ง๋ง ์์ฒญ์ ์ง์ ์ ์กํ๋ฉด Cloud Run์ด HTTP 401 Unauthorized
๋ก ์๋ตํฉ๋๋ค. LLM ์ถ๋ก API๋ ํ๋ฐํธ์๋ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ๊ฐ์ด ๋ค๋ฅธ ์๋น์ค๋ฅผ ํธ์ถํ๊ธฐ ์ํ ๊ฒ์ด๋ฏ๋ก ์ด๋ ์๋๋ ๊ฒ์
๋๋ค. Cloud Run์์ ์๋น์ค ๊ฐ ์ธ์ฆ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋น์ค ๊ฐ ์ธ์ฆ์ ์ฐธ์กฐํ์ธ์.
Gemma ์๋น์ค์ ์์ฒญ์ ์ ์กํ๋ ค๋ฉด Cloud Run ๊ฐ๋ฐ์ ํ๋ก์๋ฅผ ์ฌ์ฉํ๋ ๋ฑ ์์ฒญ์ ์ ํจํ OIDC ํ ํฐ์ด ํฌํจ๋ ํค๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
Google Gen AI SDK์ ์์ ํ๊ฒ ์ํธ์์ฉ
Cloud Run ์๋น์ค๋ฅผ ๋ฐฐํฌํ ํ Google Gen AI SDK์ ํจ๊ป Cloud Run ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Google Gen AI SDK๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ์์ ์์ฒญ์ด ์ ์ ํ ID ํ ํฐ์ ์ ๋ฌํ๋์ง ํ์ธํ์ธ์. IAM ์ธ์ฆ ๋ฐ Cloud Run ์ฌ์ฉ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด ์๋น์ค ๊ฐ ์ธ์ฆ์ ์ฐธ์กฐํ์ธ์.
๋ค์ ์์์๋ IAM ์ธ์ฆ๊ณผ ํจ๊ป Google Gen AI SDK๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
JavaScript ๋๋ TypeScript
JavaScript ๋ฐ TypeScript์ฉ Google Gen AI SDK๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฝ๋๊ฐ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
import { GoogleGenAI, setDefaultBaseUrls } from "@google/genai";
import { GoogleAuth} from 'google-auth-library'
const cloudrunurl = 'https://CLOUD_RUN_SERVICE_URL';
const targetAudience = url;
const auth = new GoogleAuth();
async function main() {
const client = await auth.getIdTokenClient(targetAudience);
const headers = await client.getRequestHeaders(targetAudience);
const idToken = headers['Authorization']
const ai = new GoogleGenAI({
apiKey:"placeholder",
httpOptions: { baseUrl: url, headers: {'Authorization': idToken} },
});
const response = await ai.models.generateContent({
model: "gemma-3-1b-it",
contents: "I want a pony",
});
console.log(response.text);
}
main();
curl
curl์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ Google Gen AI SDK ์๋ํฌ์ธํธ์ ๋๋ฌํฉ๋๋ค.
์ต์ ์ ์ฑ๋ฅ์ ์ํ ๋์ ์คํ ์ค์
์ด ์น์
์์๋ ๊ถ์ฅ๋๋ ๋์ ์คํ ์ค์ ์ ๋ํ ์ปจํ
์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ต์ ์ ์์ฒญ ์ง์ฐ ์๊ฐ์ ์ํด --concurrency
์ค์ ์ด Ollama์ OLLAMA_NUM_PARALLEL
ํ๊ฒฝ ๋ณ์์ ๋์ผํ์ง ํ์ธํฉ๋๋ค.
--concurrency
๊ฐ OLLAMA_NUM_PARALLEL
์ ์ด๊ณผํ๋ฉด Cloud Run์ Ollama์ ๋ชจ๋ธ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์์ฒญ ์ฌ๋กฏ๋ณด๋ค ๋ ๋ง์ ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
์ด๋ก ์ธํด Ollama ๋ด์์ ์์ฒญ ํ๊ฐ ๋ฐ์ํ์ฌ ํ์ ์ถ๊ฐ๋ ์์ฒญ์ ๋ํด ์์ฒญ ์ง์ฐ ์๊ฐ์ด ๋์ด๋ฉ๋๋ค. ๋ํ ๋๊ธฐ์ด์ ์ถ๊ฐ๋ ์์ฒญ์ด Cloud Run์ ์ํ ํ์ฅํ๊ณ ์ ์ธ์คํด์ค๋ฅผ ์์ํ๋๋ก ํธ๋ฆฌ๊ฑฐํ์ง ์์ผ๋ฏ๋ก ์๋ ํ์ฅ์ ์๋ต์ฑ์ด ๋จ์ด์ง๋๋ค.
Ollama๋ ๋ํ ํ๋์ GPU์์ ์ฌ๋ฌ ๋ชจ๋ธ์ ์๋นํ๋๋ก ์ง์ํฉ๋๋ค. Ollama ์ธ์คํด์ค์์ ์์ฒญ ํ๋ฅผ ์์ ํ ๋ฐฉ์งํ๋ ค๋ฉด ์ฌ์ ํ OLLAMA_NUM_PARALLEL
์ ์ผ์นํ๋๋ก --concurrency
๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
OLLAMA_NUM_PARALLEL
์ ๋๋ฆฌ๋ฉด ๋์ ์์ฒญ ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
์ฌ์ฉ๋ฅ ์ต์ ํ
์ต์ ์ GPU ์ฌ์ฉ๋ฅ ์ ์ํด์๋ --concurrency
๋ฅผ ๋๋ ค์ OLLAMA_NUM_PARALLEL
๊ฐ์ ๋ ๋ฐฐ ์ด๋ด๋ก ์ ์งํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด Ollama์์ ์์ฒญ์ด ํ์ ์ถ๊ฐ๋์ง๋ง ์ฌ์ฉ๋ฅ ์ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. Ollama ์ธ์คํด์ค๋ ํ์ ์์ฒญ์ ์ฆ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ ํ๋ ํธ๋ํฝ ๊ธ์ฆ์ ํก์ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ญ์
์์ฑ๋ ๋ค์ Google Cloud ๋ฆฌ์์ค๋ฅผ ์ญ์ ํฉ๋๋ค.