ジャンプ スタート ソリューション: Cloud Functions での AI / ML 画像処理

Last reviewed 2023-08-29 UTC

このガイドは、Cloud Functions での AI / ML 画像処理のジャンプ スタート ソリューションの理解、デプロイ、使用に役立ちます。このソリューションでは、事前トレーニング済みの ML モデルを使用して、ユーザーから提供された画像を分析し、画像アノテーションを生成します。

このソリューションをデプロイすると画像処理サービスが作成され、次の操作などに役立ちます。

  • 安全でない、または有害なユーザー作成コンテンツを処理する。
  • 物理ドキュメントからテキストをデジタル化する。
  • 画像内のオブジェクトを検出して分類する。

このドキュメントは、バックエンド サービスの開発や AI / ML の機能、基本的なクラウド コンピューティングのコンセプトについてある程度知識があるデベロッパーを対象としています。必須ではありませんが、Terraform の経験は役に立ちます。

目標

  • サーバーレス アーキテクチャを使用してスケーラブルな画像処理サービスを作成する方法を確認します。
  • 画像分析サービスで事前トレーニング済み ML モデルを使用して画像を分析する方法を理解します。
  • 画像処理サービスをデプロイし、REST API 呼び出しを介して、または画像アップロード イベントに応答して画像処理サービスを呼び出します。
  • 構成とセキュリティの設定を確認し、さまざまなニーズに合わせて画像処理サービスを調整する方法を理解します。

使用するプロダクト

このソリューションでは、次の Google Cloud プロダクトを使用します。

  • Cloud Vision API: 画像アノテーション用の強力な事前トレーニング済み ML モデルを提供する API。このソリューションは、Cloud Vision API を使用して画像を分析し、画像アノテーション データを取得します。
  • Cloud Storage: 低コストで無制限のオブジェクト ストレージをさまざまなデータ型に使用する、エンタープライズ クラスのサービス。データは Google Cloud の内部および外部からアクセス可能で、地理的に冗長に複製されます。このソリューションでは、Cloud Storage を使用して、入力画像と結果として得られる画像アノテーション データを保存します。
  • Cloud Functions: サーバーやランタイム環境を管理せずに、Google Cloud イベントに応答する単一目的のスタンドアロン関数を作成できる軽量のサーバーレス コンピューティング サービス。このソリューションでは、Cloud Functions を使用して画像処理サービスのエンドポイントをホストします。

これらのプロダクトの構成と相互作用については、次のセクションをご覧ください。

アーキテクチャ

このソリューションは、入力画像を分析し、事前トレーニング済みの ML モデルを使用して画像のアノテーションを生成するサンプル画像処理サービスで構成されています。次の図は、このソリューションで使用される Google Cloud リソースのアーキテクチャを示しています。

Cloud Functions での AI / ML 画像処理ソリューションに必要なインフラストラクチャのアーキテクチャ。

サービスは、REST API 呼び出しで直接呼び出すか、または画像のアップロードに応じて間接的に呼び出すことができます。

リクエスト フロー

画像処理サービスのリクエスト処理フローは、ユーザーがサービスを呼び出す方法によって異なります。以下の手順には、前述のアーキテクチャ図に示す番号が振られています。

ユーザーが REST API 呼び出しを介して画像処理サービスを直接呼び出すと、次のようになります。

  1. ユーザーが、Cloud Functions の関数としてデプロイされた画像処理サービスの REST API エンドポイントにリクエストを送信します。リクエストでは、画像を URI または base64 エンコード ストリームとして指定します。
  2. Cloud Functions の関数は Cloud Vision API を呼び出して、指定された画像のアノテーションを生成します。画像アノテーション データは、ユーザーへの関数のレスポンスで JSON 形式で返されます。

画像のアップロードに応じてユーザーが画像処理サービスを間接的に呼び出す場合:

  1. ユーザーは、入力用の Cloud Storage バケットに画像をアップロードします。
  2. 画像のアップロードごとに Cloud Storage イベントが生成され、それによって、アップロードされた画像を処理する Cloud Functions の関数がトリガーされます。
  3. Cloud Functions の関数は Cloud Vision API を呼び出して、指定された画像のアノテーションを生成します。
  4. Cloud Functions により、画像のアノテーション データが JSON ファイルとして出力用の Cloud Storage バケットに書き込まれます。

費用

Google Cloud 料金計算ツールを使用すると、Cloud Functions ソリューションでの AI / ML 画像処理で使用する Google Cloud リソースの費用を事前に計算して見積もることができます。

見積もりを出発点として使用して、デプロイの費用を計算します。見積もりを変更して、ソリューションで使用するリソースに対して行う予定の構成の変更を反映できます。

事前に計算された見積もりは、次のような特定の要因に関する前提条件に基づいています。

  • リソースがデプロイされている Google Cloud のロケーション。
  • リソースが使用される時間。

  • Cloud Storage に保存されているデータの量。

  • 画像処理サービスが呼び出された回数。

ソリューションをデプロイする

このセクションでは、ソリューションのデプロイ プロセスについて説明します。

