기본 "Google 번역" 배포 Python 2 Cloud Run (Docker)의 앱

1. 개요

이 Codelab 시리즈 (자기 주도형 실습 튜토리얼)는 개발자가 애플리케이션을 배포할 때 사용할 수 있는 다양한 옵션을 이해하도록 돕는 것을 목표로 합니다. 이 Codelab에서는 Python과 함께 Google Cloud Translation API를 사용하여 로컬에서 실행하거나 Cloud 서버리스 컴퓨팅 플랫폼 (App Engine, Cloud Functions 또는 Cloud Run)에 배포하는 방법을 알아봅니다. 이 튜토리얼의 저장소에 있는 샘플 앱은 사소한 구성 변경만으로 적어도 8가지 방법으로 배포할 수 있습니다.

  1. 로컬 Flask 서버 (Python 2)
  2. 로컬 Flask 서버 (Python 3)
  3. App Engine (Python 2)
  4. App Engine (Python 3)
  5. Cloud Functions (Python 3)
  6. Cloud Run (Docker를 통한 Python 2)
  7. Cloud Run (Docker를 통한 Python 3)
  8. Cloud Run (Cloud 빌드팩을 통한 Python 3)

이 Codelab에서는 위의 굵게 표시된 플랫폼에 이 앱을 배포하는 방법을 중점적으로 다룹니다.

학습 목표

필요한 항목

  • 활성 Cloud Billing 계정이 있는 Google Cloud 프로젝트
  • 로컬 실행을 위해 설치된 Flask 또는 클라우드 기반 배포를 위해 지원되는 클라우드 서버리스 컴퓨팅 플랫폼
  • 기본 Python 기술
  • 기본 운영체제 명령어에 대한 실무 지식

설문조사

본 가이드를 어떻게 사용하실 계획인가요?

<ph type="x-smartling-placeholder"></ph> 읽고 연습 활동을 완료하세요 읽기 전용

귀하의 Python 사용 경험이 어떤지 평가해 주세요.

초급 중급 고급

귀하의 Google Cloud 서비스 사용 경험을 평가해 주세요.

<ph type="x-smartling-placeholder"></ph> 초보자 중급 숙련도

2. 설정 및 요건

자습형 환경 설정

  1. Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
  • 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유해야 하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud Console은 고유한 문자열을 자동으로 생성합니다. 일반적으로 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID를 참조해야 하며(일반적으로 PROJECT_ID로 식별됨), 마음에 들지 않는 경우 임의로 다시 생성하거나 직접 지정해서 사용할 수 있는지 확인하세요. 프로젝트가 생성되면 프로젝트 ID가 '고정'됩니다.
  • 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참조하세요.
  1. 다음으로 Cloud 리소스/API를 사용하려면 Cloud Console에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼을 마친 후 비용이 결제되지 않도록 리소스를 종료하려면 Codelab의 끝에 있는 '삭제' 안내를 따르세요. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.

3. Translation API 사용 설정

Cloud API 사용 설정하기

이 섹션에서는 일반적으로 Google API를 사용 설정하는 방법을 알아봅니다. 샘플 앱에서는 Cloud Translation API, Cloud Run, Cloud Artifact Registry를 사용 설정합니다.

소개

애플리케이션에서 어떤 Google API를 사용하든 사용 설정되어 있어야 합니다. 다음 예시에서는 Cloud Vision API를 사용 설정하는 두 가지 방법을 보여줍니다. 하나의 Cloud API를 사용 설정하는 방법을 학습하면 프로세스가 유사하기 때문에 다른 API를 사용 설정할 수 있습니다.

옵션 1: Cloud Shell 또는 명령줄 인터페이스에서

Cloud 콘솔에서 API를 사용 설정하는 것이 더 일반적이지만 일부 개발자는 명령줄에서 모든 작업을 수행하는 것을 선호합니다. 이렇게 하려면 API의 '서비스 이름'을 조회해야 합니다. URL(SERVICE_NAME.googleapis.com)과 같은 형식입니다. 지원되는 제품 차트에서 확인하거나 Google Discovery API를 사용하여 프로그래매틱 방식으로 쿼리할 수 있습니다.

