arrow_back

PDF 파일을 생성하는 서버리스 앱 빌드(Cloud Run 사용)

로그인 가입
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

PDF 파일을 생성하는 서버리스 앱 빌드(Cloud Run 사용)

Lab 1시간 universal_currency_alt 크레딧 5개 show_chart 중급
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP644

Google Cloud 사용자 주도형 실습

Pet Theory 로고

개요

릴리는 12년 전에 Pet Theory 동물병원 체인을 시작했습니다. Pet Theory는 현재 DOCX 형식의 인보이스를 고객에게 보내고 있지만 많은 고객이 송장을 열 수 없다고 불만을 제기하고 있습니다. 고객 만족도 개선을 위해 릴리는 IT 부서의 패트릭에게 현재 상황을 개선할 수 있는 대안을 조사해 달라고 요청했습니다.

Pet Theory의 운영팀은 1인으로 구성되어 있어 지속적인 유지 관리가 많이 필요하지 않은 비용 효율적인 솔루션에 투자하고 싶어합니다. 다양한 처리 옵션을 분석한 후 패트릭은 Cloud Run을 사용하기로 결정합니다.

Cloud Run은 서버리스이므로 모든 인프라 관리를 추상화해 줍니다. 따라서 오버헤드에 대해 걱정하는 대신 애플리케이션 빌드에 집중할 수 있습니다. Google 서버리스 제품으로서 scale-to-zero가 가능하므로 사용하지 않을 때는 비용이 발생하지 않습니다. 또한 컨테이너 기반의 맞춤 바이너리 패키지를 사용할 수 있으므로 이제 일관되고 격리된 아티팩트를 빌드할 수 있습니다.

이 실습에서는 Cloud Run을 사용하여, Cloud Storage에 저장된 파일을 별도의 폴더에 저장되는 PDF로 자동 변환하는 PDF 변환기 웹 앱을 빌드합니다.

아키텍처

이 다이어그램은 사용할 서비스에 대한 개요와 이러한 서비스가 서로 연결되는 방식을 보여줍니다.

아키텍처 다이어그램

목표

이 실습에서는 다음 작업을 수행하는 방법을 배웁니다.

  • Node JS 애플리케이션을 컨테이너로 변환합니다.
  • Google Cloud Build로 컨테이너를 빌드합니다.
  • 클라우드에서 파일을 PDF 파일로 변환하는 Cloud Run 서비스를 만듭니다.
  • Cloud Storage로 이벤트 처리를 사용합니다.

기본 요건

이 실습은 중급 수준의 실습으로, 콘솔 및 셸 환경에 익숙하다는 가정하에 진행됩니다. Firebase 사용 경험이 있으면 도움이 되지만 필수는 아닙니다. 이 실습을 시작하기 전에 다음 Google Cloud Skills Boost 실습을 완료하는 것이 좋습니다.

준비가 됐으면 아래로 스크롤하여 아래 단계에 따라 실습 환경을 설정하세요.

설정 및 요건

실습 시작 버튼을 클릭하기 전에

다음 안내를 확인하세요. 실습에는 시간 제한이 있으며 일시중지할 수 없습니다. 실습 시작을 클릭하면 타이머가 시작됩니다. 이 타이머에는 Google Cloud 리소스를 사용할 수 있는 시간이 얼마나 남았는지 표시됩니다.

실무형 실습을 통해 시뮬레이션이나 데모 환경이 아닌 실제 클라우드 환경에서 직접 실습 활동을 진행할 수 있습니다. 실습 시간 동안 Google Cloud에 로그인하고 액세스하는 데 사용할 수 있는 새로운 임시 사용자 인증 정보가 제공됩니다.

이 실습을 완료하려면 다음을 준비해야 합니다.

  • 표준 인터넷 브라우저 액세스 권한(Chrome 브라우저 권장)
참고: 이 실습을 실행하려면 시크릿 모드 또는 시크릿 브라우저 창을 사용하세요. 개인 계정과 학생 계정 간의 충돌로 개인 계정에 추가 요금이 발생하는 일을 방지해 줍니다.
  • 실습을 완료하기에 충분한 시간---실습을 시작하고 나면 일시중지할 수 없습니다.
