기본 "Google 번역" 배포 Python 2 App Engine의 앱

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 Buildpacks를 통한 Python 3)

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

학습 목표

필요한 항목

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

설문조사

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

읽고 연습 활동을 완료할 계획입니다 읽기만 할 계획입니다

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

초급 중급 고급

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

초급 중급 고급

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 Translation APIApp Engine 서비스를 사용 설정합니다.

Cloud API 사용 설정

소개

애플리케이션에서 사용할 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에는 무료 할당량이 있으며, 1개월 내 총 사용량이 한도 내로 유지되는 한 비용이 발생하지 않습니다.

가격 및 무료 등급은 Google API마다 다릅니다. 예:

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

요약

이제 일반적으로 Google API를 사용 설정하는 방법을 알게 되었으므로 API 관리자로 이동하여 Cloud Translation API와 App Engine 서비스를 모두 사용 설정합니다 (아직 사용 설정하지 않은 경우). Cloud Translation API는 애플리케이션에서 사용하기 때문이고 App Engine 서비스는 App Engine 앱을 배포하기 때문입니다. 명령줄에서 사용 설정하려면 다음 명령어를 실행하세요.

gcloud services enable appengine.googleapis.com translate.googleapis.com

월별 할당량은 전체 '항상 무료' 등급 요약 페이지에 표시되지 않지만 Translation API 가격 책정 페이지에 따르면 모든 사용자는 매월 고정된 양의 번역된 문자를 사용할 수 있습니다. 이 기준점 미만으로 유지하면 API에서 요금이 청구되지 않습니다. 다른 Google Cloud 관련 청구가 있는 경우 마지막의 '정리' 섹션에서 설명합니다.

4. 샘플 앱 코드 가져오기

저장소의 코드를 로컬에서 또는 Cloud Shell (git clone 명령어 사용)에서 클론하거나 다음 스크린샷과 같이 녹색 Code 버튼에서 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 클라이언트, Translation 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. 로컬 패키지/종속 항목을 lib에 설치합니다.

앞서 언급한 대로 샘플 앱은 Flask 마이크로 웹 프레임워크와 Python용 Google Cloud Translation API 클라이언트 라이브러리를 사용합니다. 다음 pip (또는 pip3) 명령어를 사용하여 pip 및 이 패키지 쌍을 설치하고 업데이트합니다.

pip install -t lib -r requirements.txt

위의 주석을 실행하면 다음과 같은 설치 출력이 표시됩니다.

$ pip install -t lib -r requirements.txt
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality.
Collecting flask>=1.1.2
  Using cached Flask-1.1.4-py2.py3-none-any.whl (94 kB)
Collecting google-cloud-translate>=2.0.1
  Using cached google_cloud_translate-2.0.2-py2.py3-none-any.whl (91 kB)
Collecting click<8.0,>=5.1
  Using cached click-7.1.2-py2.py3-none-any.whl (82 kB)
Collecting Jinja2<3.0,>=2.10.1
  Using cached Jinja2-2.11.3-py2.py3-none-any.whl (125 kB)
Collecting Werkzeug<2.0,>=0.15
  Using cached Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)
Collecting itsdangerous<2.0,>=0.24
  Using cached itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
Collecting google-api-core[grpc]<2.0.0dev,>=1.15.0
  Downloading google_api_core-1.29.0-py2.py3-none-any.whl (93 kB)
     |████████████████████████████████| 93 kB 2.1 MB/s
Collecting google-cloud-core<2.0dev,>=1.1.0
  Using cached google_cloud_core-1.6.0-py2.py3-none-any.whl (28 kB)
Collecting MarkupSafe>=0.23
  Using cached MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl (17 kB)
Collecting protobuf>=3.12.0
  Downloading protobuf-3.17.2-cp27-cp27m-macosx_10_9_x86_64.whl (958 kB)
     |████████████████████████████████| 958 kB 21.6 MB/s
Collecting futures>=3.2.0; python_version < "3.2"
  Using cached futures-3.3.0-py2-none-any.whl (16 kB)
Collecting six>=1.13.0
  Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)
Collecting packaging>=14.3
  Using cached packaging-20.9-py2.py3-none-any.whl (40 kB)
Collecting googleapis-common-protos<2.0dev,>=1.6.0
  Using cached googleapis_common_protos-1.52.0-py2.py3-none-any.whl (100 kB)
Collecting requests<3.0.0dev,>=2.18.0
  Using cached requests-2.25.1-py2.py3-none-any.whl (61 kB)
Collecting google-auth<2.0dev,>=1.25.0
  Using cached google_auth-1.30.1-py2.py3-none-any.whl (146 kB)
Collecting pytz
  Using cached pytz-2021.1-py2.py3-none-any.whl (510 kB)
Collecting setuptools>=40.3.0
  Using cached setuptools-44.1.1-py2.py3-none-any.whl (583 kB)
Collecting grpcio<2.0dev,>=1.29.0; extra == "grpc"
  Using cached grpcio-1.38.0-cp27-cp27m-macosx_10_10_x86_64.whl (3.8 MB)
Collecting pyparsing>=2.0.2
  Using cached pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)
Collecting chardet<5,>=3.0.2
  Using cached chardet-4.0.0-py2.py3-none-any.whl (178 kB)
