기본 "Google 번역" 배포 App Engine, Cloud Functions, Cloud Run의 Express.js 앱

1. 개요

이 Codelab 시리즈 (자기 주도형 실습 튜토리얼)는 개발자가 애플리케이션을 배포할 때 사용할 수 있는 다양한 옵션을 이해하도록 돕는 것을 목표로 합니다. 간단한 웹 애플리케이션에서 Google Cloud Translation API를 사용하는 방법을 알아봅니다. 이 앱은 로컬에서 실행하거나 Cloud 서버리스 컴퓨팅 플랫폼 (App Engine, Cloud Functions 또는 Cloud Run)에 배포할 수 있습니다.

이 JavaScript 튜토리얼은 Express.js 웹 프레임워크를 사용하는 Node.js를 사용하여 수행합니다. 서버리스 플랫폼에서 Google Cloud API에 액세스하는 방법도 배울 수 있습니다. 이 앱의 모든 버전은 '모호한 서버리스' 오픈소스 저장소를 확인하세요. 이 앱의 Python 버전과 독립적인 Codelab이 포함되어 있습니다. 또한 이 저장소는 개발자에게 서버리스 플랫폼에서 Cloud 이외의 Google API에 액세스하는 방법을 보여주는 유사한 앱을 호스팅합니다.

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

학습 목표

필요한 항목

  • 활성 Cloud Billing 계정이 있는 Google Cloud 프로젝트
  • 로컬 실행을 위해 설치된 웹 프레임워크 ( Python 튜토리얼을 사용하는 경우 Flask, JavaScript/Node.js 튜토리얼을 사용하는 경우 Express)
  • Google Cloud 배포를 위해 사용 설정된 서버리스 컴퓨팅 플랫폼 1개 이상
  • 기본 프로그래밍 기술 (Python 또는 JavaScript/Node.js)
  • 기본 운영체제 명령어에 대한 실무 지식

설문조사

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

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

Python 또는 Node.js를 사용한 개발 경험을 평가해 주세요.

초급 중급 고급

귀하의 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 사용 설정

이 섹션에서는 일반적으로 Google API를 사용 설정하는 방법을 알아봅니다. 샘플 앱에서는 Cloud Translation API를 사용 설정합니다. 또한 샘플 앱을 배포할 플랫폼에 따라 App Engine, Cloud Functions, Cloud Run(및 Cloud Artifact Registry)을 사용 설정합니다.

Google API 사용 설정

소개

애플리케이션에서 어떤 Google API를 사용하든 사용 설정되어 있어야 합니다. API는 명령줄 또는 Cloud 콘솔에서 사용 설정할 수 있습니다. API를 사용 설정하는 프로세스는 동일하므로 한 API를 사용 설정하면 동일한 방식으로 다른 API를 사용 설정할 수 있습니다.

옵션 1: gcloud 명령줄 인터페이스 (Cloud Shell 또는 로컬 환경)

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

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

gcloud services enable SERVICE_NAME.googleapis.com

예시 1: Cloud Vision API 사용 설정

gcloud services enable vision.googleapis.com

예시 2: Google App Engine 사용 설정

gcloud services enable appengine.googleapis.com

예 3: 요청 하나로 여러 API를 사용 설정합니다. 예를 들어 이 Codelab에 Cloud Translation API를 사용하여 App Engine, Cloud Functions, Cloud Run에 앱을 배포하는 뷰어가 있는 경우 명령줄은 다음과 같습니다.

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

이 명령어는 App Engine, Cloud Functions, Cloud Run, Cloud Translation API를 사용 설정합니다. 또한 Cloud Run에 배포하려면 Cloud Build 시스템에서 컨테이너 이미지를 등록해야 하므로 Cloud Artifact Registry를 사용 설정합니다.

옵션 2: Cloud 콘솔

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

fb0f1d315f122d4a.png

검색창에 API 이름을 입력하기 시작하면 일치하는 결과가 표시됩니다.

2275786a24f8f204.png

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

7960a6752a1da767.png