참고: 계정에 추가 요금이 발생하지 않도록 하려면 개인용 Google Cloud 계정이나 프로젝트가 이미 있어도 이 실습에서는 사용하지 마세요.

실습을 시작하고 Google Cloud 콘솔에 로그인하는 방법

  1. 실습 시작 버튼을 클릭합니다. 실습 비용을 결제해야 하는 경우 결제 수단을 선택할 수 있는 팝업이 열립니다. 왼쪽에는 다음과 같은 항목이 포함된 실습 세부정보 패널이 있습니다.

    • Google 콘솔 열기 버튼
    • 남은 시간
    • 이 실습에 사용해야 하는 임시 사용자 인증 정보
    • 필요한 경우 실습 진행을 위한 기타 정보
  2. Google 콘솔 열기를 클릭합니다. 실습에서 리소스가 가동된 후 로그인 페이지가 표시된 다른 탭이 열립니다.

    팁: 두 개의 탭을 각각 별도의 창으로 나란히 정렬하세요.

    참고: 계정 선택 대화상자가 표시되면 다른 계정 사용을 클릭합니다.
  3. 필요한 경우 실습 세부정보 패널에서 사용자 이름을 복사하여 로그인 대화상자에 붙여넣습니다. 다음을 클릭합니다.

  4. 실습 세부정보 패널에서 비밀번호를 복사하여 시작 대화상자에 붙여넣습니다. 다음을 클릭합니다.

    중요: 왼쪽 패널에 표시된 사용자 인증 정보를 사용해야 합니다. Google Cloud Skills Boost 사용자 인증 정보를 사용하지 마세요. 참고: 이 실습에 자신의 Google Cloud 계정을 사용하면 추가 요금이 발생할 수 있습니다.
  5. 이후에 표시되는 페이지를 클릭하여 넘깁니다.

    • 이용약관에 동의합니다.
    • 임시 계정이므로 복구 옵션이나 2단계 인증을 추가하지 않습니다.
    • 무료 평가판을 신청하지 않습니다.

잠시 후 Cloud 콘솔이 이 탭에서 열립니다.

참고: 왼쪽 상단에 있는 탐색 메뉴를 클릭하면 Google Cloud 제품 및 서비스 목록이 있는 메뉴를 볼 수 있습니다. 탐색 메뉴 아이콘

Cloud Shell 활성화

Cloud Shell은 다양한 개발 도구가 탑재된 가상 머신으로, 5GB의 영구 홈 디렉터리를 제공하며 Google Cloud에서 실행됩니다. Cloud Shell을 사용하면 명령줄을 통해 Google Cloud 리소스에 액세스할 수 있습니다.

  1. Google Cloud 콘솔 상단에서 Cloud Shell 활성화 Cloud Shell 활성화 아이콘를 클릭합니다.

연결되면 사용자 인증이 이미 처리된 것이며 프로젝트가 PROJECT_ID로 설정됩니다. 출력에 이 세션의 PROJECT_ID를 선언하는 줄이 포함됩니다.

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

gcloud는 Google Cloud의 명령줄 도구입니다. Cloud Shell에 사전 설치되어 있으며 명령줄 자동 완성을 지원합니다.

  1. (선택사항) 다음 명령어를 사용하여 활성 계정 이름 목록을 표시할 수 있습니다.
gcloud auth list
  1. 승인을 클릭합니다.

  2. 다음과 비슷한 결과가 출력됩니다.

출력:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (선택사항) 다음 명령어를 사용하여 프로젝트 ID 목록을 표시할 수 있습니다.
gcloud config list project

출력:

[core] project = <project_ID>

출력 예시:

[core] project = qwiklabs-gcp-44776a13dea667a6 참고: gcloud 전체 문서는 Google Cloud에서 gcloud CLI 개요 가이드를 참조하세요.

작업 1. 작업 이해

