1. 소개
이 실습에서는 Google Cloud의 AI 기반 공동작업 도구인 Gemini를 사용하여 오류 로그를 분석하고, 문제의 근본 원인을 파악하고, 문제를 해결하는 방법을 찾아 Cloud Functions 배포 문제를 해결합니다.
실습할 내용…
- Cloud Shell 터미널과 gcloud CLI를 사용하여 관련 Google API를 사용 설정하고 제공된 코드에서 Cloud 함수를 만드는 등 환경을 설정합니다.
- Cloud Logging 로그 요약 기능을 사용하여 캡처된 정보를 파악하기 위한 로그 요약을 생성합니다.
- Gemini와 채팅하여 문제 해결 및 해결에 대한 Gemini 지원을 받습니다.
학습할 내용…
- Google Cloud Observability와 함께 Gemini를 사용하고 문제 해결을 위해 사용하는 방법
- Gemini의 도움을 받아 Cloud Functions 로그를 찾고 이해하는 방법
필요한 항목…
- Chrome 웹브라우저
- 결제가 사용 설정된 Google Cloud 프로젝트
- API를 사용 설정하고 리소스를 조작할 수 있는 프로젝트 액세스 권한이 있는 Google 계정
이 실습은 초보자를 포함한 모든 수준의 DevOps 및 플랫폼 엔지니어와 소프트웨어 개발자를 대상으로 합니다. 여기서는 문제 해결에 Gemini의 기능을 직접 사용해 보는 데 중점을 둘 예정입니다.
2. 설정
이 섹션에서는 실습을 시작하는 데 필요한 모든 사항을 다룹니다.
환경 구성
1. https://console.cloud.google.com을 열어 Cloud 콘솔에 로그인합니다.
2. 이 실습에서 사용할 Google Cloud 프로젝트를 선택합니다.

3. 콘솔에서 Cloud Functions 페이지를 엽니다. 탐색 메뉴 (콘솔 창의 왼쪽 상단 아이콘 ☰)에서 Cloud Functions를 선택하면 됩니다.

또는 콘솔의 검색 영역에서 'Cloud Functions'를 검색할 수 있습니다.

함수 목록 상단의 '함수 만들기' 버튼을 클릭합니다. 
이 프로젝트에서 이전에 Cloud Functions를 사용하지 않은 경우 작업을 진행하려면 Google API를 사용 설정하라는 메시지가 표시됩니다.

계속하려면 사용 설정을 클릭합니다.
4. 새 Cloud 함수의 기본 속성을 정의합니다.
- 이름을 '
codelab-cf'로 설정 - 인증되지 않은 호출 허용 옵션을 선택합니다.

이 단계를 완료하려면 창의 왼쪽 하단에 있는 '다음' 버튼을 클릭하세요.

다음을 클릭하면 추가 Google API를 사용 설정하라는 메시지가 표시될 수 있습니다. 4단계와 마찬가지로 사용을 클릭합니다.

Cloud 함수의 런타임 및 코드 설정
이 Codelab에서는 Python을 프로그래밍 언어로 사용합니다. Python에 익숙하지 않아도 걱정하지 마세요. 이 Codelab을 완료하는 데 Python에 대한 지식은 필요하지 않습니다.
5. 함수의 런타임으로 Python 3.11 선택