Google Cloud プロジェクトを作成または選択する

ソリューションをデプロイするときに、リソースがデプロイされている Google Cloud プロジェクトを選択します。既存のプロジェクトを使用するか、新しいプロジェクトを作成するかは、次の要素を考慮して判断してください。

  • ソリューション用のプロジェクトを作成し、デプロイメントが不要になった場合は、プロジェクトを削除して、それ以上の請求を避けることができます。既存のプロジェクトを使用する場合、不要になったプロジェクトを削除する必要があります。
  • 新しいプロジェクトを使用すると、本番環境ワークロードに使用されるリソースなど、以前にプロビジョニングされたリソースとの競合を回避できます。

新しいプロジェクトにソリューションをデプロイする場合は、デプロイを開始する前にプロジェクトを作成します。

プロジェクトを作成するには、次の手順を完了します。

  1. Google Cloud コンソールでプロジェクトの選択ページに移動します。

    プロジェクト セレクタに移動

  2. Google Cloud プロジェクトの作成を開始するには、[プロジェクトを作成] をクリックします。

  3. プロジェクトに名前を付けます。生成されたプロジェクト ID をメモしておきます。

  4. 必要に応じて他のフィールドを編集します。

  5. プロジェクトを作成するには、[作成] をクリックします。

必要な IAM 権限を取得する

デプロイ プロセスを開始するには、次の表に示す Identity and Access Management(IAM)権限が必要です。ソリューションをデプロイするプロジェクトに対して roles/owner 基本ロールが付与されている場合、必要な権限がすべてすでに付与されています。roles/owner のロールがない場合は、これらの権限(またはこれらの権限を含むロール)を付与するよう管理者に依頼してください。

必要な IAM 権限 必要な権限を含む事前定義ロール

serviceusage.services.enable

Service Usage 管理者
roles/serviceusage.serviceUsageAdmin

iam.serviceAccounts.create

サービス アカウント管理者
roles/iam.serviceAccountAdmin

resourcemanager.projects.setIamPolicy

プロジェクト IAM 管理者
roles/resourcemanager.projectIamAdmin
config.deployments.create
config.deployments.list
Cloud Infrastructure Manager 管理者
roles/config.admin

ソリューション用に作成されたサービス アカウント

コンソールからデプロイ プロセスを開始すると、ユーザーに代わってソリューションをデプロイするために(また、必要に応じて後でデプロイを削除するために)サービス アカウントが作成されます。このサービス アカウントには、特定の IAM 権限が一時的に割り当てられます。つまり、ソリューションのデプロイと削除のオペレーションが完了すると、権限が自動的に取り消されます。ソリューションのデプロイを削除した後に、このガイドの後半で説明するように、サービス アカウントを削除することをおすすめします。

サービス アカウントに割り当てられたロールを確認する

Google Cloud プロジェクトまたは組織の管理者が必要とする場合に、以下のロールの情報を表示してください。

  • roles/serviceusage.serviceUsageAdmin
  • roles/iam.serviceAccountAdmin
  • roles/resourcemanager.projectIamAdmin
  • roles/cloudfunctions.admin
  • roles/run.admin
  • roles/storage.admin
  • roles/pubsublite.admin
  • roles/iam.securityAdmin
  • roles/logging.admin
  • roles/artifactregistry.reader
  • roles/cloudbuild.builds.editor
  • roles/compute.admin
  • roles/iam.serviceAccountUser

デプロイ方法を選択する

このソリューションを最小限の労力でデプロイできるように、Terraform 構成が GitHub で提供されています。Terraform 構成では、ソリューションに必要なすべての Google Cloud のリソースを定義しています。

次のいずれかの方法でソリューションをデプロイできます。

  • コンソールから: デフォルトの構成でソリューションを試して動作を確認する場合は、この方法を使用します。Cloud Build は、ソリューションに必要なすべてのリソースをデプロイします。デプロイされたソリューションが不要になった場合は、コンソールから削除できます。ソリューションのデプロイ後に作成したリソースは、個別に削除する必要があります。

    このデプロイ方法を使用する場合、コンソールからデプロイするの手順に沿って操作します。

  • Terraform CLI を使用: このソリューションをカスタマイズする場合、または Infrastructure as Code(IaC)のアプローチを使用してリソースのプロビジョニングと管理を自動化する場合は、この方法を使用します。GitHub から Terraform 構成をダウンロードし、必要に応じてコードをカスタマイズしてから、Terraform CLI を使用してソリューションをデプロイします。ソリューションをデプロイした後も、引き続き Terraform を使用してソリューションを管理できます。

    このデプロイ方法を使用するには、Terraform CLI を使用してデプロイするの手順に沿って操作します。

コンソールからデプロイする