Pet Theory는 고객이 안정적으로 열 수 있도록 송장을 PDF로 변환하려고 합니다. 팀에서는 사무실 관리자인 리사의 워크로드를 최소화하기 위해 이 변환을 자동으로 수행하려고 합니다.

Pet Theory의 컴퓨터 컨설턴트인 루비가 IT 부서의 패트릭에게 메시지를 받습니다...

패트릭

패트릭, IT 관리자

루비님, 안녕하세요.

조사를 좀 해 봤는데요, 다양한 파일 형식을 PDF로 변환하는 데 LibreOffice가 적합하다는 것을 확인했습니다.

서버를 유지 관리할 필요 없이 클라우드에서 LibreOffice를 실행할 수 있을까요?

패트릭

루비루비, 소프트웨어 컨설턴트

패트릭님, 안녕하세요.

이 상황에 딱 맞는 것이 있어요.

방금 YouTube에서 Cloud Run에 대한 Next 19 동영상을 봤는데 대단했어요. Cloud Run을 사용하면 LibreOffice를 서버리스 환경에서 실행할 수 있을 것 같아요. 서버 관리도 필요 없어요.

설정하는 데 도움이 되는 리소스 몇 가지를 보낼게요.

루비

패트릭이 Cloud Run을 설정하고 배포하도록 돕습니다.

작업 2. Cloud Run API 사용 설정

  1. 탐색 메뉴(탐색 메뉴 아이콘)를 열고 API 및 서비스 > 라이브러리를 클릭합니다. 검색창에 'Cloud Run'을 입력하고 결과 목록에서 Cloud Run Admin API를 선택합니다.

  2. 사용 설정을 클릭하고 브라우저에서 뒤로 버튼을 두 번 누릅니다. 이제 다음과 유사한 콘솔이 표시됩니다.

Cloud Run API 결과

작업 3. 간단한 Cloud Run 서비스 배포

루비는 Cloud Run 프로토타입을 개발했으며 패트릭이 이를 Google Cloud에 배포하길 원합니다. 이제 패트릭이 Pet Theory를 위한 PDF Cloud Run 서비스를 구축하도록 도와주세요.

  1. 새 Cloud Shell 세션을 열고 다음 명령어를 실행하여 Pet Theory 저장소를 복제합니다.

    git clone https://github.com/rosera/pet-theory.git
  2. 그런 다음 현재 작업 디렉터리를 lab03으로 변경합니다.

    cd pet-theory/lab03
  3. Cloud Shell 코드 편집기 또는 원하는 텍스트 편집기를 사용하여 package.json을 편집합니다. "scripts" 섹션에서 아래와 같이 "start": "node index.js",를 추가합니다.

    ... "scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, ...
  4. 이제 변환 스크립트에서 사용할 패키지를 설치하기 위해 Cloud Shell에서 다음 명령어를 실행합니다.

    npm install express npm install body-parser npm install child_process npm install @google-cloud/storage
  5. 이제 lab03/index.js 파일을 열고 코드를 검토합니다.

    애플리케이션은 HTTP POST를 허용하는 Cloud Run 서비스로 배포됩니다. POST 요청이 업로드된 파일에 대한 Pub/Sub 알림인 경우 서비스는 파일 세부정보를 로그에 기록합니다. 그렇지 않다면 서비스는 단순히 "OK" 문자열을 반환합니다.

  6. lab03/Dockerfile라는 이름의 파일을 검토합니다.

    위 파일은 매니페스트라고 하며 이미지를 빌드하기 위한 Docker 명령어에 대한 레시피를 제공합니다. 각 줄은 Docker에게 다음 정보를 처리하는 방법을 알려주는 명령어로 시작됩니다.

    • 첫 번째 목록은 기본 이미지가 생성할 이미지의 템플릿으로 노드를 사용해야 함을 나타냅니다.
    • 마지막 줄은 수행할 명령어를 표시하며, 이 인스턴스는 "npm start"를 나타냅니다.
  7. REST API를 빌드하고 배포하려면 Google Cloud Build를 사용합니다. 빌드 프로세스를 시작하려면 다음 명령어를 실행합니다.

    gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/pdf-converter

    이 명령어는 코드로 컨테이너를 빌드하고 프로젝트의 Artifact Registry에 저장합니다.

  8. Cloud 콘솔로 돌아가서 탐색 메뉴를 열고 Artifact Registry > 이미지를 선택합니다. 컨테이너가 호스팅된 모습이 보일 것입니다.

    PDF 변환기가 나열된 Artifact Registry

