1. 개요
웹 애플리케이션을 처음 배포하는 것은 쉽지 않을 수 있습니다. 첫 번째 배포 후에도 프로세스가 너무 많은 경우 새 버전의 애플리케이션을 배포하지 않을 수 있습니다. 지속적 배포를 사용하면 애플리케이션 변경사항을 간편하게 자동으로 배포할 수 있습니다.
이 실습에서는 웹 애플리케이션을 작성하고 애플리케이션의 소스 코드가 변경될 때 애플리케이션을 자동으로 배포하도록 Cloud Run을 구성합니다. 그런 다음 애플리케이션을 수정하고 다시 배포합니다.
학습할 내용
- Cloud Shell 편집기로 웹 애플리케이션 작성
- GitHub에 애플리케이션 코드 저장
- Cloud Run에 애플리케이션 자동 배포
- Vertex AI를 사용하여 애플리케이션에 생성형 AI 추가
2. 기본 요건
- 아직 Google 계정이 없다면 Google 계정을 만들어야 합니다.
- 직장 또는 학교 계정이 아닌 개인 계정을 사용합니다. 직장 및 학교 계정에는 이 실습에 필요한 API를 사용 설정할 수 없도록 하는 제한사항이 있을 수 있습니다.
- 아직 GitHub 계정이 없다면 GitHub 계정을 만들어야 합니다.
- 기존 GitHub 계정이 있는 경우 이를 사용합니다. GitHub는 새 계정을 스팸으로 차단할 가능성이 높습니다.
- 계정이 스팸으로 표시될 가능성을 줄이려면 GitHub 계정에 2단계 인증을 구성하세요.
3. 프로젝트 설정
- Google Cloud 콘솔에 로그인합니다.
- Cloud 콘솔에서 결제를 사용 설정합니다.
- 이 실습을 완료하는 데 드는 Cloud 리소스 비용은 미화 1달러 미만입니다.
- 이 실습의 끝에 있는 단계에 따라 리소스를 삭제하면 추가 비용이 발생하지 않습니다.
- 신규 사용자는 미화 300달러 상당의 무료 체험판을 이용할 수 있습니다.
- 개발자를 위한 생성형 AI 이벤트에 참석하시나요? 1달러 상당의 크레딧이 제공될 수 있습니다.
- 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다.
4. Cloud Shell 편집기 열기
- Cloud Shell 편집기로 이동합니다.
- 터미널이 화면 하단에 표시되지 않으면 다음과 같이 엽니다.
- 햄버거 메뉴 를 클릭합니다.
- 터미널을 클릭합니다.
- 새 터미널을 클릭합니다.
- 터미널에서 다음 명령어를 사용하여 프로젝트를 설정합니다.
- 형식:
gcloud config set project [PROJECT_ID]
- 예:
gcloud config set project lab-project-id-example
- 프로젝트 ID를 기억할 수 없는 경우 다음 안내를 따르세요.
- 다음을 사용하여 모든 프로젝트 ID를 나열할 수 있습니다.
gcloud projects list | awk '/PROJECT_ID/{print $2}'
- 다음을 사용하여 모든 프로젝트 ID를 나열할 수 있습니다.
- 형식:
- 승인하라는 메시지가 표시되면 승인을 클릭하여 계속 진행합니다.
- 다음 메시지가 표시되어야 합니다.
Updated property [core/project].
WARNING
이 표시되고Do you want to continue (Y/N)?
메시지가 표시되면 프로젝트 ID를 잘못 입력했을 가능성이 큽니다.N
를 누른 다음Enter
를 누르고gcloud config set project
명령어를 다시 실행해 봅니다.
5. API 사용 설정
터미널에서 API를 사용 설정합니다.
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
aiplatform.googleapis.com
이 명령어를 완료하는 데 몇 분 정도 걸릴 수 있지만 결국 다음과 비슷한 성공 메시지가 표시됩니다.
Operation "operations/acf.p2-73d90d00-47ee-447a-b600" finished successfully.
6. Git 구성
- 전역 Git 사용자 이메일을 설정합니다.
git config --global user.email "you@example.com"
- 전역 Git 사용자 이름을 설정합니다.
git config --global user.name "Your Name"
- 전역 git 기본 브랜치를
main
로 설정합니다.git config --global init.defaultBranch main
7. 코드 작성
Go로 애플리케이션을 작성하려면 다음 안내를 따르세요.
- 홈 디렉터리로 이동합니다.
cd ~
codelab-genai
디렉터리를 만듭니다.mkdir codelab-genai
codelab-genai
디렉터리로 이동합니다.cd codelab-genai
- go.mod 파일을 초기화하여 모듈을 선언합니다.
go mod init codelab-genai
main.go
파일을 만듭니다.touch main.go
- Cloud Shell 편집기에서
main.go
파일을 엽니다. 이제 빈 파일이 화면 상단에 표시됩니다. 여기에서 이cloudshell edit main.go
main.go
파일을 수정할 수 있습니다. main.go
를 수정하고 다음 코드를 붙여넣습니다. 몇 초 후 Cloud Shell 편집기에서 코드를 자동으로 저장합니다. 이 코드는 'Hello world!' 인사로 HTTP 요청에 응답합니다.package main import ( "fmt" "log" "net/http" "os" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, world!") }) port := os.Getenv("PORT") if port == "" { port = "8080" } if err := http.ListenAndServe(":"+port, nil); err != nil { log.Fatal(err) } }
애플리케이션의 초기 코드가 완료되었으며 버전 제어에 저장할 준비가 되었습니다.
8. 저장소 만들기
- 화면 하단의 Cloud Shell 터미널로 돌아갑니다.
- 여전히 올바른 디렉터리에 있는지 확인합니다.
cd ~/codelab-genai
- Git 저장소 초기화
git init -b main
- GitHub CLI에 로그인
gh auth login
Enter
키를 눌러 기본 옵션을 수락하고 다음을 포함하여 GitHub CLI 도구의 안내를 따릅니다.- 어떤 계정에 로그인하시겠어요?
GitHub.com
- 이 호스트에서 Git 작업에 사용하는 프로토콜은 무엇인가요?
HTTPS
- GitHub 사용자 인증 정보로 Git을 인증하나요?
Y
(이 아이콘이 표시되지 않으면 건너뜁니다.) - GitHub CLI를 어떻게 인증하시겠어요?
Login with a web browser
- 일회성 코드 복사
- https://github.com/login/device를 엽니다.
- 일회성 코드 붙여넣기
- GitHub 승인을 클릭합니다.
- 로그인 완료
- 어떤 계정에 로그인하시겠어요?
- 로그인되어 있는지 확인합니다.
로그인에 성공하면 GitHub 사용자 이름이 출력됩니다.gh api user -q ".login"
GITHUB_USERNAME
변수 만들기GITHUB_USERNAME=$(gh api user -q ".login")
- 환경 변수를 만들었는지 확인합니다.
변수를 만들었다면 GitHub 사용자 이름이 출력됩니다.echo ${GITHUB_USERNAME}
codelab-genai
라는 빈 GitHub 저장소를 만듭니다. 다음과 같은 오류가 발생하는 경우:gh repo create codelab-genai --private
이 경우 이미GraphQL: Name already exists on this account (createRepository)
codelab-genai
라는 저장소가 있습니다. 이 튜토리얼을 계속 진행하는 방법에는 두 가지가 있습니다.- 기존 GitHub 저장소 삭제
- 다른 이름으로 저장소를 만들고 다음 명령어에서 이름을 변경해야 합니다.
codelab-genai
저장소를 원격origin
로 추가합니다.git remote add origin https://github.com/${GITHUB_USERNAME}/codelab-genai
9. 코드 공유
- 올바른 디렉터리에 있는지 확인합니다.
cd ~/codelab-genai
- 현재 디렉터리의 모든 파일을 이 커밋에 추가합니다.
git add .
- 첫 번째 커밋을 만듭니다.
git commit -m "add http server"
origin
저장소의main
브랜치로 커밋을 푸시합니다.git push -u origin main
이 명령어를 실행하고 결과 URL을 방문하여 GitHub에서 애플리케이션 코드를 볼 수 있습니다.
echo -e "\n\nTo see your code, visit this URL:\n \
https://github.com/${GITHUB_USERNAME}/codelab-genai/blob/main/main.go \n\n"
10. 자동 배포 설정
- Cloud Shell 편집기 탭을 열어 둡니다. 이 탭은 나중에 다시 살펴보겠습니다.
- 새 탭에서 Cloud Run 페이지로 이동합니다.
- 콘솔 에서 올바른 Google Cloud 프로젝트를 선택합니다.
- 저장소 연결을 클릭합니다.
- Cloud Build로 설정을 클릭합니다.
- 저장소 제공업체로 GitHub를 선택합니다.
- 브라우저에서 GitHub 계정에 로그인하지 않은 경우 사용자 인증 정보로 로그인합니다.
- Authenticate를 클릭한 다음 Continue를 클릭합니다.
- 로그인하면 Cloud Run 페이지에 저장소에 GitHub 앱이 설치되지 않았습니다.라는 메시지가 표시됩니다.
- Google Cloud Build 설치 버튼을 클릭합니다.
- 설치 설정 페이지에서 저장소만 선택을 선택하고 CLI를 통해 만든 codelab-genai 저장소를 선택합니다.
- 설치를 클릭합니다.
- 참고: GitHub 저장소가 많은 경우 로드하는 데 몇 분 정도 걸릴 수 있습니다.
- 저장소로
your-user-name/codelab-genai
를 선택합니다.- 저장소가 표시되지 않으면 연결된 저장소 관리 링크를 클릭합니다.
- 브랜치를
^main$
로 둡니다. - Google Cloud 빌드팩을 통한 Go, Node.js, Python, Java, .NET Core, Ruby 또는 PHP를 클릭합니다.
- 다른 필드 (
Build context directory
,Entrypoint
,Function target
)는 그대로 둡니다.
- 다른 필드 (
- 저장을 클릭합니다.
- 저장소 제공업체로 GitHub를 선택합니다.
- 인증까지 아래로 스크롤합니다.
- 인증되지 않은 호출 허용을 클릭합니다.
- 만들기를 클릭합니다.
빌드가 완료되면 (몇 분 정도 걸림) 이 명령어를 실행하고 결과 URL을 방문하여 실행 중인 애플리케이션을 확인합니다.
echo -e "\n\nOnce the build finishes, visit your live application:\n \
"$( \
gcloud run services list | \
grep codelab-genai | \
awk '/URL/{print $2}' | \
head -1 \
)" \n\n"
11. 코드 변경
- 화면 하단의 Cloud Shell 터미널로 돌아갑니다.
- 여전히 올바른 디렉터리에 있는지 확인합니다.
cd ~/codelab-genai
- Cloud Shell 편집기에서
main.go
다시 열기cloudshell edit main.go
- Go용 Vertex AI SDK를 설치합니다.
go get cloud.google.com/go/vertexai/genai
- Go용 메타데이터 라이브러리를 설치하여 현재 프로젝트 ID를 가져옵니다.
go get cloud.google.com/go/compute/metadata
main.go
파일의 코드를 다음으로 바꿉니다.package main import ( "context" "fmt" "log" "net/http" "os" "cloud.google.com/go/compute/metadata" "cloud.google.com/go/vertexai/genai" ) func main() { ctx := context.Background() var projectId string var err error projectId = os.Getenv("GOOGLE_CLOUD_PROJECT") if projectId == "" { projectId, err = metadata.ProjectIDWithContext(ctx) if err != nil { return } } var client *genai.Client client, err = genai.NewClient(ctx, projectId, "us-central1") if err != nil { return } defer client.Close() model := client.GenerativeModel("gemini-1.5-flash-001") http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { animal := r.URL.Query().Get("animal") if animal == "" { animal = "dog" } resp, err := model.GenerateContent( ctx, genai.Text( fmt.Sprintf("Give me 10 fun facts about %s. Return the results as HTML without markdown backticks.", animal)), ) if err != nil { w.WriteHeader(http.StatusServiceUnavailable) return } if len(resp.Candidates) > 0 && len(resp.Candidates[0].Content.Parts) > 0 { htmlContent := resp.Candidates[0].Content.Parts[0] w.Header().Set("Content-Type", "text/html; charset=utf-8") fmt.Fprint(w, htmlContent) } }) port := os.Getenv("PORT") if port == "" { port = "8080" } if err := http.ListenAndServe(":"+port, nil); err != nil { log.Fatal(err) } }
12. 다시 배포
- Cloud Shell에서 여전히 올바른 디렉터리에 있는지 확인합니다.
cd ~/codelab-genai
- 다음 명령어를 실행하여 새 버전의 애플리케이션을 로컬 Git 저장소에 커밋합니다.
git add . git commit -m "add latest changes"
- GitHub에 변경사항을 푸시합니다.
git push
- 빌드가 완료되면 이 명령어를 실행하고 배포된 애플리케이션을 방문합니다.
echo -e "\n\nOnce the build finishes, visit your live application:\n \ "$( \ gcloud run services list | \ grep codelab-genai | \ awk '/URL/{print $2}' | \ head -1 \ )" \n\n"
빌드가 완료되고 변경사항이 표시되기까지 몇 분 정도 걸릴 수 있습니다.
여기에서 모든 버전의 기록을 확인할 수 있습니다. https://console.cloud.google.com/run/detail/us-central1/codelab-genai/revisions
13. (선택사항) Vertex AI 사용 감사
다른 Google Cloud 서비스와 마찬가지로 Vertex AI 작업을 감사할 수 있습니다. 감사 로그는 '누가, 언제, 어디서, 무엇을 했나?'와 같은 질문의 답을 확인하는 데 도움이 됩니다. Vertex AI의 관리 감사 로그는 기본적으로 사용 설정되어 있습니다. 콘텐츠 생성 요청을 감사하려면 데이터 액세스 감사 로그를 사용 설정해야 합니다.
- Google Cloud 콘솔에서 감사 로그 페이지로 이동합니다.
검색창을 사용하여 이 페이지를 찾은 경우 부제목이 IAM 및 관리자인 결과를 선택합니다. - Cloud Run 애플리케이션을 만드는 Google Cloud 프로젝트가 기존 프로젝트인지 확인합니다.
- 데이터 액세스 감사 로그 구성 표에서 서비스 열에서
Vertex AI API
를 선택합니다. - 로그 유형 탭에서 데이터 액세스 감사 로그 유형
Admin read
및Data read
를 선택합니다. - 저장을 클릭합니다.
사용 설정하면 애플리케이션을 호출할 때마다 감사 로그를 볼 수 있습니다. 호출 세부정보가 포함된 감사 로그를 보려면 다음 단계를 따르세요.
- 배포된 애플리케이션으로 돌아가서 페이지를 새로고침하여 로그를 트리거합니다.
- Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.
- 쿼리 창에 다음을 입력합니다.
LOG_ID("cloudaudit.googleapis.com%2Fdata_access") protoPayload.serviceName="aiplatform.googleapis.com"
- 쿼리 실행을 클릭합니다.
감사 로그는 Vertex AI API 사용을 캡처하지만 프롬프트나 응답 세부정보와 같은 워크로드 관련 데이터는 관찰할 수 없습니다.
14. (선택사항) AI 워크로드의 관측 가능성 향상
감사 로그에는 워크로드 관련 정보가 포함되지 않습니다. 워크로드의 관측 가능성을 높이려면 이 정보를 명시적으로 로깅해야 합니다. 이를 위해 좋아하는 로깅 프레임워크를 사용할 수 있습니다. 다음 단계에서는 Go의 구조화된 로깅 라이브러리를 사용하여 이를 수행하는 한 가지 방법을 보여줍니다.
- Cloud Shell 편집기에서
main.go
다시 열기cloudshell edit ~/codelab-genai/main.go
- Go의 구조화된 로깅 및 JSON 라이브러리를 포함하도록 가져오기 블록을 변경합니다.
import ( "context" "encoding/json" "fmt" "log" "log/slog" "net/http" "os" "cloud.google.com/go/compute/metadata" "cloud.google.com/go/vertexai/genai" )
- Vertex 클라이언트를 초기화한 후 (33번 줄) 다음 줄을 추가하여 Google Cloud Logging에 적절한 필드를 사용하는 구조화된 로거를 초기화합니다.
opts := &slog.HandlerOptions{ Level: slog.LevelDebug, ReplaceAttr: func(group []string, a slog.Attr) slog.Attr { if a.Key == slog.LevelKey { return slog.Attr{Key: "severity", Value: a.Value} } if a.Key == slog.MessageKey { return slog.Attr{Key: "message", Value: a.Value} } return slog.Attr{Key: a.Key, Value: a.Value} }, } jsonHandler := slog.NewJSONHandler(os.Stdout, opts) slog.SetDefault(slog.New(jsonHandler))
GenerateContent
에 대한 응답을 확인한 후 (69번 줄) if 블록 내에 다음 줄을 추가합니다. 이 코드는 구조화된 로깅 형식을 사용하여 생성된 콘텐츠에 관한 정보를jsonBytes, err := json.Marshal(resp) if err != nil { slog.Error("Failed to marshal response to JSON", "error", err) } else { jsonString := string(jsonBytes) slog.Debug("Complete response content", "json_response", jsonString) }
stdout
에 씁니다. Cloud Run의 Logging 에이전트는stdout
에 출력된 출력을 캡처하고 이 형식을 Cloud Logging에 기록합니다.- Cloud Shell을 다시 열고 다음 명령어를 입력하여 올바른 디렉터리에 있는지 확인합니다.
cd ~/codelab-genai
- 변경사항을 커밋합니다.
git commit -am "Observe generated content"
- GitHub에 변경사항을 푸시하여 수정된 버전의 재배포를 트리거합니다.
git push
새 버전이 배포되면 Vertex AI 호출에 관한 디버그 정보를 확인할 수 있습니다.
애플리케이션 로그를 보려면 다음 단계를 따르세요.
- Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.
- 쿼리 창에 다음을 입력합니다.
LOG_ID("run.googleapis.com%2Fstdout") severity=DEBUG
- 쿼리 실행을 클릭합니다.
쿼리 결과에는 프롬프트와 안전 관행 모니터링에 사용할 수 있는 '안전 등급'을 포함한 Vertex AI 응답이 포함된 로그가 표시됩니다.
15. (선택사항) 정리
Cloud Run에서는 서비스를 사용하지 않을 때 비용이 청구되지 않지만 Artifact Registry에 컨테이너 이미지를 저장하는 데 요금이 부과될 수 있습니다. 비용이 청구되지 않도록 Cloud 프로젝트를 삭제할 수 있습니다. Cloud 프로젝트를 삭제하면 해당 프로젝트 내에서 사용되는 모든 리소스에 대한 청구가 중단됩니다.
원하는 경우 프로젝트를 삭제합니다.
gcloud projects delete $GOOGLE_CLOUD_PROJECT
CloudShell 디스크에서 불필요한 리소스를 삭제할 수도 있습니다. 다음과 같은 작업을 할 수 있습니다.
- Codelab 프로젝트 디렉터리를 삭제합니다.
rm -rf ~/codelab-genai
- 더 이상 필요하지 않은 go 패키지를 정리합니다.
cd ~ go clean -modcache
- 경고 이 작업은 실행취소할 수 없습니다. Cloud Shell에서 모든 항목을 삭제하여 공간을 확보하려면 전체 홈 디렉터리를 삭제하면 됩니다. 보관하려는 모든 항목이 다른 곳에 저장되어 있는지 확인합니다.
sudo rm -rf $HOME
16. 축하합니다
이 실습에서는 웹 애플리케이션을 작성하고 애플리케이션의 소스 코드가 변경될 때 애플리케이션을 자동으로 배포하도록 Cloud Run을 구성했습니다. 그런 다음 애플리케이션을 수정하고 다시 배포했습니다.
이 실습이 마음에 들었다면 다른 코딩 언어 또는 프레임워크로 다시 시도해 보세요.
현재 사용 중인 제품을 개선하기 위한 사용자 경험 (UX) 연구에 참여하고 싶다면 여기에서 등록하세요.
다음은 학습을 계속할 수 있는 몇 가지 옵션입니다.
- 문서: Firebase GenKit를 유연한 모델 추상화로 사용하여 모든 모델 API를 쉽게 통합하고 커뮤니티에서 유지관리하는 모델을 사용할 수 있습니다.
- Codelab: Cloud Run에 Gemini 지원 채팅 앱을 배포하는 방법
- Cloud Run에서 Gemini 함수 호출을 사용하는 방법
- 주문형 워크샵: Google Kubernetes Engine 온보딩
- Cloud Run Jobs Video Intelligence API를 사용하여 동영상을 장면별로 처리하는 방법