事前構成済みのソリューションをデプロイするには、次の手順を完了します。

  1. Google Cloud ジャンプ スタート ソリューション カタログで、Cloud Functions での AI / ML の画像処理ソリューションに移動します。

    Cloud Functions での AI / ML 画像処理ソリューションに移動

  2. ソリューションの概算費用やデプロイの推定時間など、ページに表示された情報を確認します。

  3. ソリューションのデプロイを開始する準備ができたら、[デプロイ] をクリックします。

    詳細なインタラクティブ ガイドが表示されます。

  4. インタラクティブ ガイドの手順を完了します。

    デプロイメントに入力する名前をメモします。この名前は、後でデプロイメントを削除するときに必要になります。

    [デプロイ] をクリックすると、[ソリューションのデプロイ] ページが表示されます。このページの [ステータス] フィールドに「デプロイ中」が表示されます。

  5. ソリューションがデプロイされるまで待ちます。

    デプロイが失敗した場合、[ステータス] フィールドに「失敗」と表示されます。Cloud Build のログでエラーを診断できます。詳細については、コンソールからデプロイする際のエラーをご覧ください。

    デプロイが完了すると、[ステータス] フィールドが「デプロイ済み」に変わります。

  6. デプロイされた Google Cloud リソースとその構成を確認するには、インタラクティブなツアーをご覧ください。

    ツアーを開始する

自分でソリューションを試すには、ソリューションを詳しく見るをご覧ください。

このソリューションが不要になった場合は、デプロイメントを削除して、Google Cloud リソースに対する課金が継続しないようにします。詳細については、デプロイメントを削除するをご覧ください。

Terraform CLI を使用してデプロイする

このセクションでは、Terraform CLI を使用してソリューションをカスタマイズする方法や、ソリューションのプロビジョニングと管理を自動化する方法について説明します。Terraform CLI を使用してデプロイするソリューションは、Google Cloud コンソールの [ソリューションのデプロイ] ページに表示されません。

Terraform クライアントを設定する

Terraform は、Cloud Shell またはローカルホストで実行できます。このガイドでは、Terraform がプリインストールされ、Google Cloud での認証が構成されている Cloud Shell で Terraform を実行する方法について説明します。

このソリューションの Terraform コードは、GitHub リポジトリで入手できます。

  1. Cloud Shell に GitHub リポジトリのクローンを作成します。

    Cloud Shell で開く

    GitHub リポジトリを Cloud Shell にダウンロードするよう求めるメッセージが表示されます。

  2. [確認] をクリックします。

    別のブラウザタブで Cloud Shell が起動し、Cloud Shell 環境の $HOME/cloudshell_open ディレクトリに Terraform コードがダウンロードされます。

  3. Cloud Shell で、現在の作業ディレクトリが $HOME/cloudshell_open/terraform-ml-image-annotation-gcf/infra かどうかを確認します。このディレクトリには、ソリューションの Terraform 構成ファイルが含まれています。このディレクトリに移動する必要がある場合は、次のコマンドを実行します。

    cd $HOME/cloudshell_open/terraform-ml-image-annotation-gcf/infra
    
  4. 次のコマンドを実行して Terraform を初期化します。

    terraform init
    

    次のメッセージが表示されるまで待ちます。

    Terraform has been successfully initialized!
    

Terraform 変数を構成する

ダウンロードした Terraform コードには、要件に基づいてデプロイメントをカスタマイズするために使用できる変数が含まれています。たとえば、Google Cloud プロジェクトと、ソリューションをデプロイするリージョンを指定できます。

  1. 現在の作業ディレクトリが $HOME/cloudshell_open/terraform-ml-image-annotation-gcf/infra であることを確認します。そうでない場合は、そのディレクトリに移動します。

  2. 同じディレクトリに、terraform.tfvars という名前のテキスト ファイルを作成します。

  3. terraform.tfvars ファイルで次のコード スニペットをコピーし、必要な変数の値を設定します。

    • コード スニペットでコメントとして記載されている手順を実施します。
    • このコード スニペットには、値を設定する必要のある変数のみが含まれています。Terraform 構成には、デフォルト値を持つ他の変数が含まれています。すべての変数とデフォルト値を確認するには、$HOME/cloudshell_open/terraform-ml-image-annotation-gcf/infra ディレクトリにある variables.tf ファイルをご覧ください。
    • terraform.tfvars ファイルで設定した各値が、variables.tf ファイルで宣言されている変数のと一致していることを確認します。たとえば、variables.tf ファイル内の変数に定義されている型が bool の場合、その変数の値として true または falseterraform.tfvars 内で指定する必要があります。
    # This is an example of the terraform.tfvars file.
    # The values in this file must match the variable types declared in variables.tf.
    # The values in this file override any defaults in variables.tf.
    
    # ID of the project in which you want to deploy the solution
    project_id = "PROJECT_ID"
    