완료된 작업 테스트하기

내 진행 상황 확인하기를 클릭하여 위 작업을 올바르게 수행했는지 확인합니다.

간단한 REST API 빌드
  1. 코드 편집기 탭으로 돌아가서 Cloud Shell에서 다음 명령어를 실행하여 애플리케이션을 배포합니다.

    gcloud run deploy pdf-converter \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/pdf-converter \ --platform managed \ --region {{{ project_0.default_region | Region }}} \ --no-allow-unauthenticated \ --max-instances=1
  2. 배포가 완료되면 다음과 같은 메시지가 표시됩니다.

    Service [pdf-converter] revision [pdf-converter-00001] has been deployed and is serving 100 percent of traffic at https://pdf-converter-[hash].a.run.app
  3. 쉽게 액세스할 수 있도록 앱에 대한 환경 변수 $SERVICE_URL을 다음과 같이 만듭니다.

    SERVICE_URL=$(gcloud beta run services describe pdf-converter --platform managed --region {{{ project_0.default_region | Lab Region }}} --format="value(status.url)") echo $SERVICE_URL

완료된 작업 테스트하기

내 진행 상황 확인하기를 클릭하여 위 작업을 올바르게 수행했는지 확인합니다.

Cloud Run 버전 만들기
  1. 새 서비스에 대해 익명 POST 요청을 다음과 같이 수행합니다.

    curl -X POST $SERVICE_URL 참고:
    이렇게 하면 'Your client does not have permission to get the URL.'(클라이언트에 URL을 가져올 수 있는 권한이 없습니다.)라는 오류 메시지가 표시됩니다. 이는 좋은 결과입니다. 익명 사용자가 서비스를 호출해서는 안 됩니다.
  2. 이제 승인된 사용자로 다음과 같이 서비스 호출을 시도합니다.

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-identity-token)" $SERVICE_URL

    "OK"라는 응답을 받으면 Cloud Run 서비스가 성공적으로 배포된 것입니다. 무사히 완료하셨습니다.

작업 4. 새 파일이 업로드되면 Cloud Run 서비스를 트리거

이제 Cloud Run 서비스가 성공적으로 배포되었으므로 루비는 패트릭에게 변환할 데이터를 위한 스테이징 영역을 만들도록 요청합니다. Cloud Storage 버킷은 파일이 업로드되어 처리되어야 할 때 이벤트 트리거를 사용하여 애플리케이션에 알립니다.

  1. 업로드되는 문서용 버킷을 Cloud Storage에 다음 명령어를 실행하여 만듭니다.

    gsutil mb gs://$GOOGLE_CLOUD_PROJECT-upload
  2. 그리고 처리되는 PDF용 버킷을 하나 더 다음과 같이 만듭니다.

    gsutil mb gs://$GOOGLE_CLOUD_PROJECT-processed
  3. 이제 Cloud 콘솔 탭으로 돌아가서 탐색 메뉴를 열고 Cloud Storage를 선택합니다. 버킷이 생성되었는지 확인합니다(플랫폼에서 사용하는 다른 버킷도 여기에 있을 것입니다).

완료된 작업 테스트하기

내 진행 상황 확인하기를 클릭하여 위 작업을 올바르게 수행했는지 확인합니다.

2개의 Cloud Storage 버킷 만들기
  1. Cloud Shell에서 다음 명령어를 실행하여 새 파일이 문서 버킷에 업로드를 완료할 때마다 Cloud Storage이 Pub/Sub 알림을 보내도록 지시합니다.

    gsutil notification create -t new-doc -f json -e OBJECT_FINALIZE gs://$GOOGLE_CLOUD_PROJECT-upload

    알림은 'new-doc'라는 주제로 라벨이 지정됩니다.