이 정보를 확보한 상태에서 Cloud Shell (또는 gcloud 명령줄 도구가 설치된 로컬 개발 환경)을 사용하여 다음과 같이 API를 사용 설정할 수 있습니다.

gcloud services enable SERVICE_NAME.googleapis.com

예를 들어 다음 명령어는 Cloud Vision API를 사용 설정합니다.

gcloud services enable vision.googleapis.com

이 명령어는 App Engine을 사용 설정합니다.

gcloud services enable appengine.googleapis.com

요청 한 번으로 여러 API를 사용 설정할 수도 있습니다. 예를 들어 다음 명령줄은 Cloud Run, Cloud Artifact Registry, Cloud Translation API를 사용 설정합니다.

gcloud services enable artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com

옵션 2: Cloud 콘솔에서

API 관리자에서 Vision API를 사용 설정할 수도 있습니다. Cloud 콘솔에서 API 관리자로 이동하고 라이브러리를 선택합니다.

fb0f1d315f122d4a.png

Cloud Vision API를 사용 설정하려면 'vision'을 입력합니다. 를 검색하고 지금까지 입력한 내용과 일치하는 모든 항목이 표시됩니다.

2275786a24f8f204.png

사용 설정하려는 API를 선택하고 사용 설정을 클릭합니다.

2556f923b628e31.png

비용

많은 Google API를 무료로 사용할 수 있지만 Google Cloud 제품 및 API는 무료가 아닙니다. Cloud API를 사용 설정할 때 활성 결제 계정을 입력하라는 메시지가 표시될 수 있습니다. 하지만 일부 Google Cloud 제품은 '항상 무료' 등급 (일일/매월)이며, 요금이 청구되기 위해 이를 초과해야 합니다. 그렇지 않으면 신용카드 (또는 지정된 결제 수단)에 요금이 청구되지 않습니다.

사용자는 API를 사용 설정하기 전에 API의 가격 책정 정보를 참조해야 하며, 특히 무료 등급이 있는지 여부와 무료 등급이 있는 경우에는 어떤 것이 있는지 확인해야 합니다. Cloud Vision API를 사용 설정하는 경우 가격 책정 정보 페이지를 확인하시기 바랍니다. Cloud Vision에는 무료 할당량이 있으며, 집계 한도 내에서 (매월) 요금이 부과되지 않습니다.

가격 책정과 무료 등급은 Google API에 따라 다릅니다. 예:

각 Google 제품마다 결제 방식이 다르므로, API 문서에서 해당 정보를 확인해야 합니다.

요약

Google API를 사용 설정하는 일반적인 방법을 알게 되었으므로 API 관리자로 이동하여 Cloud Translation API, Cloud Run, Cloud Artifact Registry를 사용 설정합니다 (아직 사용 설정하지 않은 경우). 애플리케이션에서 사용하기 때문에 전자를 사용 설정합니다. Cloud Run 서비스를 시작하기 위해 배포하기 전에 컨테이너 이미지가 여기에 저장되므로 후자를 사용 설정하므로 해당 기능을 사용 설정해야 합니다. gcloud 도구로 모두 사용 설정하려면 터미널에서 대신 다음 명령어를 실행하세요.

gcloud services enable artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com

월별 할당량이 전체 '항상 무료' 등급 요약 페이지에 나와 있습니다. Translation API 가격 책정 페이지에는 모든 사용자에게 매월 고정 금액의 번역된 문자가 제공된다고 명시되어 있습니다. 이 기준액 미만을 유지할 경우 API에서 요금이 발생하지 않습니다. 다른 Google Cloud 관련 요금이 있는 경우 마지막에 '삭제' 섹션에서 설명합니다. 섹션으로 이동합니다.