Terraform 構成を検証して確認する

  1. 現在の作業ディレクトリが $HOME/cloudshell_open/terraform-ml-image-annotation-gcf/infra であることを確認します。そうでない場合は、そのディレクトリに移動します。

  2. Terraform 構成にエラーがないことを確認します。

    terraform validate
    

    コマンドからエラーが返された場合は、構成で必要な修正を行ってから、terraform validate コマンドを再度実行します。コマンドで次のメッセージが返されるまで、この手順を繰り返します。

    Success! The configuration is valid.
    
  3. 構成で定義されているリソースを確認します。

    terraform plan
    
  4. 前述のように変数定義(terraform.tfvars)ファイルを作成しなかった場合、Terraform でデフォルト値のない変数の値の入力を求められます。必要な値を入力します。

    terraform plan コマンドの出力に、構成の適用時に Terraform がプロビジョニングするリソースのリストが表示されます。

    変更を行う場合は、構成を編集してから、terraform validate コマンドと terraform plan コマンドを再度実行します。

リソースをプロビジョニングする

構成にこれ以上の変更が必要ない場合は、リソースをデプロイします。

  1. 現在の作業ディレクトリが $HOME/cloudshell_open/terraform-ml-image-annotation-gcf/infra であることを確認します。そうでない場合は、そのディレクトリに移動します。

  2. Terraform 構成を適用します。

    terraform apply
    
  3. 前述のように変数定義(terraform.tfvars)ファイルを作成しなかった場合、Terraform でデフォルト値のない変数の値の入力を求められます。必要な値を入力します。

    作成されるリソースのリストが表示されます。

  4. アクションの実行を求められたら、「yes」と入力します。

    Terraform でデプロイの進行状況を示すメッセージが表示されます。

    デプロイを完了できない場合、失敗の原因となったエラーが表示されます。エラー メッセージを確認し、構成を更新してエラーを修正します。次に、terraform apply コマンドを再実行します。Terraform のエラーのトラブルシューティングについては、Terraform CLI を使用してソリューションをデプロイする際のエラーをご覧ください。

    すべてのリソースが作成されると、Terraform から次のメッセージが表示されます。

    Apply complete!
    

    Terraform の出力には、画像処理サービスのエントリ ポイントの URL、画像をアップロードする入力 Cloud Storage バケットの名前、画像アノテーション データを含む出力 Cloud Storage バケットの名前も含まれます。次の出力例をご覧ください。

    vision_annotations_gcs = "gs://vision-annotations-1234567890"
    vision_input_gcs = "gs://vision-input-1234567890"
    vision_prediction_url = [
      "https://annotate-http-abcde1wxyz-wn.a.run.app",
      "ingressIndex:0",
      "ingressValue:ALLOW_ALL",
      "isAuthenticated:false",
    ]
    
  5. デプロイされた Google Cloud リソースとその構成を確認するには、インタラクティブなツアーをご覧ください。

    ツアーを開始する

次は、ソリューションを詳しく見てその仕組みを確認します。

このソリューションが不要になった場合は、デプロイメントを削除して、Google Cloud リソースに対する課金が継続しないようにします。詳細については、デプロイメントを削除するをご覧ください。

ソリューションを詳しく見る

このセクションでは、ソリューションを使用して動作を確認できます。画像処理サービスは、REST API 呼び出しで直接呼び出すか、または入力 Cloud Storage バケットへの画像のアップロードに応じて間接的に呼び出すことができます。

REST API を使用してサービスを呼び出す

リクエスト / レスポンス フローで画像を同期的に処理する場合は、画像処理サービスの REST API を使用します。

このソリューションによってデプロイされる annotate-http 関数は、画像処理サービスの REST API のエントリ ポイントです。この関数の URL はコンソールで確認するか、Terraform CLI を使用してデプロイした場合は出力変数 vision_prediction_url で確認できます。このエントリ ポイントの URL は、/annotate というエンドポイントを公開し、画像処理をリクエストします。/annotate エンドポイントは、次のパラメータを使用して GET リクエストと POST リクエストをサポートします。

パラメータ 説明
image POST リクエストのみ)バイナリ形式でアップロードされるか、base64 エンコードの画像データとして指定された画像コンテンツ。
image_uri 画像を指す URI。
features (省略可)リクエストする Vision API のアノテーション機能のカンマ区切りのリスト。

取り得る機能の値は次のとおりです。
  • CROP_HINTS
  • DOCUMENT_TEXT_DETECTION
  • FACE_DETECTION
  • IMAGE_PROPERTIES
  • LABEL_DETECTION
  • LANDMARK_DETECTION
  • LOGO_DETECTION
  • OBJECT_LOCALIZATION
  • PRODUCT_SEARCH
  • SAFE_SEARCH_DETECTION
  • TEXT_DETECTION
  • WEB_DETECTION

分析する画像を指定するには、image パラメータまたは image_uri パラメータのいずれかのみを含めます。両方を指定すると、image_uri が使用されます。

たとえば、インターネット URI を持つ画像に対してオブジェクト検出を実行するには、curl を使用した次のような GET リクエストを送信します。

curl "YOUR_ENTRYPOINT_URL/annotate?features=OBJECT_LOCALIZATION&image_uri=YOUR_IMAGE_URI"

または、ローカル画像ファイルを使用して画像コンテンツを直接指定するには、次のような POST リクエストを使用します。

curl -X POST -F image=@YOUR_IMAGE_FILENAME -F features=OBJECT_LOCALIZATION "YOUR_ENTRYPOINT_URL/annotate"