모든 API를 사용 설정하는 프로세스는 사용하려는 Google API에 관계없이 비슷합니다.

비용

많은 Google API를 수수료 없이 사용할 수 있지만 대부분의 Google Cloud 제품과 API를 사용하면 비용이 발생합니다. Cloud API를 사용 설정할 때 활성 결제 계정을 입력하라는 메시지가 표시될 수 있습니다. 하지만 일부 Google Cloud 제품에는 '항상 무료' 등급이 있으며, 이 한도를 초과해야 요금이 청구됩니다.

GCP 신규 사용자는 처음 90일 동안 미화 300달러 상당의 무료 체험판을 이용할 수 있습니다. Codelab은 일반적으로 많은 비용이나 요금이 부과되지 않으므로 일회성 혜택이므로 실제로 사용해 볼 준비가 될 때까지 무료 체험판을 보류하는 것이 좋습니다. 무료 등급 할당량은 무료 체험판 사용 여부와 관계없이 만료되거나 적용되지 않습니다.

사용자는 사용 설정하기 전에 API의 가격 책정 정보 (예: Cloud Vision API 가격 책정 페이지)를 참조해야 하며, 특히 무료 등급이 있는지 여부와 무료 등급 제공 여부에 주목해야 합니다. 지정된 일일 또는 월별 한도로 머물러 있는 한 요금이 청구되지 않습니다. 가격 책정과 무료 등급은 Google 제품 그룹 API에 따라 다릅니다. 예:

Google 제품마다 청구 비용이 다르므로 해당 정보에 대한 적절한 문서를 참조해야 합니다.

원하는 서비스가 사용 설정되어 있는지 확인

위의 안내에 따라 API 관리자에서 Cloud Translation API를 설정해야 합니다. 명령줄에서 서버리스 플랫폼을 사용 설정하지 않았다면 Cloud 콘솔의 App Engine, Cloud Functions, Cloud Run 등 각 대시보드에서 사용 설정할 수 있습니다.

Cloud 콘솔에서 API를 사용 설정하면 시각적으로 유익하지만, 모든 서비스를 사용 설정하는 데 몇 초가 걸리는 gcloud 도구를 사용하는 것이 더 빠릅니다.

$ gcloud services enable appengine.googleapis.com \
cloudfunctions.googleapis.com artifactregistry.googleapis.com \
run.googleapis.com translate.googleapis.com
Operation "operations/acf.p2-xxxxxx035451-704918f2-5470-4436-9bdd-c3b204yyyyyy" finished successfully.

비용 자세히 알아보기

위의 비용 섹션은 Google API 전반에 걸쳐 일반적입니다. 이 튜토리얼의 자세한 내용을 살펴보겠습니다. 월별 할당량이 전체 '항상 무료' 등급 요약 페이지에 나와 있습니다. Translation API 가격 책정 페이지에는 모든 사용자에게 매월 고정 금액의 번역된 문자가 제공된다고 명시되어 있습니다. 이 기준액 미만을 유지할 경우 API에서 요금이 발생하지 않습니다. Google Cloud 서버리스 플랫폼 사용 비용에 대한 자세한 내용은 저장소의 비용 섹션을 참조하세요. '정리' 마지막 섹션에서는 이 Codelab을 완료한 후 요금 청구를 중지하는 방법을 설명합니다.

4. 샘플 앱 코드 가져오기

ZIP 파일 다운로드 또는 저장소 클론

  • ZIP 파일을 다운로드하거나 git clone https://github.com/googlecodelabs/cloud-nebulous-serverless.git저장소를 클론합니다.
  • 로컬 개발 환경이 없지만 Cloud Shell에서 이 가이드를 수행하려면 동일한 git clone 명령어를 사용하여 저장소를 클론하면 됩니다.
  • 다음 스크린샷과 같이 녹색 Code 버튼으로도 ZIP 파일에 액세스할 수 있습니다.

5cd6110c4414cf65.png

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

5. Node.js 환경 확인