4. 샘플 앱 코드 가져오기

로컬 또는 Cloud Shell에서 저장소의 코드를 클론하거나 (git clone 명령어 사용) 다음 스크린샷과 같이 녹색 코드 버튼에서 ZIP 파일을 다운로드합니다.

5cd6110c4414cf65.png

이제 모든 것을 갖추었으므로 이 특정 튜토리얼을 수행하기 위해 폴더의 전체 사본을 만듭니다. 파일을 삭제하거나 변경해야 할 가능성이 높기 때문입니다. 다른 배포를 수행하려면 원본을 복사하여 다시 시작하면 됩니다. 그러면 복제하거나 다시 다운로드할 필요가 없습니다.

5. 샘플 앱 둘러보기

샘플 앱은 사용자에게 영어로 텍스트를 입력하고 해당 텍스트를 스페인어로 번역하도록 요청하는 간단한 Google 번역 파생 앱입니다. 이제 main.py 파일을 열어 작동 방식을 확인해 보겠습니다. 라이선스에 관한 설명 줄을 생략하면 상단과 하단에 다음과 같이 표시됩니다.

from flask import Flask, render_template, request
import google.auth
from google.cloud import translate

app = Flask(__name__)
_, PROJECT_ID = google.auth.default()
TRANSLATE = translate.TranslationServiceClient()
PARENT = 'projects/{}'.format(PROJECT_ID)
SOURCE, TARGET = ('en', 'English'), ('es', 'Spanish')

# . . . [translate() function definition] . . .

if __name__ == '__main__':
    import os
    app.run(debug=True, threaded=True, host='0.0.0.0',
            port=int(os.environ.get('PORT', 8080)))
  1. 가져오기에는 Flask 기능, google.auth 모듈, Cloud Translation API 클라이언트 라이브러리가 포함됩니다.
  2. 전역 변수는 Flask 앱, Cloud 프로젝트 ID, Translation API 클라이언트, 상위 '위치 경로'를 나타냅니다. 번역 API 호출, 출발어와 도착어를 지원합니다. 이 경우 영어 (en)와 스페인어 (es)가 표시되지만 Cloud Translation API에서 지원하는 다른 언어 코드로 자유롭게 변경할 수 있습니다.
  3. 하단의 큰 if 블록은 이 앱을 로컬에서 실행하기 위한 튜토리얼에서 사용됩니다. Flask 개발 서버를 활용하여 앱을 제공합니다. 이 섹션은 웹 서버가 컨테이너에 번들되지 않은 경우 Cloud Run 배포 튜토리얼도 다룹니다. 컨테이너에 서버를 번들로 묶으라는 메시지가 표시되지만, 이를 간과할 경우 앱 코드는 Flask 개발 서버를 사용하는 것으로 대체됩니다. (App Engine 또는 Cloud Functions는 소스 기반 플랫폼이므로 Google Cloud에서 기본 웹 서버를 제공하고 실행하므로 문제가 되지 않습니다.)

마지막으로 main.py 중앙에는 애플리케이션의 핵심인 translate() 함수가 있습니다.

@app.route('/', methods=['GET', 'POST'])
def translate(gcf_request=None):
    """
    main handler - show form and possibly previous translation
    """

    # Flask Request object passed in for Cloud Functions
    # (use gcf_request for GCF but flask.request otherwise)
    local_request = gcf_request if gcf_request else request

    # reset all variables (GET)
    text = translated = None

    # if there is data to process (POST)
    if local_request.method == 'POST':
        text = local_request.form['text']
        data = {
            'contents': [text],
            'parent': PARENT,
            'target_language_code': TARGET[0],
        }
        # handle older call for backwards-compatibility
        try:
            rsp = TRANSLATE.translate_text(request=data)
        except TypeError:
            rsp = TRANSLATE.translate_text(**data)
        translated = rsp.translations[0].translated_text

    # create context & render template
    context = {
        'orig':  {'text': text, 'lc': SOURCE},
        'trans': {'text': translated, 'lc': TARGET},
    }
    return render_template('index.html', **context)