レスポンスには、Vision API からの画像アノテーションが JSON 形式で含まれます。

Cloud Storage に画像をアップロードしてサービスを呼び出す

画像を非同期または一括アップロードで処理するシナリオでは、画像処理サービスの Cloud Storage トリガーを使用します。これにより、画像のアップロードに応じてサービスが自動的に呼び出されます。

Cloud Storage トリガーを使用して画像を分析する手順は次のとおりです。

  1. コンソールで Cloud Storage の [バケット] ページに移動します。

    [Cloud Storage] に移動

  2. 入力バケットの名前(vision-input-ID)をクリックして、[バケットの詳細] ページに移動します。

  3. [オブジェクト] タブで、[ファイルをアップロード] をクリックします。

  4. 分析する画像ファイルを選択します。

  5. アップロードが完了したら、Cloud Storage の [バケット] ページに戻ります。

    [Cloud Storage] に移動

  6. アノテーション出力バケットの名前(vision-annotations-ID)をクリックして、[バケットの詳細] ページに移動します。

  7. [オブジェクト] タブには、アップロードした画像ごとに 別々の JSON ファイルが表示されます。JSON ファイルには、各画像のアノテーション データが含まれています。

ソリューションをカスタマイズする

このセクションでは、Terraform のデベロッパーが独自の技術要件とビジネス要件を満たすために、Cloud Functions ソリューションで AI / ML 画像処理を変更する方法について説明します。このセクションのガイダンスは、Terraform CLI を使用してソリューションをデプロイする場合にのみ該当します。

このソリューションの Terraform 構成には、画像処理サービスのカスタマイズに使用できる次の変数が用意されています。

変数 説明 デフォルト値
region Cloud Functions とその他のソリューション リソースをデプロイする Google Cloud リージョン。詳細については、 Cloud Functions のロケーションをご覧ください。 us-west4
gcf_max_instance_count サービスの Cloud Functions インスタンスの最大数。これは、サービスのスケーリング動作を制御するのに役立ちます。詳細については、 最大インスタンスの使用をご覧ください。 10
gcf_timeout_seconds サービスに対するリクエストのタイムアウト(秒単位)。これにより、サービスが応答するまでの時間を制御します。詳細については、関数のタイムアウトをご覧ください。 120
gcf_http_ingress_type_index Google Cloud プロジェクトの外部のリソースからサービスを呼び出せるかどうかを制御します。詳細については、上り(内向き)設定をご覧ください。

値は次のとおりです。
  • 0(すべて許可)
  • 1(内部専用)
  • 2(内部と Cloud Load Balancing を許可)
0(すべて許可)
gcf_require_http_authentication サービスへのリクエストに認証が必要かどうかを制御します。詳細については、呼び出しの認証をご覧ください。 false
gcf_annotation_features デフォルトで含まれる、サービスの Vision API アノテーション機能のカンマ区切りのリスト。これは、個々のリクエストでオーバーライドできます。

取り得る機能の値は次のとおりです。
  • CROP_HINTS
  • DOCUMENT_TEXT_DETECTION
  • FACE_DETECTION
  • IMAGE_PROPERTIES
  • LABEL_DETECTION
  • LANDMARK_DETECTION
  • LOGO_DETECTION
  • OBJECT_LOCALIZATION
  • PRODUCT_SEARCH
  • SAFE_SEARCH_DETECTION
  • TEXT_DETECTION
  • WEB_DETECTION
FACE_DETECTION,PRODUCT_SEARCH,SAFE_SEARCH_DETECTION

ソリューションをカスタマイズするには、Cloud Shell で次の手順を完了します。

  1. 現在の作業ディレクトリが $HOME/cloudshell_open/terraform-ml-image-annotation-gcf/infra であることを確認します。そうでない場合は、そのディレクトリに移動します。

  2. terraform.tfvars ファイルを開き、前の表にある変数に適切な値を指定して、必要な変更を加えます。

  3. Terraform 構成を検証して確認します

  4. リソースをプロビジョニングします

設計に関する推奨事項

指定された Terraform 変数の値あるいは Terraform の構成自体を変更することでソリューションを変更する場合には、このセクションのリソースを参照して、セキュリティ、信頼性、費用、パフォーマンスについての要件を満たすアーキテクチャの開発に役立ててください。

次の点にご注意ください。

  • 設計を変更する前に、費用への影響を評価し、他の機能との潜在的なトレードオフを検討します。Google Cloud 料金計算ツールを使用すると、設計変更の費用への影響を評価できます。
  • ソリューションの設計変更を実装するには、Terraform のコーディングに関する専門知識と、ソリューションで使用される Google Cloud サービスに関する高度な知識が必要です。
  • Google 提供の Terraform 構成を変更してエラーが発生した場合は、GitHub で問題を作成します。GitHub の問題はベスト エフォート ベースで審査されます。これは、一般的な使用に関する質問を目的としたものではありません。
  • Google Cloud で本番環境レベルの環境を設計して設定する方法については、Google Cloud のランディング ゾーンの設計Google Cloud 設定のチェックリストをご覧ください。