Node.js 환경을 설정하려면 다음을 수행합니다.

  1. 최신 버전의 Node(10 이상) 및 NPM(>=6)이 설치되어 있는지 확인하세요.
  2. repo를 클론한 위치로 이동하거나 ZIP 파일의 압축을 푼 다음 cloud/nodejs 폴더로 이동합니다.
  3. package.json가 있는지 확인한 후 npm install를 실행합니다.

위의 1번의 경우 명령줄에서 현재 버전을 확인할 수 있습니다.

$ node -v
v17.0.1
$ npm -v
8.1.0

6. 샘플 앱 둘러보기

샘플 앱은 사용자에게 영어로 텍스트를 입력하고 해당 텍스트를 스페인어로 번역하도록 요청하는 간단한 Google 번역 파생 앱입니다.

package.json 구성 파일은 애플리케이션에 필요한 서드 파티 패키지를 나타냅니다 (패키지 버전이 여기 나열된 버전 이상으로 업데이트될 수 있음).

{
  "name": "cloud-nebulous-serverless-nodejs",
  "version": "0.0.1",
  "description": "Nebulous Serverless sample app",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "mocha test/test_neb.js"
  },
  "author": "Google LLC",
  "license": "Apache-2.0",
  "dependencies": {
    "@google-cloud/translate": "^6.3.1",
    "express": "^4.17.1",
    "nunjucks": "^3.2.3"
  },
  "devDependencies": {
    "mocha": "^9.1.3",
    "supertest": "^6.1.6"
  }
}

이제 index.js 파일을 열어 작동 방식을 확인해 보겠습니다. 라이선스에 관한 설명 줄을 생략하면 상단과 하단에 다음과 같이 표시됩니다.

const express = require('express');
const nunjucks = require('nunjucks');
const {TranslationServiceClient} = require('@google-cloud/translate');

const app = express();
app.use(express.urlencoded({extended: true}));
nunjucks.configure('templates', {autoescape: true, express: app});
const TRANSLATE = new TranslationServiceClient();

const PORT = process.env.PORT || 8080;
const SOURCE = ['en', 'English'];
const TARGET = ['es', 'Spanish'];
let parent;
TRANSLATE.getProjectId().then(result => {
    parent = `projects/${result}`;
});


if (!process.env.FUNCTION_TARGET) {
    app.listen(PORT, () =>
        console.log(`Listening on port ${PORT}`)
    );
}

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

app.all('/', translate);
module.exports = {
    app
};
  1. require에는 프레임워크 및 템플릿 기능과 Cloud Translation API 클라이언트 라이브러리가 포함되어 있습니다.
  2. 전역 변수는 웹 앱, Cloud 프로젝트 ID, Translation API 클라이언트, 상위 '위치 경로'를 나타냅니다. (Translation API 호출, SOURCETARGET 언어 지원) 이 경우 영어 (en)와 스페인어 (es)가 표시되지만 Cloud Translation API에서 지원하는 다른 언어 코드로 자유롭게 변경할 수 있습니다.
  3. 각 쌍의 첫 번째 요소 (SOURCETARGET)는 언어 코드이고 두 번째 요소는 언어 이름입니다 (API와 관련이 없으므로 표시 목적으로만 사용됩니다).
  4. 하단의 몇 줄은 모든 HTTP 요청을 translate()로 보낸 다음 app 애플리케이션 객체를 내보냅니다.

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