기본 함수는 사용자 입력을 받아 Translation API를 호출하여 복잡한 작업을 수행하는 작업을 수행합니다. 이를 분석해 보겠습니다.

  1. local_request 변수를 사용하여 Cloud Functions에서 요청이 오는지 확인합니다. Cloud Functions는 자체 Flask 요청 객체를 전송하지만, 로컬에서 실행되거나 App Engine 또는 Cloud Run에 배포되는 다른 모든 객체는 요청 객체를 Flask에서 직접 가져옵니다.
  2. 양식의 기본 변수를 재설정합니다. POST 요청에는 이를 대체하는 데이터가 있으므로 주로 GET 요청에 사용합니다.
  3. POST인 경우 번역할 텍스트를 가져와 API 메타데이터 요구사항을 나타내는 JSON 구조를 만듭니다. 그런 다음 API를 호출하고 사용자가 이전 라이브러리를 사용하고 있는 경우 이전 버전의 API로 돌아갑니다.
  4. 이와 관계없이 실제 결과 (POST) 또는 데이터 없음 (GET)의 형식을 템플릿 컨텍스트로 지정하고 렌더링합니다.

애플리케이션의 시각적 부분은 템플릿 index.html 파일에 있습니다. 이전에 번역된 결과 (그렇지 않으면 비어 있음)가 표시되고 그 다음에 번역할 내용을 요청하는 양식이 표시됩니다.

<!doctype html>
<html><head><title>My Google Translate 1990s</title><body>
<h2>My Google Translate (1990s edition)</h2>

{% if trans['text'] %}
    <h4>Previous translation</h4>
    <li><b>Original</b>:   {{ orig['text'] }}  (<i>{{ orig['lc'][0] }}</i>)</li>
    <li><b>Translated</b>: {{ trans['text'] }} (<i>{{ trans['lc'][0] }}</i>)</li>
{% endif %}

<h4>Enter <i>{{ orig['lc'][1] }}</i> text to translate to <i>{{ trans['lc'][1] }}</i>:</h4>
<form method="POST"><input name="text"><input type="submit"></form>
</body></html>

6. 서비스 배포

이제 다음 명령어를 실행하여 변환 서비스를 Cloud Run에 배포할 준비가 되었습니다.

gcloud run deploy translate --source . --allow-unauthenticated --platform managed

출력은 다음과 같으며, 다음 단계를 위한 프롬프트를 제공합니다.

$ gcloud run deploy translate --source . --allow-unauthenticated --platform managed
Please specify a region:
 [1] asia-east1
 [2] asia-east2
. . . (other regions) . . .
 [28] us-west4
 [29] cancel
Please enter your numeric choice:  REGION_CHOICE

To make this the default region, run `gcloud config set run/region REGION`.

Deploying from source requires an Artifact Registry repository to
store build artifacts. A repository named [cloud-run-source-deploy] in
 region [REGION] will be created.

Do you want to continue (Y/n)?

This command is equivalent to running "gcloud builds submit --pack image=[IMAGE] ." and "gcloud run deploy translate --image [IMAGE]"

Building . . . and deploying container to Cloud Run service [translate] in project [PROJECT_ID] region [REGION]
✓ Building and deploying... Done.
  ✓ Creating Container Repository...
  ✓ Uploading sources...
  ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/60e1b
  9bb-b991-4b4e-8d8a-HASH?project=PROJECT_NUMBER].
  ✓ Creating Revision...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [translate] revision [translate-00001-xyz] has been deployed and is serving 100 percent of traffic.
Service URL: https://SVC_NAME-HASH-REG_ABBR.a.run.app

이제 전 세계에서 앱을 사용할 수 있으므로 배포 출력과 같이 프로젝트 ID가 포함된 URL을 통해 앱에 연결할 수 있습니다.