완료된 작업 테스트하기

내 진행 상황 확인하기를 클릭하여 위 작업을 올바르게 수행했는지 확인합니다.

스토리지 버킷의 알림을 처리하기 위한 Pub/Sub 주제 만들기
  1. 그런 다음 Pub/Sub가 Cloud Run 서비스를 트리거하는 데 사용할 새 서비스 계정을 만듭니다.

    gcloud iam service-accounts create pubsub-cloud-run-invoker --display-name "PubSub Cloud Run Invoker"
  2. PDF 변환기 서비스를 호출할 수 있는 권한을 새 서비스 계정에 부여합니다.

    gcloud beta run services add-iam-policy-binding pdf-converter \ --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \ --role=roles/run.invoker \ --platform managed \ --region {{{ project_0.default_region | Lab Region }}}
  3. 다음 명령어를 실행하여 프로젝트 번호를 찾습니다.

    gcloud projects list --filter="PROJECT_ID={{{ project_0.project_id | PROJECT_ID }}}"

    다음 명령어에서는 프로젝트 번호 값을 사용하게 됩니다.

    PROJECT_ID: {{{ project_0.project_id | PROJECT_ID }}} NAME: {{{ project_0.project_id | PROJECT_ID }}} PROJECT_NUMBER: 103480415252
  4. PROJECT_NUMBER 환경 변수를 만듭니다.

    PROJECT_NUMBER=$(gcloud projects list --filter="PROJECT_ID={{{ project_0.project_id | PROJECT_ID }}}" --format=json | jq -r .[0].projectNumber)
  5. 마지막으로 'new-doc' 주제에 메시지가 게시될 때마다 PDF 변환기가 실행될 수 있도록 Pub/Sub 구독을 만듭니다.

    gcloud beta pubsub subscriptions create pdf-conv-sub \ --topic new-doc \ --push-endpoint=$SERVICE_URL \ --push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com

완료된 작업 테스트하기

내 진행 상황 확인하기를 클릭하여 위 작업을 올바르게 수행했는지 확인합니다.

Pub/Sub 구독 만들기

작업 5. 파일이 Cloud Storage에 업로드될 때 Cloud Run 서비스가 트리거되는지 확인

애플리케이션이 예상대로 작동하는지 확인하기 위해 루비는 패트릭에게 이름이 지정된 스토리지 버킷에 일부 테스트 데이터를 업로드한 다음 Cloud Logging을 확인하도록 요청합니다.

  1. 일부 테스트 파일을 다음과 같이 업로드 버킷에 복사합니다.

    gsutil -m cp gs://spls/gsp644/* gs://$GOOGLE_CLOUD_PROJECT-upload
  2. 업로드가 완료되면 Cloud 콘솔 탭으로 돌아가 탐색 메뉴를 열고 작업 섹션에서 Logging을 선택합니다.

  3. 리소스 드롭다운에서 결과를 Cloud Run 버전으로 필터링하고 적용을 클릭합니다. 그런 다음 쿼리 실행을 클릭합니다.

  4. 쿼리 결과에서 file:로 시작하는 로그 항목을 찾아 클릭합니다. 새 파일이 업로드될 때 Pub/Sub가 Cloud Run 서비스로 전송하는 파일 데이터의 덤프를 보여줍니다.

  5. 이 객체에서 업로드한 파일 이름을 찾을 수 있습니까?

    쿼리 결과

    참고:
    'file'(파일)로 시작하는 로그 항목이 표시되지 않으면 페이지 하단 근처에 있는 '최신 로그 로드' 버튼을 클릭해 보세요.
  6. 이제 코드 편집기 탭으로 돌아가 Cloud Shell에서 다음 명령어를 실행하여 upload디렉터리에 있는 파일을 삭제하여 정리합니다.

    gsutil -m rm gs://$GOOGLE_CLOUD_PROJECT-upload/*