セキュリティ

デフォルトでは、画像処理サービスはインターネットからのリクエストを許可し、リクエストの認証を必要としません。本番環境では、サービスへのアクセスを制限することがあります。

gcf_http_ingress_type_index Terraform 変数を変更することで、許可するサービスへのリクエスト送信元を制御できます。ソリューションのサービス エンドポイントをインターネット上で意図せず一般公開しないように注意してください。詳細については、Cloud Functions のドキュメントのネットワーク設定の構成をご覧ください。

gcf_require_http_authentication Terraform 変数を変更することで、画像処理サービスの REST API へのリクエストで認証を要求できます。これにより、サービスへの個別のアクセスを制御できます。認証が必要な場合は、サービスの呼び出し元がリクエストを行うための認証情報を提供する必要があります。詳細については、Cloud Functions のドキュメントの呼び出しの認証をご覧ください。

セキュリティに関する推奨事項については、セキュリティ、プライバシー、コンプライアンスに関する Google Cloud アーキテクチャ フレームワークのガイドラインをご覧ください。

信頼性

ユーザーが入力 Cloud Storage バケットに画像をアップロードすると、アノテーション出力でさまざまなレベルのレイテンシが発生する可能性があります。デフォルトでは、ユーザーは出力バケットをポーリングして、アノテーションが使用可能かどうかを判断する必要があります。画像処理の完了後すぐにアプリケーションが確実にアクションを実行できるようにするには、出力バケットで Cloud Storage イベントにサブスクライブします。たとえば、別の Cloud Functions の関数をデプロイしてアノテーション データを処理できます。詳細については、Cloud Functions のドキュメントの Cloud Storage トリガーをご覧ください。

その他の推奨事項については、このソリューションで使用されるプロダクトの信頼性を最適化するため、次のガイドをご覧ください。

パフォーマンス

画像処理サービスのスループットは、Cloud Functions のスケーリング機能の影響を直接受けます。Cloud Functions は、構成可能なインスタンスの上限まで、受信トラフィックの負荷を処理する関数インスタンスを作成することで、自動的にスケーリングします。最大インスタンス数の上限を変更するか、上限を完全に削除することで、関数のスケーリングと画像処理サービスのスループットを制御できます。上限を変更するには、gcf_max_instance_count Terraform 変数を使用します。詳細については、Cloud Functions のドキュメントで最大インスタンス数の使用自動スケーリングの動作をご覧ください。

また、次のベスト プラクティスを実践すると、パフォーマンスの最適化に役立ちます。

費用

ソリューションの費用を最適化するには、次のガイドの推奨事項を使用してください。

デプロイを削除する

ソリューションのデプロイメントが不要になった場合は、作成したリソースに対して課金されないようにするため、デプロイメントを削除します。

コンソールを使用して削除する

この手順は、ソリューションをコンソールからデプロイした場合に実施します。

  1. Google Cloud コンソールで、[ソリューションのデプロイ] ページに移動します。

    [ソリューションのデプロイ] に移動

  2. 削除するデプロイメントが含まれているプロジェクトを選択します。

  3. 削除するデプロイメントを見つけます。

  4. [アクション] をクリックして、[削除] を選択します。

  5. デプロイメントの名前を入力し、[確認] をクリックします。

    [ステータス] フィールドに「削除中」が表示されます。

    削除に失敗した場合は、デプロイメントの削除時のエラーのトラブルシューティング ガイダンスをご覧ください。

ソリューションに使用した Google Cloud プロジェクトが不要になった場合は、プロジェクトを削除できます。詳細については、省略可: プロジェクトを削除するをご覧ください。

Terraform CLI を使用して削除する

Terraform CLI を使用してソリューションをデプロイした場合は、次の手順に沿って操作します。

  1. Cloud Shell で、現在の作業ディレクトリが $HOME/cloudshell_open/terraform-ml-image-annotation-gcf/infra であることを確認します。そうでない場合は、そのディレクトリに移動します。

  2. Terraform によってプロビジョニングされたリソースを削除します。

    terraform destroy
    

    破棄されるリソースのリストが表示されます。

  3. アクションの実行を求められたら、「yes」と入力します。

    進行状況を示すメッセージが表示されます。すべてのリソースが削除されると、次のメッセージが表示されます。

    Destroy complete!
    

    削除に失敗した場合は、デプロイメントの削除時のエラーのトラブルシューティング ガイダンスをご覧ください。

ソリューションに使用した Google Cloud プロジェクトが不要になった場合は、プロジェクトを削除できます。詳細については、省略可: プロジェクトを削除するをご覧ください。

省略可: プロジェクトを削除する

ソリューションを新しい Google Cloud プロジェクトにデプロイした後、そのプロジェクトが不要になった場合は、次の手順で削除します。

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. プロンプトでプロジェクト ID を入力し、[シャットダウン] をクリックします。

プロジェクトを保持する場合は、次のセクションで説明するように、このソリューション用に作成されたサービス アカウントを削除します。

省略可: サービス アカウントを削除する

