このチュートリアルでは、グラフの説明の入力パラメータを PNG
形式の図に変換する Cloud Run カスタム サービスをビルドします。ここでは、Graphviz をシステム パッケージとしてサービスのコンテナ環境にインストールします。リクエストを処理するときに、コマンドライン ユーティリティから Graphviz を使用します。
目標
- カスタム コンテナを作成し、Dockerfile と一緒にビルドする。
- Cloud Run サービスを作成、ビルド、デプロイする。
- Graphviz dot ユーティリティを使用して図を生成する。
- コレクションの DOT 構文図または独自の構文図を投稿してサービスをテストする。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- Cloud Run Admin API を有効にします。
- gcloud CLI をインストールして初期化します。
- コンポーネントを更新します。
gcloud components update
必要なロール
チュートリアルを完了するために必要な権限を取得するには、プロジェクトに対して次の IAM ロールを付与するよう管理者に依頼してください。
-
Cloud Build 編集者(
roles/cloudbuild.builds.editor
) -
Cloud Run 管理者(
roles/run.admin
) -
サービス アカウントの作成(
roles/iam.serviceAccountCreator
) -
サービス アカウント ユーザー(
roles/iam.serviceAccountUser
) -
Service Usage ユーザー(
roles/serviceusage.serviceUsageConsumer
) -
ストレージ管理者(
roles/storage.admin
)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。
gcloud のデフォルトを設定する
Cloud Run サービスを gcloud のデフォルトに構成するには:
デフォルト プロジェクトを設定します。
gcloud config set project PROJECT_ID
PROJECT_ID は、このチュートリアルで作成したプロジェクトの名前に置き換えます。
選択したリージョン向けに gcloud を構成します。
gcloud config set run/region REGION
REGION は、任意のサポートされている Cloud Run のリージョンに置き換えます。
Cloud Run のロケーション
Cloud Run はリージョナルです。つまり、Cloud Run サービスを実行するインフラストラクチャは特定のリージョンに配置され、そのリージョン内のすべてのゾーンで冗長的に利用できるように Google によって管理されます。
レイテンシ、可用性、耐久性の要件を満たしていることが、Cloud Run サービスを実行するリージョンを選択する際の主な判断材料になります。一般的には、ユーザーに最も近いリージョンを選択できますが、Cloud Run サービスで使用されている他の Google Cloud サービスのロケーションも考慮する必要があります。使用する Google Cloud サービスが複数のロケーションにまたがっていると、サービスの料金だけでなくレイテンシにも影響します。
Cloud Run は、次のリージョンで利用できます。
ティア 1 料金を適用
asia-east1
(台湾)asia-northeast1
(東京)asia-northeast2
(大阪)asia-south1
(ムンバイ、インド)europe-north1
(フィンランド) 低 CO2europe-southwest1
(マドリッド) 低 CO2europe-west1
(ベルギー) 低 CO2europe-west4
(オランダ) 低 CO2europe-west8
(ミラノ)europe-west9
(パリ) 低 CO2me-west1
(テルアビブ)us-central1
(アイオワ) 低 CO2us-east1
(サウスカロライナ)us-east4
(北バージニア)us-east5
(コロンバス)us-south1
(ダラス) 低 CO2us-west1
(オレゴン) 低 CO2
ティア 2 料金を適用
africa-south1
(ヨハネスブルグ)asia-east2
(香港)asia-northeast3
(ソウル、韓国)asia-southeast1
(シンガポール)asia-southeast2
(ジャカルタ)asia-south2
(デリー、インド)australia-southeast1
(シドニー)australia-southeast2
(メルボルン)europe-central2
(ワルシャワ、ポーランド)europe-west10
(ベルリン) 低 CO2europe-west12
(トリノ)europe-west2
(ロンドン、イギリス) 低 CO2europe-west3
(フランクフルト、ドイツ) 低 CO2europe-west6
(チューリッヒ、スイス) 低 CO2me-central1
(ドーハ)me-central2
(ダンマーム)northamerica-northeast1
(モントリオール) 低 CO2northamerica-northeast2
(トロント) 低 CO2southamerica-east1
(サンパウロ、ブラジル) 低 CO2southamerica-west1
(サンティアゴ、チリ) 低 CO2us-west2
(ロサンゼルス)us-west3
(ソルトレイクシティ)us-west4
(ラスベガス)
Cloud Run サービスをすでに作成している場合は、Google Cloud コンソールの Cloud Run ダッシュボードにリージョンが表示されます。
サンプルコードを取得する
使用するコードサンプルを取得するには:
ローカルマシンにサンプルアプリのリポジトリのクローンを作成します。
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。
Cloud Run のサンプルコードが含まれているディレクトリに移動します。
Node.js
cd nodejs-docs-samples/run/system-package/
Python
cd python-docs-samples/run/system-package/
Go
cd golang-samples/run/system_package/
Java
cd java-docs-samples/run/system-package/
アーキテクチャを可視化する
基本的なアーキテクチャは次のようになります。
ユーザーが HTTP リクエストを Cloud Run サービスに送信し、このサービスが Graphviz ユーティリティを実行して、リクエストを画像に変換します。この画像が HTTP レスポンスとしてユーザーに配信されます。
コードについて
Dockerfile
で環境構成を定義する
Dockerfile
は、サービスで使用する言語と基礎となるオペレーティング環境(Ubuntu など)によって異なります。
Build and Deploy Quickstart では、他のサービスの Dockerfile
を作成する際の出発点として利用できるよう、さまざまな Dockerfiles
を紹介しています。
このサービスでは、デフォルト以外のシステム パッケージを追加する必要があります。
エディタで
Dockerfile
を開きます。Dockerfile
RUN
ステートメントを探します。このステートメントにより、任意のシェルコマンドを実行して環境を変更できます。Dockerfile
に、複数のFROM
ステートメントの探索で識別された複数のステージがある場合、そのステートメントは最終ステージにあります。必要なパッケージとそのインストール方法は、コンテナで宣言されているオペレーティング システムによって異なります。
ご使用のオペレーティング システムまたはベースイメージの説明については、適切なタブをクリックして確認してください。
Debian / Ubuntu Alpine Alpine は、フォント サポート用に 2 番目のパッケージを必要とします。コンテナ イメージのオペレーティング システムを確認するには、
FROM
ステートメントで名前を確認するか、ベースイメージの README を確認します。たとえば、node
から拡張する場合、Docker Hub でドキュメントと親Dockerfile
を見つけることができます。ローカルでの
docker build
または Cloud Build を使用してイメージをビルドし、カスタマイズをテストします。
受信リクエストを処理する
サンプル サービスは、受信 HTTP リクエストのパラメータを使用して、適切な dot
ユーティリティ コマンドを実行するシステムコールを呼び出します。
以下の HTTP ハンドラでは、グラフの説明の入力パラメータが dot
クエリ文字列変数から抽出されます。
クエリ文字列で使用するために、グラフの説明に含まれている文字の URL エンコードが必要になる場合があります。
Node.js
Python
Go
Java
内部サーバーエラーと無効なユーザー入力を区別する必要があります。このサンプル サービスは、エラー メッセージにユーザー入力の問題を示す文字列 syntax
が含まれていない限り、すべての dot コマンドライン エラーに対して内部サーバーエラーを返します。
図を生成する
図を生成するコアロジックは、dot コマンドライン ツールを使用して、グラフの説明の入力パラメータを PNG 形式の図に変換します。
Node.js
Python
Go
Java
安全なサービスを設計する
dot
ツールには、ウェブサービスの脆弱性が存在する可能性があります。このリスクを軽減するには、コンテナ イメージを定期的に再ビルドし、graphviz
パッケージの最新バージョンが使用されるようにします。
ユーザーの入力をコマンドライン パラメータとして受け入れるように現在のサンプルを拡張する場合は、コマンド インジェクション攻撃の対策を講じる必要があります。たとえば、次のような方法でインジェクション攻撃を防ぎます。
- サポートされているパラメータの辞書と入力をマッピングする
- 入力値を検証し、既知の安全な範囲内にあることを確認する(正規表現などを使用)
- シェル構文が評価されないように入力をエスケープする
よく使用される権限が付与されているデフォルトのアカウントではなく、Google Cloud サービスを使用する権限が付与されていないサービス アカウントでサービスをデプロイすることで、潜在的な脆弱性をさらに軽減できます。そのため、このチュートリアルの手順では、新しいサービス アカウントを作成して使用します。
コードの配布
コードを配布するには、Cloud Build でビルドし、Artifact Registry にアップロードして Cloud Run にデプロイします。
Artifact Registry を作成します。
gcloud artifacts repositories create REPOSITORY \ --repository-format docker \ --location REGION
次のように置き換えます。
- REPOSITORY は、リポジトリの一意の名前に置き換えます。プロジェクト内のリポジトリのロケーションごとに、リポジトリ名は一意でなければなりません。
- REGION は、Artifact Registry リポジトリに使用する Google Cloud リージョンに置き換えます。
次のコマンドを実行してコンテナをビルドし、Artifact Registry に公開します。
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
PROJECT_ID は Google Cloud プロジェクト ID、
graphviz
はサービスに付ける名前です。ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
PROJECT_ID は Google Cloud プロジェクト ID、
graphviz
はサービスに付ける名前です。ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
Go
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
PROJECT_ID は Google Cloud プロジェクト ID、
graphviz
はサービスに付ける名前です。ビルドが成功すると、ID、作成時間、画像の名前を含む SUCCESS メッセージが表示されます。イメージが Artifact Registry に保存されます。このイメージは必要に応じて再利用できます。
Java
このサンプルでは、Jib を使用して一般的な Java ツールにより Docker イメージをビルドします。Jib は、Dockerfile や Docker をインストールせずにコンテナのビルドを最適化します。Jib を使用して Java コンテナを構築する方法の詳細を確認します。Dockerfile を使用して、インストールしたシステム パッケージでベースイメージの構成とビルドを行い、Jib のデフォルト ベースイメージを上書きします。
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz-base
ここで PROJECT_ID は、Google Cloud プロジェクト ID です。
Docker を承認して Artifact Registry に push するには、gcloud 認証ヘルパーを使用します。
gcloud auth configure-docker
Jib で最終的なコンテナを作成し、Artifact Registry で公開します。
mvn compile jib:build \ -Dimage=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz \ -Djib.from.image=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz-base
ここで PROJECT_ID は、Google Cloud プロジェクト ID です。
以下を使用してデプロイします。
gcloud
- 新しいサービス アカウントを作成します。コードとコードが使用するシステム パッケージは、このサービス アカウントに付与されている Google Cloud サービスのみを使用できます。
ここで、SA_NAME はこのサービス アカウントに付ける名前です。コードにエラーや脆弱性が存在する場合、コードは他のすべての Google Cloud プロジェクト リソースにアクセスできません。gcloud iam service-accounts create SA_NAME
- サービス アカウントを指定してコードをデプロイします。
ここで、PROJECT_ID は Google Cloud プロジェクト ID、SA_NAME は作成したサービス アカウントの名前、gcloud run deploy graphviz-web --service-account SA_NAME@PROJECT_ID.iam.gserviceaccount.com --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
graphviz
は上記のコンテナの名前、graphviz-web
はサービスの名前です。「allow unauthenticated」プロンプトに「Y
」と答えます。IAM ベースの認証の詳細については、アクセスの管理をご覧ください。 - デプロイが完了するまで待ちます。これには 30 秒ほどかかる場合があります。 成功すると、コマンドラインにサービス URL が表示されます。
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
次の Terraform コードは Cloud Run サービスを作成します。
IMAGE_URL は、コンテナ イメージへの参照(
us-docker.pkg.dev/cloudrun/container/hello:latest
など)に置き換えます。Artifact Registry を使用する場合は、リポジトリ REPO_NAME がすでに作成されている必要があります。URL の形式はLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
です。次の Terraform コードは Cloud Run サービスを公開します。
- 新しいサービス アカウントを作成します。コードとコードが使用するシステム パッケージは、このサービス アカウントに付与されている Google Cloud サービスのみを使用できます。
サービスにコードの更新をデプロイする場合は、上記のステップを繰り返します。サービスをデプロイするたびに、リビジョンが作成されます。準備ができると、トラフィックの送信が自動的に開始します。
試してみる
リクエスト ペイロードで DOT 構文の説明を含む HTTP POST
リクエストを送信し、サービスを試してみましょう。
サービスに HTTP リクエストを送信します。
ブラウザの URL バーに URL をコピーして
[SERVICE_DOMAIN]
を更新します。https://SERVICE_DOMAIN/diagram.png?dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }
生成された図はウェブページに埋め込むことができます。
<img src="https://SERVICE_DOMAIN/diagram.png?dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" />
Chrome などの
PNG
ファイルをサポートするアプリケーションで、結果のdiagram.png
ファイルを開きます。次のようになります。
既製の図の説明の小コレクションを調べることができます。
- 選択した
.dot
ファイルのコンテンツをコピーします。 サービスに HTTP リクエストを送信します。
ブラウザの URL バーに URL をコピーします。
https://SERVICE_DOMAIN/diagram.png?dot=SELECTED DOTFILE CONTENTS
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトを削除する
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
チュートリアル リソースを削除する
このチュートリアルでデプロイした Cloud Run サービスを削除します。
gcloud run services delete SERVICE-NAME
SERVICE-NAME は、選択したサービス名です。
Cloud Run サービスは Google Cloud コンソール から削除することもできます。
チュートリアルの設定時に追加した gcloud のデフォルト リージョン構成を削除します。
gcloud config unset run/region
プロジェクト構成を削除します。
gcloud config unset project
このチュートリアルで作成した他の Google Cloud リソースを削除します。
Artifact Registry から
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/graphviz
という名前のコンテナ イメージを削除します。サービス アカウント SA_NAME を削除します。
gcloud iam service-accounts delete SA_NAME@PROJECT_ID.iam.gserviceaccount.com
次のステップ
- graphviz アプリを試す。
- 他の graphviz ユーティリティのサポートを追加し、別のアルゴリズムを適用して図を生成する。
- 図を Cloud Storage に保存する。イメージまたは DOT 構文を保存します。
- Cloud Natural Language API を使用して、コンテンツの不正利用を防ぐ対策を講じる。
- Cloud Run による画像処理のチュートリアルで、システム パッケージの別の例を確認する。
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。