작업 6. 컨테이너

패트릭은 모든 고객이 열 수 있도록 밀린 인보이스를 PDF로 변환해야 합니다. 루비에게 이메일을 보내 도움을 요청합니다...

패트릭

패트릭, IT 관리자

루비님, 안녕하세요.

알려주신 내용 덕분에 이 프로세스를 자동화하고 인보이스 형식으로 PDF를 사용하도록 전환할 수 있을 것으로 보입니다.

어제 솔루션을 코딩하는 데 시간을 좀 들였고 필요한 작업을 수행하기 위해 Node.js 스크립트를 작성했습니다. 한번 확인해 주실 수 있을까요?

패트릭

패트릭은 루비에게 파일에서 PDF를 생성하기 위해 다음과 같이 자신이 작성한 코드 프래그먼트를 보냅니다.

const {promisify} = require('util'); const exec = promisify(require('child_process').exec); const cmd = 'libreoffice --headless --convert-to pdf --outdir ' + `/tmp "/tmp/${fileName}"`; const { stdout, stderr } = await exec(cmd); if (stderr) { throw stderr; }

루비가 패트릭에게 응답합니다...

루비

루비, 소프트웨어 컨설턴트

패트릭님, 안녕하세요.

Cloud Run은 컨테이너를 사용하므로 애플리케이션을 이 형식으로 제공해야 해요. 다음 단계에서는 애플리케이션에 대한 Dockerfile 매니페스트를 생성해야 합니다.

코드에서 LibreOffice를 사용하는군요. 해당 소프트웨어를 설치하기 위한 명령어를 보내주실 수 있나요? 컨테이너에 포함해야 하거든요.

루비

패트릭

패트릭, IT 관리자

루비님, 안녕하세요.

좋습니다. 제가 사무실 서버에 LibreOffice를 설치하는 방법은 일반적으로 다음과 같습니다.

apt-get update -y && apt-get install -y libreoffice && apt-get clean

정보가 더 필요하시면 알려주세요.

패트릭

컨테이너를 빌드하려면 다음과 같은 여러 구성요소의 통합이 필요합니다.

구성요소: index.js, OfficeLibre, Express, body-parser, child_process, @google-cloud/storage

매니페스트 업데이트

모든 파일이 확인되었으므로 이제 매니페스트를 만들 수 있습니다. 루비가 컨테이너를 설정하고 배포하도록 도와주세요.

이전에 LibreOffice용 패키지가 컨테이너에 포함되지 않았으므로 이제 이를 추가해야 합니다. 패트릭은 애플리케이션을 빌드하는 데 사용하는 명령어를 이전에 제공했고, 루비가 이를 Dockerfile 내에 RUN 명령어로 추가합니다.

  1. Dockerfile 매니페스트를 열고 아래와 같이 RUN apt-get update -y && apt-get install -y libreoffice && apt-get clean 명령어를 추가합니다.

    FROM {{{ project_0.startup_script.node_version | NODE_VERSION }}} RUN apt-get update -y \ && apt-get install -y libreoffice \ && apt-get clean WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

