1. 개요
서버리스 마이그레이션 스테이션 Codelab 시리즈 (사용자 주도형 실습 튜토리얼) 및 관련 동영상은 Google Cloud 서버리스 개발자가 주로 기존 서비스에서 벗어나 하나 이상의 마이그레이션을 통해 애플리케이션을 현대화하도록 돕는 것을 목표로 합니다. 이렇게 하면 앱의 이식성이 향상되고 더 많은 옵션과 유연성이 제공되므로 다양한 Cloud 제품과 통합하고 액세스하고 최신 언어 버전으로 보다 쉽게 업그레이드할 수 있습니다. 이 시리즈는 처음에는 초기 Cloud 사용자, 특히 App Engine (표준 환경) 개발자에 중점을 두고 있지만 Cloud Functions 및 Cloud Run과 같은 다른 서버리스 플랫폼이나 해당하는 경우 다른 플랫폼을 포함할 만큼 광범위합니다.
이 Codelab에서는 모듈 1 Codelab의 샘플 앱에서 App Engine 작업 대기열 내보내기 작업을 사용하는 방법을 설명합니다. 모듈 7 블로그 게시물 및 동영상은 이 가이드를 보완하며 이 가이드의 콘텐츠에 대한 간략한 개요를 제공합니다.
이 모듈에서는 push 태스크의 사용을 추가한 후 모듈 8의 Cloud Tasks 이후 버전에서 사용 중인 부분을 모듈 9의 Python 3 및 Cloud Datastore로 이전해 보겠습니다. 가져오기 작업에 태스크 큐를 사용하는 사용자는 Cloud Pub/Sub로 마이그레이션되며 모듈 18~19를 참조해야 합니다.
다음 실습에서는
- App Engine Task Queue API/번들 서비스 사용
- 기본 Python 2 Flask App Engine NBS 앱에 푸시 작업 사용 추가
필요한 항목
- 활성 GCP 결제 계정이 있는 Google Cloud 프로젝트
- 기본 Python 기술
- 일반적인 Linux 명령어에 대한 실무 지식
- App Engine 앱 개발 및 배포에 관한 기본 지식
- 작동하는 모듈 1 App Engine 앱 (해당 Codelab[권장] 완료 또는 저장소에서 앱 복사)
설문조사
이 튜토리얼을 어떻게 사용하실 계획인가요?
귀하의 Python 사용 경험이 어떤지 평가해 주세요.
귀하의 Google Cloud 서비스 사용 경험을 평가해 주세요.
<ph type="x-smartling-placeholder">2. 배경
App Engine 작업 대기열은 내보내기 및 가져오기 작업을 모두 지원합니다. Google Cloud팀에서는 애플리케이션 이동성을 개선하기 위해 태스크 큐와 같은 기존 번들 서비스에서 다른 Cloud 독립형 또는 동등한 서드 파티 서비스로 마이그레이션할 것을 권장합니다.
- 태스크 큐 푸시 태스크 사용자는 Cloud Tasks로 마이그레이션해야 합니다.
- 태스크 큐 가져오기 태스크 사용자는 Cloud Pub/Sub로 마이그레이션해야 합니다.
풀 태스크 마이그레이션은 마이그레이션 모듈 18~19에서 다루고 모듈 7~9에서는 푸시 태스크 마이그레이션에 중점을 둡니다. App Engine 태스크 큐 푸시 태스크에서 이전하려면 모듈 1 Codelab에서 얻은 기존 Flask 및 App Engine NBS 앱에 해당 사용량을 추가하세요. 이 앱에서 새 페이지 조회는 새 방문을 등록하고 사용자에게 가장 최근 방문을 표시합니다. 이전 방문은 다시 표시되지 않고 Datastore의 공간을 차지하므로 가장 오래된 방문 항목을 자동으로 삭제하는 푸시 작업을 만들어 보겠습니다. 모듈 8에서는 앱을 작업 대기열에서 Cloud Tasks로 이전해 보겠습니다.
이 가이드에는 다음 단계가 포함됩니다.
- 설정/사전 작업
- 구성 업데이트
- 애플리케이션 코드 수정
3. 설정/사전 작업
이 섹션에서는 다음을 수행하는 방법을 설명합니다.
- Cloud 프로젝트 설정
- 기준 샘플 앱 가져오기
- 기준 앱 (재)배포 및 검증
다음 단계를 통해 실제로 작동하는 코드로 시작할 수 있습니다.
1. 프로젝트 설정
모듈 1 Codelab을 완료했다면 동일한 프로젝트 및 코드를 재사용하는 것이 좋습니다. 또는 새 프로젝트를 만들거나 다른 기존 프로젝트를 재사용할 수 있습니다. 프로젝트에 활성 결제 계정이 있고 App Engine이 사용 설정되어 있는지 확인하세요.
2. 기준 샘플 앱 가져오기
이 Codelab의 기본 요건 중 하나는 작동하는 모듈 1 App Engine 앱을 보유하는 것입니다. 모듈 1 Codelab을 완료하거나 (권장) 저장소에서 모듈 1 앱을 복사합니다. 여러분의 것이든 우리의 것이든, 모듈 1 코드에서 '시작'할 것입니다. 이 Codelab에서는 각 단계를 살펴보고 모듈 7 저장소 폴더 'FINISH'에 있는 코드와 유사한 코드로 마무리합니다.
사용하는 모듈 1 앱과 관계없이 폴더는 아래와 같이 표시되며 lib
폴더도 있을 수 있습니다.
$ ls README.md main.py templates app.yaml requirements.txt
3. 기준 앱 (재)배포
다음 단계를 실행하여 모듈 1 앱을 (다시) 배포합니다.
lib
폴더가 있으면 삭제하고pip install -t lib -r requirements.txt
를 실행하여lib
를 다시 채웁니다. Python 2와 3이 모두 설치된 경우pip2
명령어를 대신 사용해야 할 수도 있습니다.gcloud
명령줄 도구를 설치 및 초기화하고 사용법을 검토했는지 확인합니다.gcloud
명령어가 실행될 때마다PROJECT_ID
를 입력하지 않으려면gcloud config set project
PROJECT_ID
로 Cloud 프로젝트를 설정합니다.gcloud app deploy
를 사용하여 샘플 앱 배포- 모듈 1 앱이 최근 방문을 표시하는 문제 없이 예상대로 실행되는지 확인합니다 (아래 설명 참고).
4. 구성 업데이트
표준 App Engine 구성 파일 (app.yaml
, requirements.txt
, appengine_config.py
)은 변경할 필요가 없습니다.
5. 애플리케이션 파일 수정
기본 애플리케이션 파일은 main.py
이며 이 섹션의 모든 업데이트는 이 파일과 관련이 있습니다. 웹 템플릿인 templates/index.html
도 일부 업데이트되었습니다. 이 섹션에서 구현해야 하는 변경사항은 다음과 같습니다.
- 가져오기 업데이트
- 푸시 작업 추가
- 태스크 핸들러 추가
- 웹 템플릿 업데이트
1. 가져오기 업데이트
google.appengine.api.taskqueue
를 가져오면 태스크 큐 기능을 사용할 수 있습니다. 일부 Python 표준 라이브러리 패키지도 필요합니다.
- 가장 오래된 방문을 삭제하는 작업을 추가하므로 앱은 타임스탬프를 처리해야 합니다. 즉,
time
및datetime
를 사용합니다. - 작업 실행에 관한 유용한 정보를 로깅하려면
logging
가 필요합니다.
이러한 가져오기를 모두 추가하면 변경 전과 후의 코드는 아래와 같습니다.
이전:
from flask import Flask, render_template, request
from google.appengine.ext import ndb
변경 후:
from datetime import datetime
import logging
import time
from flask import Flask, render_template, request
from google.appengine.api import taskqueue
from google.appengine.ext import ndb
2. 푸시 태스크 추가 (태스크 데이터 수집, 새 태스크 큐에 추가)
내보내기 대기열 문서에는 '작업을 처리하려면 작업을 내보내기 대기열에 추가해야 합니다. App Engine은 default
라는 기본 내보내기 대기열을 제공하며, 이 대기열은 기본 설정으로 구성되어 바로 사용할 수 있습니다. 원하는 경우 다른 대기열을 만들고 구성할 필요 없이 모든 작업을 기본 대기열에 추가할 수 있습니다." 이 Codelab에서는 간결성을 위해 default
큐를 사용합니다. 동일하거나 다른 특성을 가진 내보내기 대기열을 정의하는 방법에 대한 자세한 내용은 내보내기 대기열 만들기 문서를 참조하세요.
이 Codelab의 주요 목표는 더 이상 표시되지 않는 Datastore의 이전 방문 기록을 삭제하는 작업을 default
내보내기 큐에 추가하는 것입니다. 기준 앱은 새로운 Visit
항목을 만들어 각 방문 (/
에 대한 GET
요청)을 등록한 다음 최근 방문을 가져와 표시합니다. 가장 오래된 방문은 표시되지 않거나 다시 사용되지 않으므로 푸시 작업에서는 가장 오래된 방문 기록보다 오래된 방문을 모두 삭제합니다. 이렇게 하려면 앱의 동작을 약간 변경해야 합니다.
- 가장 최근의 방문 데이터를 쿼리할 때는 해당 방문을 즉시 반환하는 대신 가장 오래된 방문 기록인
Visit
의 타임스탬프를 저장하도록 앱을 수정하세요. 이보다 오래된 방문은 모두 삭제하는 것이 안전합니다. - 이 타임스탬프를 페이로드로 하여 푸시 태스크를 만들고 HTTP
POST
를 통해/trim
에 액세스할 수 있는 태스크 핸들러로 안내합니다. 특히 표준 Python 유틸리티를 사용하여 Datastore 타임스탬프를 변환하고 이를 (부동 소수점 수로) 작업에 전송하지만 (문자열로) 로깅하고 해당 문자열을 센티널 값으로 반환하여 사용자에게 표시합니다.
이 모든 작업은 fetch_visits()
에서 실행되며 업데이트 전후의 모습은 다음과 같습니다.
이전:
def fetch_visits(limit):
return (v.to_dict() for v in Visit.query().order(
-Visit.timestamp).fetch(limit))
변경 후:
def fetch_visits(limit):
'get most recent visits and add task to delete older visits'
data = Visit.query().order(-Visit.timestamp).fetch(limit)
oldest = time.mktime(data[-1].timestamp.timetuple())
oldest_str = time.ctime(oldest)
logging.info('Delete entities older than %s' % oldest_str)
taskqueue.add(url='/trim', params={'oldest': oldest})
return (v.to_dict() for v in data), oldest_str
3. 태스크 핸들러 (작업 실행 시 호출되는 코드) 추가
fetch_visits()
에서 이전 방문 기록을 쉽게 삭제할 수 있었지만 이 기능은 최종 사용자와 크게 관련이 없습니다. 보조 기능이며 표준 앱 요청 외부에서 비동기식으로 처리하기에 적합합니다. Datastore의 정보가 줄어들기 때문에 최종 사용자는 더 빠른 쿼리를 활용할 수 있습니다. /trim
에 대한 태스크 큐 POST
요청을 통해 호출되는 새 함수 trim()
를 만듭니다. 이 함수는 다음을 실행합니다.
- '가장 오래된 방문' 추출 타임스탬프 페이로드
- Datastore 쿼리를 실행하여 해당 타임스탬프보다 오래된 모든 항목을 찾습니다.
- 더 빠른 '키 전용' 선택 쿼리를 실행할 수 있습니다.
- 삭제할 항목 수 (0개 포함)를 기록합니다.
ndb.delete_multi()
를 호출하여 모든 항목을 삭제합니다 (그렇지 않으면 건너뜀).- 빈 문자열을 (암시적 HTTP 200 반환 코드와 함께) 반환합니다.
아래의 trim()
에서 모두 확인할 수 있습니다. fetch_visits()
바로 뒤에 main.py
에 추가합니다.
@app.route('/trim', methods=['POST'])
def trim():
'(push) task queue handler to delete oldest visits'
oldest = request.form.get('oldest', type=float)
keys = Visit.query(
Visit.timestamp < datetime.fromtimestamp(oldest)
).fetch(keys_only=True)
nkeys = len(keys)
if nkeys:
logging.info('Deleting %d entities: %s' % (
nkeys, ', '.join(str(k.id()) for k in keys)))
ndb.delete_multi(keys)
else:
logging.info('No entities older than: %s' % time.ctime(oldest))
return '' # need to return SOME string w/200
4. 웹 템플릿 업데이트
변수가 존재하는 경우 가장 오래된 타임스탬프를 표시하도록 이 Jinja2 조건문으로 웹 템플릿 templates/index.html
을 업데이트합니다.
{% if oldest is defined %}
<b>Deleting visits older than:</b> {{ oldest }}</p>
{% endif %}
템플릿이 다음과 같이 표시되도록 표시된 방문 목록 뒤, 본문을 닫기 전에 이 스니펫을 추가합니다.
<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<body>
<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>
{% if oldest is defined %}
<b>Deleting visits older than:</b> {{ oldest }}</p>
{% endif %}
</body>
</html>
6. 요약/삭제
이 섹션에서는 앱을 배포하고 의도한 대로 반영된 출력에서 작동하는지 확인하여 이 Codelab을 마무리합니다. 앱 유효성 검사 후 정리를 수행하고 다음 단계를 고려합니다.
애플리케이션 배포 및 확인
gcloud app deploy
를 사용하여 앱을 배포합니다. 출력은 모듈 1 앱과 같아야 합니다. 단, 하단에 삭제될 방문을 표시하는 줄바꿈이 있습니다.
축하합니다. Codelab을 완료했습니다. 이제 코드가 모듈 7 저장소 폴더에 있는 코드와 일치해야 합니다. 이제 모듈 8에서 Cloud Tasks로 마이그레이션할 준비가 되었습니다.
삭제
일반
이 작업이 완료되면 요금이 청구되지 않도록 App Engine 앱을 사용 중지하는 것이 좋습니다. 하지만 추가 테스트 또는 실험을 원하는 경우 App Engine 플랫폼에서 무료 할당량을 사용할 수 있으므로 이 사용 등급을 초과하지 않는 한 요금이 청구되지 않습니다. 이는 컴퓨팅을 위한 것이며, 관련 App Engine 서비스에 대한 요금이 부과될 수 있으므로 자세한 내용은 가격 책정 페이지를 확인하세요. 이 마이그레이션에 다른 Cloud 서비스가 포함된 경우 별도로 요금이 청구됩니다. 두 경우 모두 해당하는 경우 '이 Codelab과 관련된 내용'을 참고하세요. 섹션을 참조하세요.
자세히 알려드리자면 App Engine과 같은 Google Cloud 서버리스 컴퓨팅 플랫폼에 배포할 경우 약간의 빌드 및 스토리지 비용이 발생합니다. Cloud Build에는 Cloud Storage와 마찬가지로 자체 무료 할당량이 있습니다. 해당 이미지의 스토리지가 할당량 중 일부를 사용합니다. 하지만 이러한 무료 등급이 없는 지역에 거주할 수도 있으므로 잠재적인 비용을 최소화하려면 저장용량 사용량에 유의해야 합니다. 특정 Cloud Storage '폴더' 다음을 포함해야 합니다.
console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
- 위의 스토리지 링크는
PROJECT_ID
및 *LOC
*기호에 따라 다릅니다(예: 'us
'). (앱이 미국에서 호스팅되는 경우)
반면 이 애플리케이션 또는 다른 관련 이전 Codelab을 계속 진행하지 않고 모든 항목을 완전히 삭제하려면 프로젝트를 종료합니다.
이 Codelab에만 해당
아래에 나열된 서비스는 이 Codelab의 고유한 서비스입니다. 자세한 내용은 각 제품의 문서를 참조하세요.
- App Engine 태스크 큐 서비스는 태스크 큐와 같은 기존 번들 서비스의 가격 책정 페이지에 따라 추가 요금이 청구되지 않습니다.
- App Engine Datastore 서비스는 무료 등급인 Cloud Datastore (Datastore 모드의 Cloud Firestore)에서 제공합니다. 자세한 내용은 가격 책정 페이지를 참고하세요.
다음 단계
이 '이전'에서는 모듈 1 샘플 앱에 작업 대기열 내보내기 대기열 사용을 추가하여 방문자 추적 지원을 추가하여 모듈 7 샘플 앱을 만들었습니다. 다음 마이그레이션에서는 App Engine 내보내기 작업을 원하는 경우 Cloud Tasks로 업그레이드하는 방법을 설명합니다. 2021년 가을부터 사용자가 Python 3로 업그레이드할 때 더 이상 Cloud Tasks로 마이그레이션할 필요가 없습니다. 다음 섹션에서 자세히 알아보세요.
Cloud Tasks로 이동하려면 모듈 8 Codelab을 참조하세요. 이 외에도 Cloud Datastore, Cloud Memorystore, Cloud Storage, Cloud Pub/Sub (pull 큐)와 같이 고려해야 할 추가 마이그레이션이 있습니다. 또한 Cloud Run 및 Cloud Functions로의 제품 간 마이그레이션도 있습니다. 모든 서버리스 마이그레이션 스테이션 콘텐츠 (Codelab, 동영상, 소스 코드[사용 가능한 경우])는 오픈소스 저장소에서 액세스할 수 있습니다.
7. Python 3로 마이그레이션
2021년 가을, App Engine팀은 2세대 런타임 (원래 1세대 런타임에서만 사용 가능)으로 많은 번들 서비스에 대한 지원을 확대했습니다. 즉, 앱을 Python 3로 포팅할 때 App Engine 태스크 큐와 같은 번들 서비스를 독립형 Cloud나 Cloud Tasks와 같은 서드 파티 서비스로 마이그레이션할 필요가 없습니다. 즉, 코드를 재구성하여 차세대 런타임에서 번들 서비스에 액세스하는 한 Python 3 App Engine 앱에서 작업 대기열을 계속 사용할 수 있습니다.
모듈 17 Codelab 및 관련 동영상에서 번들 서비스 사용량을 Python 3로 이전하는 방법을 자세히 알아볼 수 있습니다. 이 주제는 모듈 7의 범위를 벗어나지만, 아래 링크는 Python 3으로 포팅된 모듈 1과 7 앱 모두의 Python 3 버전이며 여전히 App Engine NBS와 태스크 큐를 사용하고 있습니다.
8. 추가 리소스
아래에는 이 모듈이나 관련 이전 모듈 및 관련 제품을 자세히 살펴보는 개발자를 위한 추가 리소스가 나열되어 있습니다. 여기에는 이 콘텐츠에 대한 의견을 제공할 수 있는 곳, 코드 링크 및 도움이 될 만한 다양한 문서가 포함됩니다.
Codelab 문제/의견
이 Codelab에 문제가 발견된 경우 문제를 기록하기 전에 먼저 비슷한 기록이 있는지 검색해보세요. 검색 및 새 문제 만들기 링크:
마이그레이션 리소스
모듈 2 (START)와 모듈 7 (FINISH)의 저장소 폴더 링크는 아래 표에서 찾을 수 있습니다.
Codelab | Python 2 | Python 3 |
code (이 가이드에 포함되지 않음) | ||
모듈 7 (이 Codelab) | code (이 가이드에 포함되지 않음) |
온라인 리소스
다음은 이 튜토리얼과 관련이 있을 수 있는 온라인 리소스입니다.
App Engine 작업 대기열
- App Engine 태스크 큐 개요
- App Engine 작업 대기열 내보내기 대기열 개요
- 태스크 큐 push 큐 만들기
queue.yaml
참조queue.yaml
및 Cloud Tasks 비교- Cloud Tasks로 큐 내보내기 마이그레이션 가이드
- App Engine 태스크 큐에서 Cloud Tasks로 큐 내보내기 문서 샘플
App Engine 플랫폼
- App Engine 문서
- Python 2 App Engine (표준 환경) 런타임
- Python 2 App Engine에서 App Engine 기본 제공 라이브러리 사용
- Python 3 App Engine (표준 환경) 런타임
- Python 2와 Python 2의 차이점 3 App Engine (표준 환경) 런타임
- Python 2에서 3으로 App Engine (표준 환경) 마이그레이션 가이드
- App Engine 가격 책정 및 할당량 정보
- 2세대 App Engine 플랫폼 출시 (2018)
- 이전 기간과 2세대 플랫폼
- 기존 런타임 장기 지원
- 문서 마이그레이션 샘플
- 커뮤니티 제공 이전 샘플
기타 클라우드 정보
- Google Cloud Platform에서 Python 사용
- Google Cloud Python 클라이언트 라이브러리
- Google Cloud '항상 무료' 등급
- Google Cloud SDK (
gcloud
명령줄 도구) - 모든 Google Cloud 문서
동영상
라이선스
이 작업물은 Creative Commons Attribution 2.0 일반 라이선스에 따라 사용이 허가되었습니다.