169f6edf5f7d2068.png

내용을 번역하여 확인해 보세요.

31554e71cb80f1b4.png

7. 결론

축하합니다. 지금까지 Cloud Translation API를 사용 설정하고, 필요한 사용자 인증 정보를 가져오고, 간단한 웹 앱을 Python 2 Cloud Run에 배포하는 방법을 알아보았습니다. 저장소의 이 표에서 이 배포에 대해 자세히 알아볼 수 있습니다.

삭제

Cloud Translation API를 사용하면 매월 정해진 양의 번역된 문자를 무료로 수행할 수 있습니다. App Engine에는 무료 할당량도 있으며 Cloud FunctionsCloud Run도 마찬가지입니다. 둘 중 하나를 초과하면 요금이 부과됩니다. 다음 Codelab으로 진행할 계획이라면 앱을 종료하지 않아도 됩니다.

하지만 아직 다음 튜토리얼로 진행할 준비가 되지 않았거나 방금 배포한 앱을 인터넷에서 발견한 것이 걱정된다면 App Engine 앱을 사용 중지하거나, Cloud 함수를 삭제하거나, Cloud Run 서비스를 사용 중지하여 요금이 청구되지 않도록 하세요. 다음 Codelab으로 이동할 준비가 되었으면 이를 다시 사용 설정하면 됩니다. 반면 이 애플리케이션이나 다른 Codelab을 계속 진행하지 않고 모든 항목을 완전히 삭제하려면 프로젝트를 종료하면 됩니다.

또한 Google Cloud 서버리스 컴퓨팅 플랫폼에 배포하면 약간의 빌드 및 스토리지 비용이 발생합니다. Cloud Build에는 Cloud Storage와 마찬가지로 자체 무료 할당량이 있습니다. 투명성을 높이기 위해 Cloud Build에서 애플리케이션 이미지를 빌드한 다음, 후속 이미지인 Cloud Container Registry 또는 Artifact Registry에 저장됩니다. 해당 이미지의 스토리지는 이미지를 서비스로 전송할 때 네트워크 이그레스와 마찬가지로 해당 할당량의 일부를 사용합니다. 하지만 이러한 무료 등급이 없는 지역에 거주할 수도 있으므로 잠재적인 비용을 최소화하려면 저장용량 사용량에 유의해야 합니다.

8. 추가 리소스

다음 섹션에서는 추가 읽기 자료와 권장 연습문제를 통해 이 튜토리얼을 완료함으로써 얻은 지식을 강화할 수 있습니다.

추가 연구

이제 Translation API를 사용해 본 경험이 있으므로 기술을 더욱 발전시키기 위한 몇 가지 추가 연습을 해보겠습니다. 학습 과정을 계속하려면 샘플 앱을 다음과 같이 수정하세요.

  1. 이 Codelab의 다른 모든 버전을 완료하여 로컬에서 실행하거나 Google Cloud 서버리스 컴퓨팅 플랫폼에 배포합니다 (저장소 리드미 참고).
  2. 다른 프로그래밍 언어를 사용하여 이 가이드를 완료합니다.
  3. 다른 출발어 또는 도착어를 지원하도록 애플리케이션을 변경하세요.
  4. 텍스트를 둘 이상의 언어로 번역할 수 있도록 이 애플리케이션을 업그레이드합니다. 지원되는 도착어의 풀다운 메뉴를 포함하도록 템플릿 파일을 변경합니다.

자세히 알아보기

Google App Engine

Google Cloud Functions

Google Cloud Run

Google Cloud 빌드팩, Container Registry, Artifact Registry

Google Cloud Translation 및 Google ML Kit

기타 Google Cloud 제품/페이지

Python 및 Flask

라이선스

이 튜토리얼은 Creative Commons Attribution 2.0 일반 라이선스에 따라 사용이 허가되며 저장소의 소스 코드에는 Apache 2 라이선스가 부여됩니다.