async function translate(req, rsp) {
    let text = null;
    let translated = null;
    if (req.method === 'POST') {
        text = req.body.text.trim();
        if (text) {
            const data = {
                contents: [text],
                parent: parent,
                targetLanguageCode: TARGET[0]
            };
            const [response] = await TRANSLATE.translateText(data);
            translated = response.translations[0].translatedText;
        }
    }
    const context = {
        orig:  {text: text, lc: SOURCE},
        trans: {text: translated, lc: TARGET}
    };
    rsp.render('index.html', context);
}

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

  1. 양식의 기본 변수를 재설정합니다. POST 요청에는 이를 대체하는 데이터가 있으므로 주로 GET 요청에 사용합니다.
  2. POST인 경우 번역할 텍스트를 가져오고 비어 있지 않은 경우 API 메타데이터 요구사항을 나타내는 JSON 구조를 만듭니다. 그런 다음 서비스를 위해 API를 호출합니다.
  3. 특정 영어 출처에는 API에 SOURCE[0]를 전달하지 않았습니다. 출발어를 생략하면 API에 출발어를 자동으로 감지하도록 요청하는 것입니다 (문서의 sourceLanguageCode 참고).
  4. 이와 관계없이 실제 결과 (POST) 또는 데이터 없음 (GET)의 형식을 템플릿 컨텍스트로 지정하고 렌더링합니다.

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

<!doctype html>
<html><head><title>My Google Translate 1990s</title><body>
<style>
body {
  font-family: Verdana, Helvetica, sans-serif;
  background-color: #DDDDDD;
}
</style>
<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>

가이드의 나머지 부분에서는 이 앱을 배포하고 실행하기 위한 네 가지 옵션 중 일부 또는 전부를 선택할 수 있습니다. 모든 배포는 선택사항이므로 일부 또는 전부를 수행할 수 있습니다.

  1. 로컬에서 서비스 실행
  2. App Engine에 배포 (표준 환경)
  3. Cloud Functions에 배포
  4. Cloud Run에 배포

7. 옵션 1: 서비스를 로컬에서 실행

이 Codelab 섹션은 로컬에서만 실행합니다. 클라우드에만 배포하는 경우 다음 섹션으로 이동하세요.

샘플 앱을 로컬에서 실행하려면 세 가지 단계를 수행해야 합니다.

  1. 서비스 계정 만들기
  2. 서비스 계정 공개/비공개 키 쌍 만들기
  3. 사용자 인증 정보 파일 다운로드 및 애플리케이션 코드와 함께 번들로 제공
  4. 서비스 시작

서비스 계정 알아보기

서비스 계정은 실제 사용자의 소유가 아닌 데이터에 액세스할 때 클라우드 기반 애플리케이션용 Google API에 액세스하는 보안 메커니즘입니다. 클라우드에 배포할 때 사용자를 클라우드로 온보딩하는 데 소요되는 시간을 줄이기 위해 모든 Google Cloud 컴퓨팅 플랫폼 (서버리스 및 기타)은 기본 서비스 계정을 제공합니다.

기본 서비스 계정에는 '위험 관리'에 필요한 다양한 권한이 제공되며 프로덕션 서비스를 출시할 준비를 할 때 사용자는 '최소 권한'의 모범 사례를 따를 것을 적극 권장합니다. 앱이 제대로 작동하는 데 필요한 권한만 있는 사용자 관리형 서비스 계정을 만듭니다. 그럼에도 불구하고, 로컬 배포를 위한 기본 서비스 계정이 없으므로 서비스 계정과 서비스 계정 키 (실제로는 공개 키/비공개 키 쌍)를 만들어 애플리케이션 코드에 사용자 인증 정보를 제공해야 합니다.

서비스 계정 키 쌍 만들기 및 사용자 인증 정보 파일 다운로드

이 페이지의 안내에 따라 로컬에서 실행할 서비스 계정과 공개 키/비공개 키 쌍을 만듭니다. 서비스 계정 키를 만들 때 원하는 권한을 제공하라는 메시지가 표시됩니다. API에 성공적으로 액세스할 수 있도록 roles/cloudtranslate.user를 선택해야 합니다.

키 쌍이 성공적으로 생성되면 서비스 계정 키 파일을 다운로드하라는 메시지가 표시됩니다. 이름을 credentials.json로 지정하고 애플리케이션 최상위 폴더로 이동합니다. 이제 이러한 사용자 인증 정보를 사용하도록 Cloud SDK에 지시해야 합니다. GOOGLE_APPLICATION_CREDENTIALS 환경 변수가 해당 파일을 가리키도록 설정합니다. 이 프로세스에 대한 자세한 내용은 서비스 계정 사용을 다루는 이 페이지에서도 확인할 수 있습니다.