ソリューションに使用したプロジェクトを削除した場合は、このセクションをスキップしてください。

このガイドの前半で説明したように、ソリューションをデプロイしたときに、ユーザーに代わってサービス アカウントが作成されました。このサービス アカウントには特定の IAM 権限が一時的に割り当てられました。ソリューションのデプロイと削除オペレーションが完了した後、権限は自動的に取り消されましたが、サービス アカウントは削除されません。このサービス アカウントを削除することをおすすめします。

  • Google Cloud コンソールからソリューションをデプロイした場合は、[ソリューションのデプロイ] ページに移動します(すでにページが表示されている場合は、ブラウザを更新します)。サービス アカウントが削除されるように、バックグラウンドでプロセスがトリガーされます。特に操作を行う必要はありません。

  • Terraform CLI を使用してソリューションをデプロイした場合は、次の手順を完了します。

    1. Google Cloud コンソールで、[サービス アカウント] ページに移動します。

      [サービス アカウント] に移動

    2. ソリューションに使用したプロジェクトを選択します。

    3. 削除するサービス アカウントを選択します。

      ソリューション用に作成されたサービス アカウントのメール ID は、次の形式になります。

      goog-sc-DEPLOYMENT_NAME-NNN@PROJECT_ID.iam.gserviceaccount.com
      

      メール ID には次の値が含まれます。

      • DEPLOYMENT_NAME: デプロイメントの名前。
      • NNN: 3 桁のランダムな数字。
      • PROJECT_ID: ソリューションをデプロイしたプロジェクトの ID。
    4. [削除] をクリックします。

エラーのトラブルシューティングを行う

エラーを診断して解決するために実行できるアクションは、デプロイ方法とエラーの複雑さによって異なります。

コンソールからデプロイする際のエラー

コンソールを使用してデプロイが失敗した場合は、次の操作を行います。

  1. [ソリューションのデプロイ] ページに移動します。

    デプロイが失敗した場合、[ステータス] フィールドに「失敗」と表示されます。

  2. エラーの原因となったエラーの詳細を表示するには:

    1. [アクション] をクリックします。

    2. [Cloud Build のログを表示する] を選択します。

  3. Cloud Build のログを確認し、適切な措置を講じて失敗の原因となった問題を解決します。

Terraform CLI を使用してデプロイする際のエラー

Terraform を使用したデプロイが失敗した場合、terraform apply コマンドの出力には、問題を診断するために確認できるエラー メッセージが含まれます。

次のセクションの例では、Terraform の使用時に発生する可能性のあるデプロイエラーを示します。

API が有効になっていません

プロジェクトを作成し、すぐに新しいプロジェクトでソリューションをデプロイすると、デプロイが失敗し、次のようなエラーが発生することがあります。

Error: Error creating Network: googleapi: Error 403: Compute Engine API has not
been used in project PROJECT_ID before or it is disabled. Enable it by visiting
https://console.developers.google.com/apis/api/compute.googleapis.com/overview?project=PROJECT_ID
then retry. If you enabled this API recently, wait a few minutes for the action
to propagate to our systems and retry.

このエラーが発生した場合は、数分待ってから terraform apply コマンドを再度実行します。

「API が有効になっていない」エラーが解決しない場合は、エラー メッセージ内のリンクをクリックして API を有効にします。API が有効になるまでしばらく待ってから、terraform apply コマンドを再度実行します。

リクエストされたアドレスを割り当てることができません

terraform apply コマンドを実行すると、cannot assign requested address エラーが発生し、次のようなメッセージが表示されることがあります。

Error: Error creating service account:
 Post "https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts:
 dial tcp [2001:db8:ffff:ffff::5f]:443:
 connect: cannot assign requested address

このエラーが発生した場合は、terraform apply コマンドを再度実行してください。

デプロイメント削除時のエラー

デプロイメントを削除しようとして失敗することもあります。

  • コンソールでソリューションをデプロイした後に、ソリューションによってプロビジョニングされたリソースを変更してからデプロイメントを削除しようとすると、削除が失敗することがあります。[ソリューションのデプロイ] ページの [ステータス] フィールドに「失敗」と表示され、Cloud Build のログにエラーの原因が表示されます。
  • Terraform CLI を使用してソリューションをデプロイした後に、Terraform 以外のインターフェース(コンソールなど)を使用してリソースを変更し、デプロイメントを削除しようとすると、削除が失敗することがあります。terraform destroy コマンドの出力にあるメッセージにエラーの原因が示されます。

エラーログとエラーの内容を確認し、エラーの原因となったリソースを特定して削除してから、もう一度デプロイメントを削除してみてください。

コンソールベースのデプロイメントが削除されず、Cloud Build ログを使用してエラーを診断できない場合は、Terraform CLI を使用してデプロイメントを削除できます。次のセクションをご覧ください。

Terraform CLI を使用してコンソールベースのデプロイメントを削除する