런타임을 변경하면 인라인 편집기에 표시되는 소스 코드가 변경됩니다.
6. 아래 코드를 인라인 편집기에 복사하여 자동 생성된 빠른 시작 예시를 수정합니다.
from google.cloud import storage
import json
import re
client = storage.Client()
def get_object_list(request):
if request.args and 'path' in request.args:
path = request.args['path']
else:
return '{}'
parsed = re.search('gs:\/\/([a-zA-Z0-9_-]{3,63})\/([-a-zA-Z0-9_\+.\/]*)', path)
bucket, prefix = parsed.group(1), parsed.group(2)
blobs = client.list_blobs(bucket, prefix=prefix, delimiter='/')
objects = []
if (blobs):
for blob in blobs:
objects.append(blob.name)
return json.dumps(objects)
이 코드는 GET 요청에서 path 속성을 읽고, 경로를 파싱하여 버킷 이름을 선택하고, Google Cloud Storage API를 호출하여 이 경로에 저장된 객체 목록을 가져옵니다. 이 함수 (get_object_list)는 Flask 객체인 요청을 입력 인수로 허용하고 객체 이름을 JSON 배열로 반환합니다.
7. 인라인 편집기에 남아 있는 파일 목록에서 requirements.txt 파일을 선택합니다. 아래 코드를 인라인 편집기에 복사하여 현재 종속 항목 목록을 새 목록으로 바꿉니다.
google-cloud-storage
8. Cloud 함수를 배포하려면 왼쪽 하단에서 '배포'를 클릭합니다.

배포 프로세스가 완료될 때까지 몇 분 정도 기다려야 할 수 있습니다. 설정 안내를 주의 깊게 따랐다면 배포가 실패한 것으로 보고될 것입니다.
3. 문제 찾기 및 해결
이 섹션에서는 로그 설명 기능과 기타 Gemini 지원을 사용하여 문제와 해결 방법을 파악합니다.
1. 배포가 실패합니다. 추가 정보와 배포 로그를 볼 수 있는 옵션이 포함된 오류 메시지가 표시됩니다. 로그 보기를 클릭하여 배포 로그를 확인합니다.

배포 로그는 동일한 브라우저의 별도 탭에서 열립니다. 이 Codelab을 완료하려면 탭 간에 이동해야 합니다.
로그 보기를 클릭해도 로그 행이 표시되지 않거나 몇 줄만 표시될 수 있습니다. 이 경우 로그 탐색기의 쿼리 창에서 시간 범위 선택기를 사용하고 최근 30분을 선택합니다.

2. 열린 탭에서 로그를 검토합니다. 로그 요약이 예외의 호출 스택 여러 줄처럼 보입니다. Cloud 함수는 stdout 또는 stderr에 출력된 텍스트를 캡처하고 각 줄을 별도의 로그 항목으로 작성하기 때문입니다. 다른 로그 줄에는 종료 오류 코드에 관한 정보와 Cloud Functions 및 Cloud Run API에서 보고한 추가 정보가 요약되어 있습니다.

선을 클릭하면 특정 로그에 관한 자세한 정보를 확인할 수 있습니다. 펼쳐진 로그에는 추가 UI 요소가 있으며, 이를 클릭하면 로그에 관한 모든 정보를 복사하고, 모든 필드를 펼쳐 로그 항목의 모든 데이터를 표시하고, Gemini를 사용하여 로그 항목을 설명할 수 있습니다.
4. 예외 호출 스택은 그다지 유용하지 않습니다. 로그를 살펴보고 예외의 스택 트레이스 로그 끝을 찾습니다. 'Container called exit(1)'이라고 표시된 줄입니다. 다음 로그 요약에는 다음과 같이 표시됩니다.
functions_framework.exceptions.MissingTargetException: File /workspace/main.py is expected to contain...
조사하기에 적합한 것으로 보입니다. 이 줄을 클릭하여 로그 항목을 펼칩니다. 그런 다음 '이 로그 항목 설명' 버튼을 클릭하여 선택한 로그에 대한 추가 정보를 확인합니다.

이전에 이 프로젝트에서 Gemini를 사용하지 않은 경우 필수 API를 사용 설정하라는 메시지가 표시됩니다. API를 사용 설정하라는 메시지가 표시되면 '사용 설정'을 클릭하여 계속 진행합니다.

