arrow_back

Go と Cloud Run を使用した PDF の作成

参加 ログイン
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

Go と Cloud Run を使用した PDF の作成

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

GSP762

Google Cloud セルフペース ラボ

概要

このラボでは、Cloud Run 上でPDF コンバータ ウェブ アプリをビルドします。Cloud Run は サーバーレス サービスで、Google ドライブに保存されているファイルを PDF に自動変換し、別の Google ドライブ フォルダに保存する機能を持っています。

学習内容

  • Go アプリケーションをコンテナに変換する。
  • Google Cloud Build でコンテナをビルドする方法を学ぶ。
  • クラウドでファイルを PDF ファイルに変換する Cloud Run サービスを作成する。
  • サービス アカウントを作成する方法と権限を追加する方法を理解する。
  • Cloud Storage でイベント処理を使用する。

前提条件

これは基礎レベルのラボです。このラボは、Cloud Console と Cloud Shell に精通していることを前提としています。

ファイルの編集にも慣れている必要があります。ご自身で使い慣れたテキスト エディタ(nano、vi など)を使用するか、上部のリボンにある Cloud Shell からコードエディタを起動してください。

Cloud Shell エディタ アイコン

設定と要件

[ラボを開始] ボタンをクリックする前に

こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。

このハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。

このラボを完了するためには、下記が必要です。

  • 標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。
  • ラボを完了するために十分な時間を確保してください。ラボをいったん開始すると一時停止することはできません。
注: すでに個人の Google Cloud アカウントやプロジェクトをお持ちの場合でも、このラボでは使用しないでください。アカウントへの追加料金が発生する可能性があります。

ラボを開始して Google Cloud コンソールにログインする方法

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。

    • [Google コンソールを開く] ボタン
    • 残り時間
    • このラボで使用する必要がある一時的な認証情報
    • このラボを行うために必要なその他の情報(ある場合)
  2. [Google コンソールを開く] をクリックします。 ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。

    ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。

    注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
  3. 必要に応じて、[ラボの詳細] パネルから [ユーザー名] をコピーして [ログイン] ダイアログに貼り付けます。[次へ] をクリックします。

  4. [ラボの詳細] パネルから [パスワード] をコピーして [ようこそ] ダイアログに貼り付けます。[次へ] をクリックします。

    重要: 認証情報は左側のパネルに表示されたものを使用してください。Google Cloud Skills Boost の認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
  5. その後次のように進みます。

    • 利用規約に同意してください。
    • 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
    • 無料トライアルには登録しないでください。

その後このタブで Cloud Console が開きます。

注: 左上にある [ナビゲーション メニュー] をクリックすると、Google Cloud のプロダクトやサービスのリストが含まれるメニューが表示されます。 ナビゲーション メニュー アイコン

Cloud Shell をアクティブにする

Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、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 注: Google Cloud における gcloud ドキュメントの全文については、gcloud CLI の概要ガイドをご覧ください。

アーキテクチャ

このラボでは、Pet Theory 獣医クリニックの顧客が請求書を確実に開けるように、請求書を PDF に自動変換するクリニックの取り組みをサポートします。

アーキテクチャの図

Google API の使用

このラボでは、Google API を使用します。次の API はすでに有効になっています。

名前 API
Cloud Build cloudbuild.googleapis.com
Cloud Storage storage-component.googleapis.com
Cloud Run run.googleapis.com

タスク 1. ソースコードを取得する

まずは、このラボで必要なコードをダウンロードしてください。

  1. ラボアカウントを有効にします。
gcloud auth list --filter=status:ACTIVE --format="value(account)"
  1. 次のコマンドを実行して、Pet Theory リポジトリのクローンを作成します。
git clone https://github.com/Deleplace/pet-theory.git
  1. 正しいディレクトリに移動します。
cd pet-theory/lab03

タスク 2. 請求書のマイクロサービスを作成する

このセクションでは、リクエストを処理する Go アプリケーションを作成します。アーキテクチャ図に記載されているように、Cloud Storage をソリューションの一部として統合します。

  1. エディタを開く」アイコン、[新しいウィンドウで開く] の順にクリックします。

  2. pet-theory > lab03 > server.go に移動します。

  3. server.go ソースコードを開き、次のテキストと同じになるように編集します。