PDF 변환 서비스의 새 버전 배포

  1. index.js 파일을 열고 파일 상단에 다음 패키지 요구사항을 추가합니다.

    const {promisify} = require('util'); const {Storage} = require('@google-cloud/storage'); const exec = promisify(require('child_process').exec); const storage = new Storage();
  2. app.post('/', async (req, res)를 다음과 같은 코드로 바꿉니다.

    app.post('/', async (req, res) => { try { const file = decodeBase64Json(req.body.message.data); await downloadFile(file.bucket, file.name); const pdfFileName = await convertFile(file.name); await uploadFile(process.env.PDF_BUCKET, pdfFileName); await deleteFile(file.bucket, file.name); } catch (ex) { console.log(`Error: ${ex}`); } res.set('Content-Type', 'text/plain'); res.send('\n\nOK\n\n'); })
  3. 이제 LibreOffice 문서를 처리하는 다음 코드를 파일 맨 아래에 추가합니다.

    async function downloadFile(bucketName, fileName) { const options = {destination: `/tmp/${fileName}`}; await storage.bucket(bucketName).file(fileName).download(options); } async function convertFile(fileName) { const cmd = 'libreoffice --headless --convert-to pdf --outdir /tmp ' + `"/tmp/${fileName}"`; console.log(cmd); const { stdout, stderr } = await exec(cmd); if (stderr) { throw stderr; } console.log(stdout); pdfFileName = fileName.replace(/\.\w+$/, '.pdf'); return pdfFileName; } async function deleteFile(bucketName, fileName) { await storage.bucket(bucketName).file(fileName).delete(); } async function uploadFile(bucketName, fileName) { await storage.bucket(bucketName).upload(`/tmp/${fileName}`); }
  4. index.js 파일이 다음과 같이 표시되는지 확인합니다.

    참고:
    형식 오류를 방지하려면 index.js 파일의 모든 코드를 이 예시 코드로 바꾸는 것이 좋습니다.
    const {promisify} = require('util'); const {Storage} = require('@google-cloud/storage'); const exec = promisify(require('child_process').exec); const storage = new Storage(); const express = require('express'); const bodyParser = require('body-parser'); const app = express(); app.use(bodyParser.json()); const port = process.env.PORT || 8080; app.listen(port, () => { console.log('Listening on port', port); }); app.post('/', async (req, res) => { try { const file = decodeBase64Json(req.body.message.data); await downloadFile(file.bucket, file.name); const pdfFileName = await convertFile(file.name); await uploadFile(process.env.PDF_BUCKET, pdfFileName); await deleteFile(file.bucket, file.name); } catch (ex) { console.log(`Error: ${ex}`); } res.set('Content-Type', 'text/plain'); res.send('\n\nOK\n\n'); }) function decodeBase64Json(data) { return JSON.parse(Buffer.from(data, 'base64').toString()); } async function downloadFile(bucketName, fileName) { const options = {destination: `/tmp/${fileName}`}; await storage.bucket(bucketName).file(fileName).download(options); } async function convertFile(fileName) { const cmd = 'libreoffice --headless --convert-to pdf --outdir /tmp ' + `"/tmp/${fileName}"`; console.log(cmd); const { stdout, stderr } = await exec(cmd); if (stderr) { throw stderr; } console.log(stdout); pdfFileName = fileName.replace(/\.\w+$/, '.pdf'); return pdfFileName; } async function deleteFile(bucketName, fileName) { await storage.bucket(bucketName).file(fileName).delete(); } async function uploadFile(bucketName, fileName) { await storage.bucket(bucketName).upload(`/tmp/${fileName}`); }
  • 주요 로직은 다음 함수에 포함되어 있습니다.
const file = decodeBase64Json(req.body.message.data); await downloadFile(file.bucket, file.name); const pdfFileName = await convertFile(file.name); await uploadFile(process.env.PDF_BUCKET, pdfFileName); await deleteFile(file.bucket, file.name);

파일이 업로드될 때마다 이 서비스가 트리거됩니다. 위의 한 줄에 하나씩 다음 작업을 수행합니다.

  • Pub/Sub 알림에서 파일 세부정보를 추출합니다.
  • Cloud Storage에서 로컬 하드 드라이브로 파일을 다운로드합니다. 이것은 실제 물리적 디스크가 아니라 디스크처럼 작동하는 가상 메모리 섹션입니다.
  • 다운로드한 파일을 PDF로 변환합니다.
  • PDF 파일을 Cloud Storage에 업로드합니다. 환경 변수 process.env.PDF_BUCKET에는 PDF를 작성할 Cloud Storage 버킷의 이름이 포함되어 있습니다. 아래 서비스를 배포할 때 이 변수에 값을 할당합니다.
  • Cloud Storage에서 원본 파일을 삭제합니다.

index.js의 나머지 부분은 이 최상위 코드에서 호출되는 함수를 구현합니다.

이제 서비스를 배포하고 PDF_BUCKET 환경 변수를 설정할 차례입니다. LibreOffice에 작업할 RAM 2GB를 제공하는 것도 좋습니다(--memory 옵션이 있는 줄 참조).

  1. 다음 명령어를 실행하여 컨테이너를 빌드합니다.

    gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/pdf-converter
참고:
Cloud Build API 사용 설정을 위한 메시지가 표시되면 Y를 입력합니다

완료된 작업 테스트하기

내 진행 상황 확인하기를 클릭하여 위 작업을 올바르게 수행했는지 확인합니다.

REST API용 다른 빌드 만들기
  1. 이제 애플리케이션의 최신 버전을 배포합니다.

    gcloud run deploy pdf-converter \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/pdf-converter \ --platform managed \ --region {{{ project_0.default_region | Lab Region }}} \ --memory=2Gi \ --no-allow-unauthenticated \ --max-instances=1 \ --set-env-vars PDF_BUCKET=$GOOGLE_CLOUD_PROJECT-processed

컨테이너의 LibreOffice 부분을 사용하면 이 빌드가 이전 빌드보다 오래 걸립니다. 일어나서 몇 분 동안 스트레칭을 하기에 좋은 시간입니다.

내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.

새 버전 만들기

작업 7. PDF 변환 서비스 테스트

  1. 배포 명령이 완료되면 다음을 실행하여 서비스가 올바르게 배포되었는지 확인합니다.

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-identity-token)" $SERVICE_URL
  2. "OK"라는 응답을 받으면 업데이트된 Cloud Run 서비스가 성공적으로 배포된 것입니다. LibreOffice는 DOCX, XLSX, JPG, PNG, GIF 등 다양한 파일 형식을 PDF로 변환할 수 있습니다.

  3. 다음 명령어를 실행하여 몇 가지 예시 파일을 업로드합니다.

    gsutil -m cp gs://spls/gsp644/* gs://$GOOGLE_CLOUD_PROJECT-upload
  4. Cloud 콘솔로 돌아가서 탐색 메뉴를 열고 Cloud Storage를 선택합니다. -upload 버킷을 열고 새로고침 버튼을 여러 번 클릭하여 파일이 PDF로 변환될 때 어떻게 하나씩 삭제되는지 확인합니다.

  5. 그런 다음 왼쪽 메뉴에서 버킷을 클릭하고 이름이 "-processed"로 끝나는 버킷을 클릭합니다. 여기에는 모든 파일의 PDF 버전이 포함되어 있어야 합니다. PDF 파일을 열어서 제대로 변환되었는지 확인하는 것도 좋습니다.

    참고:
    -processed 버킷에 변환된 PDF 파일이 모두 표시되지 않으면 명령어를 다시 실행합니다.

수고하셨습니다

Pet Theory에는 이제 오래된 보관 파일을 PDF로 변환하는 시스템이 생겼습니다. 이전 파일을 'upload' 버킷에 업로드하기만 하면 pdf 변환기 서비스가 해당 파일을 변환하여 'processed' 버킷에 PDF로 기록합니다.

Serverless Cloud Run Development 과정을 통해 서버리스 여정을 계속 이어가세요. 가상의 비즈니스 시나리오를 읽고 시나리오 속 인물들의 서버리스 마이그레이션 계획을 지원하게 됩니다.

Google Cloud 교육 및 자격증

Google Cloud 기술을 최대한 활용하는 데 도움이 됩니다. Google 강의에는 빠른 습득과 지속적인 학습을 지원하는 기술적인 지식과 권장사항이 포함되어 있습니다. 기초에서 고급까지 수준별 학습을 제공하며 바쁜 일정에 알맞은 주문형, 실시간, 가상 옵션이 포함되어 있습니다. 인증은 Google Cloud 기술에 대한 역량과 전문성을 검증하고 입증하는 데 도움이 됩니다.

설명서 최종 업데이트: 2024년 5월 28일

실습 최종 테스트: 2024년 5월 28일

Copyright 2024 Google LLC All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.