Collecting urllib3<1.27,>=1.21.1
  Using cached urllib3-1.26.5-py2.py3-none-any.whl (138 kB)
Collecting idna<3,>=2.5
  Using cached idna-2.10-py2.py3-none-any.whl (58 kB)
Collecting certifi>=2017.4.17
  Downloading certifi-2021.5.30-py2.py3-none-any.whl (145 kB)
     |████████████████████████████████| 145 kB 61.1 MB/s
Collecting pyasn1-modules>=0.2.1
  Using cached pyasn1_modules-0.2.8-py2.py3-none-any.whl (155 kB)
Collecting rsa<4.6; python_version < "3.6"
  Using cached rsa-4.5-py2.py3-none-any.whl (36 kB)
Collecting cachetools<5.0,>=2.0.0
  Using cached cachetools-3.1.1-py2.py3-none-any.whl (11 kB)
Collecting enum34>=1.0.4; python_version < "3.4"
  Using cached enum34-1.1.10-py2-none-any.whl (11 kB)
Collecting pyasn1<0.5.0,>=0.4.6
  Using cached pyasn1-0.4.8-py2.py3-none-any.whl (77 kB)
Installing collected packages: click, MarkupSafe, Jinja2, Werkzeug, itsdangerous, flask, six, protobuf, futures, pyparsing, packaging, googleapis-common-protos, chardet, urllib3, idna, certifi, requests, pyasn1, pyasn1-modules, rsa, cachetools, setuptools, google-auth, pytz, enum34, grpcio, google-api-core, google-cloud-core, google-cloud-translate
ERROR: pip's legacy dependency resolver does not consider dependency conflicts when selecting packages. This behaviour is the source of the following dependency conflicts.
matplotlib 1.3.1 requires nose, which is not installed.
matplotlib 1.3.1 requires tornado, which is not installed.
Successfully installed Jinja2-2.11.3 MarkupSafe-1.1.1 Werkzeug-1.0.1 cachetools-3.1.1 certifi-2021.5.30 chardet-4.0.0 click-7.1.2 enum34-1.1.10 flask-1.1.4 futures-3.3.0 google-api-core-1.29.0 google-auth-1.30.1 google-cloud-core-1.6.0 google-cloud-translate-2.0.2 googleapis-common-protos-1.52.0 grpcio-1.38.0 idna-2.10 itsdangerous-1.1.0 packaging-20.9 protobuf-3.17.2 pyasn1-0.4.8 pyasn1-modules-0.2.8 pyparsing-2.4.7 pytz-2021.1 requests-2.25.1 rsa-4.5 setuptools-44.1.1 six-1.16.0 urllib3-1.26.5

7. 서비스 배포

번역 서비스를 Python 2 App Engine에 배포하려면 다음 명령어를 실행합니다.

gcloud app deploy

출력은 다음과 같이 표시되며 다음 단계에 대한 메시지를 제공합니다.

$ gcloud app deploy
Services to deploy:

descriptor:      [/private/tmp/nebulous-serverless-python/app.yaml]
source:          [/private/tmp/nebulous-serverless-python]
target project:  [PROJECT_ID]
target service:  [default]
target version:  [20210422t161025]
target url:      [https://PROJECT_ID.appspot.com]


Do you want to continue (Y/n)?

Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 1290 files to Google Cloud Storage                       ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...done.
Setting traffic split for service [default]...done.
Deployed service [default] to [https://PROJECT_ID.appspot.com]

You can stream logs from the command line by running:
  $ gcloud app logs tail -s default

To view your application in the web browser run:
  $ gcloud app browse

이제 앱을 전 세계에서 사용할 수 있으므로 배포 출력에 제공된 URL (프로젝트 ID 포함)에서 앱에 액세스할 수 있습니다.

da28f951c33a2c3d.png

뭔가를 번역해 보세요.

d911984d15dd5ef9.png

8. 결론

축하합니다. Cloud Translation API를 사용 설정하고, 필요한 사용자 인증 정보를 가져오고, 간단한 웹 앱을 Python 2 App Engine에 배포하는 방법을 알아봤습니다. 이 배포에 관한 자세한 내용은 저장소의 이 표를 참고하세요.

삭제

Cloud Translation API를 사용하면 매월 고정된 양의 번역 문자를 무료로 처리할 수 있습니다. App Engine에는 무료 할당량도 있으며 Cloud FunctionsCloud Run에도 동일하게 적용됩니다. 이 두 가지 중 하나를 초과하면 요금이 청구됩니다. 다음 Codelab을 계속할 계획이라면 앱을 종료하지 않아도 됩니다.

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

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

9. 추가 리소스

다음 섹션에서는 이 튜토리얼을 완료하면서 얻은 지식을 보완할 수 있는 추가 읽을거리와 권장 연습문제를 확인할 수 있습니다.

추가 연구

이제 Translation API에 대해 어느 정도 경험을 했으므로 추가 연습을 통해 기술을 더욱 발전시켜 보겠습니다. 학습 과정을 계속하려면 샘플 앱을 수정하여 다음을 실행합니다.

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

자세히 알아보기

Google App Engine

Google Cloud Functions

Google Cloud Run

Google Cloud Buildpacks, Container Registry, Artifact Registry

Google Cloud Translation 및 Google ML Kit

기타 Google Cloud 제품/페이지

Python 및 Flask

라이선스

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