Gemini에 프롬프트를 입력할 때 가끔 오류가 발생할 수 있습니다. 이러한 경우 프롬프트 작업을 한 번 더 반복하여 대답을 받으세요. 예를 들어 '이 로그 항목 설명' 버튼을 다시 클릭합니다.
5. Gemini에서 제공하는 설명을 검토합니다. 제공된 설명이 충분하지 않거나 명확하지 않은 경우 다음 프롬프트 중 하나를 사용하거나 직접 질문을 작성하여 Gemini에 추가 정보를 제공하도록 요청하세요.
이 로그에 대해 자세히 알려주세요.
오류에 대해 자세히 알려주세요.
6. 그런 다음 Gemini에게 문제 해결을 위한 제안을 요청합니다. 예를 들어 Gemini에게 다음과 같이 요청할 수 있습니다.
이 문제를 해결하려면 어떻게 해야 하나요?
이 오류를 해결할 수 있는 방법을 제안해 줘
이 오류를 수정할 수 있는 방법을 제안해 줘
Gemini 대답은 현재 맥락과 프롬프트의 문구 및 형식에 따라 달라질 수 있습니다. Gemini는 Cloud 함수의 소스 코드에 hello_http이라는 이름의 함수가 있는지 확인하도록 추천할 것으로 예상됩니다.
7. 현재 Cloud Functions 로그를 보여주는 탭이 표시됩니다. 오류가 표시된 Cloud 함수 배포 페이지가 표시된 이전 탭을 선택하고 '수정'을 클릭합니다.

8. 인증이 여전히 인증되지 않은 호출 허용으로 설정되어 있는지 확인하고 필요한 경우 선택사항을 업데이트합니다.

9. 하단의 '다음'을 클릭하여 인라인 편집기를 확인합니다. Gemini의 추천에 따라 함수 이름을 get_order_list에서 hello_http으로 변경합니다.
수정을 완료한 후 '배포'를 클릭합니다.
배포 프로세스가 완료될 때까지 몇 분 정도 기다려야 할 수 있습니다. 배포가 성공적으로 완료되고 오류 메시지가 표시되지 않는지 확인합니다.
배포 프로세스가 완료될 때까지 콘솔에 마지막 오류 메시지가 계속 표시될 수 있습니다.
10. curl을 사용하여 다음 HTTPS 요청을 전송하여 Cloud 함수가 작동하는지 확인합니다. Cloud Shell을 사용하거나 curl 및 gcloud CLI가 설치된 터미널에서 다음 명령어를 실행하여 이 작업을 수행할 수 있습니다.
curl -m 70 -X GET \
https://us-central1-${GOOGLE_CLOUD_PROJECT}.cloudfunctions.net/\
codelab-cf?path=gs://cloud-samples-data/generative-ai/image/ \
-H "Authorization: bearer $(gcloud auth print-identity-token)"
터미널에서 이 명령어를 실행하려면 gcloud CLI를 사용하여 인증하고 프로젝트 ID 값을 GOOGLE_CLOUD_PROJECT 환경 변수로 설정해야 합니다.
보너스
Python 런타임을 선택하면 함수 이름 hello_http이 HTTP 트리거 Cloud 함수의 기본 진입점으로 정의되었습니다. 대안으로 소스 코드에서 get_order_list을 함수 이름으로 유지하고 런타임 필드 오른쪽의 인라인 편집기 위에 있는 Cloud 함수의 진입점 필드를 업데이트할 수 있습니다.

진입점을 hello_http에서 get_order_list으로 변경하면 배포 문제가 해결됩니다.
4. 삭제
정리하려면 프로젝트를 종료하거나 Cloud 함수 인스턴스를 삭제하면 됩니다. 아래와 같이 콘솔을 사용하거나 CLI 명령어를 사용하여 Cloud 함수를 삭제할 수 있습니다.
gcloud functions delete codelab-cf --region=us-central1
5. 축하합니다.
수고하셨습니다. Gemini를 사용하여 애플리케이션 문제를 해결하고 이제 Gemini가 로그를 이해하고 Google Cloud에 관한 질문에 대한 답변을 얻는 데 어떻게 도움이 되는지 파악하셨습니다.