このセクションでは、コンソールからコンソールベースのデプロイメントを削除しようとしたときにエラーが発生した場合に、コンソールベースのデプロイメントを削除する方法について説明します。このアプローチでは、削除するデプロイメントの Terraform 構成をダウンロードし、Terraform CLI を使用してデプロイメントを削除します。

  1. デプロイメントの Terraform コード、ログ、その他のデータが保存されているリージョンを特定します。このリージョンは、ソリューションのデプロイ時に選択したリージョンとは異なる場合があります。

    1. Google Cloud コンソールで、[ソリューションのデプロイ] ページに移動します。

      [ソリューションのデプロイ] に移動

    2. 削除するデプロイメントが含まれているプロジェクトを選択します。

    3. デプロイメントのリストで、削除するデプロイメントの行を特定します。

    4. 行の内容をすべて表示する」をクリックします。

    5. [場所] 列で、次の例でハイライトされているように、2 番目の場所をメモします。

      デプロイメント コード、ログ、その他のアーティファクトの場所。

  2. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  3. プロジェクト ID、リージョン、削除するデプロイメントの名前の環境変数を作成します。

    export REGION="REGION"
    export PROJECT_ID="PROJECT_ID"
    export DEPLOYMENT_NAME="DEPLOYMENT_NAME"
    

    これらのコマンドで、次のように置き換えます。

    • REGION: この手順でメモした場所。
    • PROJECT_ID: ソリューションをデプロイしたプロジェクトの ID。
    • DEPLOYMENT_NAME: 削除するデプロイメントの名前。
  4. 削除するデプロイメントの最新リビジョンの ID を取得します。

    export REVISION_ID=$(curl \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "Content-Type: application/json" \
        "https://config.googleapis.com/v1alpha2/projects/${PROJECT_ID}/locations/${REGION}/deployments/${DEPLOYMENT_NAME}" \
        | jq .latestRevision -r)
        echo $REVISION_ID
    

    出力は次のようになります。

    projects/PROJECT_ID/locations/REGION/deployments/DEPLOYMENT_NAME/revisions/r-0
    
  5. デプロイメントの Terraform 構成の Cloud Storage のロケーションを取得します。

    export CONTENT_PATH=$(curl \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "Content-Type: application/json" \
        "https://config.googleapis.com/v1alpha2/${REVISION_ID}" \
        | jq .applyResults.content -r)
        echo $CONTENT_PATH
    

    このコマンドの出力例を次に示します。

    gs://PROJECT_ID-REGION-blueprint-config/DEPLOYMENT_NAME/r-0/apply_results/content
    
  6. Cloud Storage から Cloud Shell に Terraform 構成をダウンロードします。

    gsutil cp -r $CONTENT_PATH $HOME
    cd $HOME/content/infra
    

    次の例に示すように、Operation completed メッセージが表示されるまで待ちます。

    Operation completed over 45 objects/268.5 KiB
    
  7. Terraform を初期化します。

    terraform init
    

    次のメッセージが表示されるまで待ちます。

    Terraform has been successfully initialized!
    
  8. デプロイされたリソースを削除します。

    terraform destroy
    

    破棄されるリソースのリストが表示されます。

    宣言されていない変数に関する警告が表示された場合は、警告を無視してください。

  9. アクションの実行を求められたら、「yes」と入力します。

    進行状況を示すメッセージが表示されます。すべてのリソースが削除されると、次のメッセージが表示されます。

    Destroy complete!
    
  10. デプロイメント アーティファクトを削除します。

    curl -X DELETE \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "Content-Type: application/json" \
        "https://config.googleapis.com/v1alpha2/projects/${PROJECT_ID}/locations/${REGION}/deployments/${DEPLOYMENT_NAME}?force=true&delete_policy=abandon"
    
  11. 数秒待ってから、デプロイメント アーティファクトが削除されたことを確認します。

    curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "Content-Type: application/json" \
        "https://config.googleapis.com/v1alpha2/projects/${PROJECT_ID}/locations/${REGION}/deployments/${DEPLOYMENT_NAME}" \
        | jq .error.message
    

    出力に null と表示されている場合は、数秒待ってから、もう一度コマンドを実行します。

    デプロイメント アーティファクトが削除されると、次のようなメッセージが表示されます。

    Resource 'projects/PROJECT_ID/locations/REGION/deployments/DEPLOYMENT_NAME' was not found
    

フィードバックを送信する

ジャンプ スタート ソリューションは情報提供のみを目的としており、正式にサポートされているプロダクトではありません。Google は、予告なくソリューションを変更または削除する場合があります。

エラーのトラブルシューティングを行うには、Cloud Build のログと Terraform の出力を確認します。

フィードバックを送信する場合は、次の操作を行います。

  • ドキュメント、コンソール内チュートリアル、またはソリューションについては、このページの [フィードバックを送信] ボタンを使用してください。
  • Terraform コードを変更していない場合は、GitHub リポジトリで問題を作成します。GitHub の問題はベスト エフォート ベースで調査します。これは、一般的な使用に関する質問を目的としたものではありません。
  • ソリューションで使用されているプロダクトに関する問題については、Cloud カスタマーケアにお問い合わせください。

次のステップ