서비스 시작

계속 진행할 준비가 되면 다음 명령어를 사용하여 Express 서버를 로컬에서 실행합니다.

$ npm start

> cloud-nebulous-serverless-nodejs@0.0.1 start
> node index.js

Listening on port 8080

웹브라우저로 이동하여 localhost:8080에 연결하면 다음과 같이 표시됩니다.

adc6665b7ae13c40.png

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

fc154326080bf14f.png

만족스러우면 ^C (control-C)로 서버를 종료하고 종료합니다. 축하합니다. 로컬 배포를 실행했습니다. 좋은 소식은 클라우드에 배포하기가 훨씬 더 쉽다는 것입니다.

문제 해결

번역을 요청할 때 이와 같은 오류가 발생하나요?

node:fs:2486
      handleErrorFromBinding(ctx);
      ^

Error: The file at credentials.json does not exist, or it is not a file. ENOENT: no such file or directory, lstat '/tmp/nodejs/credentials.json'
    . . .

해결 방법: 이 오류는 서비스 계정 생성 및 공개 키/비공개 키 쌍 파일 credentials.json 다운로드를 완료하지 않았음을 의미합니다. 다음으로 돌아가세요. " 옵션 1: 로컬에서 서비스 실행" 이 프로세스를 완료하고 계속 진행하기 전에 기본 폴더에 인증서를 설치합니다.

8. 옵션 2: App Engine에 배포 (표준 환경)

이 Codelab 섹션은 Node App Engine에 배포하는 경우에만 설명합니다. 관심이 없다면 다음 섹션으로 이동하세요.

이 배포는 한 줄로 사용할 런타임을 App Engine에 알려주는 app.yaml 구성 파일을 사용합니다.

runtime: nodejs16

app.yaml 파일은 Cloud Functions와 Cloud Run에서 사용되지 않습니다. App Engine을 사용할 계획이 없다면 이 파일은 안전하게 삭제될 수 있습니다. App Engine에 배포할 준비가 되면 다음 명령어를 실행합니다.

$ gcloud app deploy

리전을 선택하면 gcloud app deploy 출력이 훨씬 덜 상세하며 다음과 같이 표시됩니다.

Services to deploy:

descriptor:                  [/private/tmp/nodejs/app.yaml]
source:                      [/private/tmp/nodejs]
target project:              [PROJECT_ID]
target service:              [default]
target version:              [2021...]
target url:                  [https://PROJECT_ID.REG_ABBR.appspot.com]
target service account:      [App Engine default service account]


Do you want to continue (Y/n)?

Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 2 files to Google Cloud Storage                          ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...⠏WARNING: *** Improve build performance by generating and committing package-lock.json.

Updating service [default]...done.
Setting traffic split for service [default]...done.
Deployed service [default] to [https://PROJECT_ID.REG_ABBR.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

To take a quick anonymous survey, run:
  $ gcloud survey

이제 전 세계에서 앱을 사용할 수 있으므로 프로젝트 ID가 포함된 URL을 통해 앱에 연결할 수 있습니다. 또한 로컬 Express 버전과 비슷한 출력이 표시됩니다. 하지만 앱이 클라우드에서 실행되며 전 세계에서 사용 가능합니다.

da28f951c33a2c3d.png

요청을 제출하면 다른 모든 배포와 동일하게 작동합니다.

9. 옵션 3: Cloud Functions에 배포

이 Codelab 섹션은 Node Cloud Functions에 배포하는 경우에만 설명합니다. 관심이 없다면 다음 섹션으로 이동하세요.

Cloud Functions에는 구성 파일이 없으므로 Cloud Functions에 배포할 준비가 되면 다음 명령어를 실행합니다.

$ gcloud functions deploy translate \
  --runtime nodejs16 \
  --entry-point app \
  --trigger-http \
  --region REGION \
  --allow-unauthenticated

GCP 프로젝트에 기본 REGION가 있을 수 있지만 --region 플래그를 사용하여 함수를 특정 리전에 배포할 수 있습니다. Cloud Functions는 다른 Cloud 제품과 마찬가지로 메시지를 표시하지 않습니다. 선택한 리전에 관계없이 gcloud functions deploy 출력은 다음과 같이 표시됩니다.

Deploying function (may take a while - up to 2 minutes)...⠛
For Cloud Build Logs, visit: https://console.cloud.google.com/cloud-build/builds;region=REGION/15ac7fc1-731d-4f3b-bc15-8f2614xxxxxx?project=062269xxxxxx
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 256
buildId: aaf7e0cd-fbbd-4624-abeb-3e7437xxxxxx
buildName: projects/062269xxxxxx/locations/REGION/builds/aaf7e0cd-fbbd-4624-abeb-3e7437xxxxxx
entryPoint: app
httpsTrigger:
  securityLevel: SECURE_OPTIONAL
  url: https://REGION-PROJECT_ID.cloudfunctions.net/translate
ingressSettings: ALLOW_ALL
labels:
  deployment-tool: cli-gcloud
name: projects/PROJECT_ID/locations/REGION/functions/translate
runtime: nodejs16
serviceAccountEmail: PROJECT_ID@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/gcf-upload-REGION-01de94c2-6eb4-4c49-aaff-09276cdb7ae9/a1db9f2d-3511-414b-aeeb-de6042xxxxxx.zip
status: ACTIVE
timeout: 60s
updateTime: '2021...'
versionId: '...'

이제 전 세계에서 앱을 사용할 수 있으므로 'httpsTrigger/url'에서 배포 출력에 표시된 프로젝트 ID가 포함된 URL을 통해 앱에 연결할 수 있습니다. URL은 다음과 같이 표시됩니다. https://REGION-PROJECT_ID.cloudfunctions.net/translate(선택한 리전과 Cloud 프로젝트 ID에 따라 다름).

518f1c3165f2096d.png

10. 옵션 4: Cloud Run에 배포

이 Codelab 섹션은 Cloud Run에 배포하는 경우에만 설명합니다. 관심이 없다면 다음 섹션으로 이동하세요.

Cloud Run에는 구성 파일이 없으므로 Cloud Run에 배포할 준비가 되면 아래 안내를 따르세요.

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

$ 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

Cloud Build는 앱을 로컬에서 실행한 것처럼 앱을 Cloud Run에 패키징합니다. Node.js 사용자의 경우 npm installnpm start를 실행합니다. Python의 경우 pip install -r requirements.txt를 실행하고 Procfile의 안내에 따라 앱을 시작합니다. (이는 Cloud 빌드팩에서 지원하는 다른 모든 언어에도 동일하게 적용됩니다.) 빌드 프로세스가 완료되면 앱을 사용할 수 있습니다.

그러면 앱이 리전별로 배포되지만 전 세계적으로 배포되고 'Service URL'의 배포 출력에 표시된 대로 프로젝트 ID가 포함된 URL에서 연결할 수 있습니다.

169f6edf5f7d2068.png

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

31554e71cb80f1b4.png

11. 결론

축하합니다. Cloud Translation API를 사용 설정 및 사용하고, 필요한 사용자 인증 정보를 가져오고, 간단한 웹 앱을 App Engine, Cloud Functions 또는 Cloud Run에 로컬로 Express에 배포하는 방법을 알아봤습니다. 자세히 알아보거나 이 앱의 다른 버전 및 다른 Codelab에 액세스하려면 repo 폴더를 확인하세요.

삭제

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에 저장됩니다. 해당 이미지의 스토리지는 이미지를 서비스로 전송할 때 네트워크 이그레스와 마찬가지로 해당 할당량의 일부를 사용합니다. 하지만 이러한 무료 등급이 없는 지역에 거주할 수도 있으므로 잠재적인 비용을 최소화하려면 저장용량 사용량에 유의해야 합니다.

12. 추가 리소스

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

추가 연구

이제 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 제품/페이지

라이선스

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