package main import ( "fmt" "io/ioutil" "log" "net/http" "os" "os/exec" "regexp" "strings" ) func main() { http.HandleFunc("/", process) port := os.Getenv("PORT") if port == "" { port = "8080" log.Printf("Defaulting to port %s", port) } log.Printf("Listening on port %s", port) err := http.ListenAndServe(fmt.Sprintf(":%s", port), nil) log.Fatal(err) } func process(w http.ResponseWriter, r *http.Request) { log.Println("Serving request") if r.Method == "GET" { fmt.Fprintln(w, "Ready to process POST requests from Cloud Storage trigger") return } // // Cloud Storage オブジェクト メタデータを含むリクエスト本文を読み取ります // gcsInputFile, err1 := readBody(r) if err1 != nil { log.Printf("Error reading POST data: %v", err1) w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, "Problem with POST data: %v \n", err1) return } // // 作業ディレクトリ(同時実行セーフ) // localDir, errDir := ioutil.TempDir("", "") if errDir != nil { log.Printf("Error creating local temp dir: %v", errDir) w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, "Could not create a temp directory on server. \n") return } defer os.RemoveAll(localDir) // // Cloud Storage から入力ファイルをダウンロードします // localInputFile, err2 := download(gcsInputFile, localDir) if err2 != nil { log.Printf("Error downloading Cloud Storage file [%s] from bucket [%s]: %v", gcsInputFile.Name, gcsInputFile.Bucket, err2) w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, "Error downloading Cloud Storage file [%s] from bucket [%s]", gcsInputFile.Name, gcsInputFile.Bucket) return } // // LibreOffice を使用してローカル入力ファイルをローカル PDF ファイルに変換します // localPDFFilePath, err3 := convertToPDF(localInputFile.Name(), localDir) if err3 != nil { log.Printf("Error converting to PDF: %v", err3) w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, "Error converting to PDF.") return } // // 生成したばかりの PDF を Cloud Storage にアップロードします // targetBucket := os.Getenv("PDF_BUCKET") err4 := upload(localPDFFilePath, targetBucket) if err4 != nil { log.Printf("Error uploading PDF file to bucket [%s]: %v", targetBucket, err4) w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, "Error downloading Cloud Storage file [%s] from bucket [%s]", gcsInputFile.Name, gcsInputFile.Bucket) return } // // 元の入力ファイルを Cloud Storage から削除します // err5 := deleteGCSFile(gcsInputFile.Bucket, gcsInputFile.Name) if err5 != nil { log.Printf("Error deleting file [%s] from bucket [%s]: %v", gcsInputFile.Name, gcsInputFile.Bucket, err5) // これはブロッキング エラーではありません // PDF は正常に生成され、アップロードされました } log.Println("Successfully produced PDF") fmt.Fprintln(w, "Successfully produced PDF") } func convertToPDF(localFilePath string, localDir string) (resultFilePath string, err error) { log.Printf("Converting [%s] to PDF", localFilePath) cmd := exec.Command("libreoffice", "--headless", "--convert-to", "pdf", "--outdir", localDir, localFilePath) cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr log.Println(cmd) err = cmd.Run() if err != nil { return "", err } pdfFilePath := regexp.MustCompile(`\.\w+$`).ReplaceAllString(localFilePath, ".pdf") if !strings.HasSuffix(pdfFilePath, ".pdf") { pdfFilePath += ".pdf" } log.Printf("Converted %s to %s", localFilePath, pdfFilePath) return pdfFilePath, nil }
  1. ここで、次のコマンドを実行してアプリケーションをビルドします。
go build -o server

このトップレベルのコードによって呼び出される関数はソースファイルにあります。

  • server.go
  • notification.go
  • gcs.go

アプリケーションが正常にビルドされたので、PDF コンバータ サービスを作成できます。

タスク 3. PDF コンバータ サービスを作成する

PDF サービスでは、ファイルを指定ストレージにアップロードするたびに、Cloud Run と Cloud Storage を使ってプロセスが開始されます。

そのために、Cloud Pub/Sub と一般的なイベント通知パターンを併用します。そうすることで、アプリケーションが情報の処理だけに集中できるようになります。情報を渡して転送する処理は他のサービスで行われるので、アプリケーションをシンプルにすることができます。

請求書モジュールをビルドするには、2 つのコンポーネントを統合する必要があります。

2 つのコンポーネント、サーバーと LibreOffice を含むコンテナ

LibreOffice パッケージを追加すると、アプリケーションで使用できるようになります。

  1. [エディタを開く] で、既存の Dockerfile マニフェストを開き、次のようにファイルを更新します。
FROM debian:buster RUN apt-get update -y \ && apt-get install -y libreoffice \ && apt-get clean WORKDIR /usr/src/app COPY server . CMD [ "./server" ]
  1. 更新した Dockerfile保存します。

  2. Cloud Build を使って pdf-converter イメージの再ビルドを開始します。

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

[進行状況を確認] をクリックして、上記のタスクを実行したことを確認します。

Cloud Build でイメージをビルドする
  1. 更新した PDF コンバータ サービスをデプロイします。
注: LibreOffice の処理には、RAM を 2 GB に指定することをおすすめします。--memory オプションの行をご覧ください。
  1. 次のコマンドを実行して、コンテナをビルドしデプロイします。
gcloud run deploy pdf-converter \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/pdf-converter \ --platform managed \ --region {{{ project_0.default_region | "REGION" }}} \ --memory=2Gi \ --no-allow-unauthenticated \ --set-env-vars PDF_BUCKET=$GOOGLE_CLOUD_PROJECT-processed \ --max-instances=3

[進行状況を確認] をクリックして、上記のタスクを実行したことを確認します。

PDF コンバータ サービスをデプロイする

Cloud Run サービスが正常にデプロイされました。しかし、デプロイしたアプリケーションには適切なアクセス権が必要です。

タスク 4. サービス アカウントを作成する

サービス アカウントは、Google API へのアクセス権を持つ特殊なタイプのアカウントです。

このラボで Cloud Storage イベントを処理する際は、サービス アカウントを使って Cloud Run にアクセスします。Cloud Storage では、イベント トリガーに使用できる豊富な各種通知がサポートされています。

次に、ファイルがアップロードされたときアプリケーションに通知するコードを更新します。

  1. ナビゲーション メニュー > [Cloud Storage] をクリックして、2 つのバケットが作成されたことを確認します。次のように表示されます。
  • PROJECT_ID-processed
  • PROJECT_ID-upload
  1. 新しいファイルがドキュメント バケットにアップロードされたことを示す Pub/Sub 通知を作成します(「uploaded」)。通知にはトピック「new-doc」というラベルが付けられます。
gsutil notification create -t new-doc -f json -e OBJECT_FINALIZE gs://$GOOGLE_CLOUD_PROJECT-upload
  1. 新しいサービス アカウントを作成して、Cloud Run サービスをトリガーします。
gcloud iam service-accounts create pubsub-cloud-run-invoker --display-name "PubSub Cloud Run Invoker"
  1. PDF コンバータ サービスを呼び出す権限をサービス アカウントに付与します。
gcloud run services add-iam-policy-binding pdf-converter \ --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \ --role=roles/run.invoker \ --region {{{ project_0.default_region | "REGION" }}} \ --platform managed
  1. 次のコマンドを実行して、プロジェクト番号を見つけます。
PROJECT_NUMBER=$(gcloud projects list \ --format="value(PROJECT_NUMBER)" \ --filter="$GOOGLE_CLOUD_PROJECT")
  1. プロジェクトで Cloud Pub/Sub 認証トークンを作成できるようにします。
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member=serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator

[進行状況を確認] をクリックして、上記のタスクを実行したことを確認します。

サービス アカウントを作成する

サービス アカウントが作成され、Cloud Run サービスの呼び出しに使用できるようになりました。

タスク 5. Cloud Run サービスをテストする

次に進む前に、デプロイされたサービスをテストします。サービスには認証が必要です。サービスが実際に非公開であることを確認するためにテストを実施します。

  1. 環境変数 $SERVICE_URL にサービスの URL を保存します。
SERVICE_URL=$(gcloud run services describe pdf-converter \ --platform managed \ --region {{{ project_0.default_region | "REGION" }}} \ --format "value(status.url)")
  1. SERVICE URL を表示します。
echo $SERVICE_URL
  1. 新しいサービスに匿名の GET リクエストを行います。
curl -X GET $SERVICE_URL

匿名の GET リクエストを実行すると
"Your client does not have permission to get URL" というエラー メッセージが表示されます。 これは「匿名ユーザーはサービスを呼び出せない」ということですので、表示されても問題ありません。

  1. 次に、承認されたユーザーとしてサービスを呼び出してみます。
curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" $SERVICE_URL
  1. 「Ready to process POST requests from Cloud Storage trigger」というレスポンスが返されます。

認証された Cloud Run サービスを正常にデプロイできました。

タスク 6. Cloud Storage トリガー

新しいコンテンツが Cloud Storage にアップロードされるときに通知を開始するには、既存の Pub/Sub トピックにサブスクリプションを追加します。

注: 新しいコンテンツがアップロードされると、Cloud Storage からの通知メッセージはトピックキューに自動的に push されます。通知を使用することで、追加コードを記述しなくても、イベントに応答する高性能のアプリケーションを作成できます。
  • 通知メッセージがトピック new-doc にパブリッシュされるたびに PDF コンバータが稼働するよう設定した、Pub/Sub サブスクリプションを作成します。

    gcloud 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 サブスクリプションを確認する

ファイルがアップロードされるたびに、Pub/Sub サブスクリプションとサービス アカウントとのやり取りができるようになりました。これにより、サービス アカウントで PDF コンバータの Cloud Run サービスを開始できるようになりました。

タスク 7. Cloud Storage の通知をテストする

Cloud Run サービスをテストするには、使用可能なサンプル ファイルを利用します。

  1. テストファイルをアップロード バケットにコピーします。
gsutil -m cp -r gs://spls/gsp762/* gs://$GOOGLE_CLOUD_PROJECT-upload
  1. Cloud コンソールで [Cloud Storage] > [バケット] をクリックし、名前が「-upload」で終わるバケット名をクリックします。次に [更新] ボタンを数回クリックして、ファイルが PDF ファイルに変換されるにつれて 1 つずつ削除されるのを確認します。

  2. 次に、[バケット] をクリックし、名前が「-processed」で終わるバケットをクリックします。そのバケットにはすべてのファイルの PDF バージョンが含まれています。PDF ファイルを開いて、適切に変換されていることを確認してください。

  3. アップロードが完了したら、ナビゲーション メニュー > [Cloud Run] をクリックし、pdf-converter サービスをクリックします。

  4. [LOGS] タブを選択し「Converting」フィルタを追加して、変換されたファイルを表示します。

  5. ナビゲーション メニュー > [Cloud Storage] に移動して、「-upload」で終わるバケット名を開き、アップロードしたファイルがすべて処理されたことを確認します。

新しいサービスを正常にビルドし、Cloud Storage にアップロードされたファイルを使って PDF を作成できました。

お疲れさまでした

PDF コンバータ サービスによりドキュメントが変換され、PDF として「processed」バケットに書き込まれます。このラボでは、以下の操作について学習しました。

  • Go アプリケーションをコンテナに変換する。
  • Google Cloud Build でコンテナをビルドする。
  • Cloud Run サービスを作成する。
  • サービス アカウントを使用して権限を有効にする。
  • Cloud Storage のイベント処理を使用する

クエストを完了する

このセルフペース ラボは、「Google Cloud Run Serverless Workshop」クエストの一部です。クエストとは学習プログラムを構成する一連のラボのことで、完了すると成果が認められてバッジが贈られます。バッジは公開して、オンライン レジュメやソーシャル メディア アカウントにリンクできます。こちらのクエストに登録すると、すぐにクレジットを受け取ることができます。受講可能な全クエストについては、Google Cloud Skills Boost カタログをご覧ください。

詳細 / 次のステップ

Google Cloud トレーニングと認定資格

Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラスでは、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。

マニュアルの最終更新日: 2023 年 11 月 29 日

ラボの最終テスト日: 2023 年 11 月 29 日

Copyright 2024 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。