ジャンプ スタート ソリューション: 大規模なデータ共有を行う Java ウェブアプリ

Last reviewed 2023-06-27 UTC

このガイドは、大規模なデータ共有を行う Java ウェブアプリのジャンプ スタート ソリューションの理解、デプロイ、使用をサポートします。このソリューションは、大量のファイルを提供できるアプリケーションを構築する方法を示します。

Java ではなく Go を使用する場合は、大規模なデータ共有を行う Go 言語ウェブアプリのジャンプ スタート ソリューションをご覧ください。

このドキュメントは、ウェブ アプリケーションの構築経験があるデベロッパーを対象としています。このドキュメントは、Java と基本的なクラウドのコンセプト(Google Cloud である必要はありません)に詳しいことを前提としています。また、Terraform の使用経験も役に立ちます。

目標

  • 大規模なデータ共有を行うユーザー パターンについて理解します。
  • クラウドベースのオブジェクト ストレージ サービスにオブジェクトを保存し、提供します。
  • 分散配信ネットワークを使用して多数のオブジェクトを提供するアプリケーションをデプロイします。
  • 各レイヤでオブジェクトを保護し、最小限の権限でアクセスできるようにします。

使用するプロダクト

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

  • Cloud CDN(コンテンツ配信ネットワーク): グローバル スケールでの高速かつ信頼性の高いウェブ コンテンツと動画の配信。
  • Cloud Storage: 低コストで無制限のオブジェクト ストレージをさまざまなデータ型に使用する、エンタープライズ クラスのサービス。データは Google Cloud の内部および外部からアクセス可能で、地理的に冗長に複製されます。
  • Cloud Run: サーバーレスのコンテナ化アプリを構築してデプロイできるフルマネージド サービス。Google Cloud がスケーリングなどのインフラストラクチャ タスクを処理するので、デベロッパーはコードのビジネス ロジックに集中できます。
  • Cloud Load Balancing: Google Cloud で高パフォーマンスでスケーラブルなロード バランシングを行うサービス。
  • Firestore: フルマネージドでスケーラブルなサーバーレスのドキュメント データベース。

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

アーキテクチャ

このソリューションでは、完全に実装されたすぐに使える画像共有アプリがデプロイされます。次の図では、ソリューションがデプロイする Google Cloud リソースのアーキテクチャを示します。

Cloud CDN を使用してファイルを配信する画像共有アプリのアーキテクチャ図。

リクエスト フロー

このソリューションがデプロイする画像共有アプリのリクエスト処理フローは次のとおりです。フローのステップには、上のアーキテクチャ図に対応した番号が付けられています。

  1. ユーザーからのファイルのアップロード リクエストは、ロードバランサを使用してフロントエンドに転送されます。
  2. フロントエンドは、Cloud Run を使用するバックエンドにこれらのリクエストを転送します。
  3. バックエンドは、Cloud Storage にファイルを保存し、Firestore にファイルに関するメタデータを保存します。
  4. Cloud CDN キャッシュ ヒットが発生した場合、ファイルを表示するユーザーからのリクエストは Cloud CDN に転送されます。
  5. Cloud CDN キャッシュミスが発生した場合、ファイルを表示するユーザーからのリクエストは Cloud Storage に転送されます。

コンポーネントと構成

このアーキテクチャは、次のコンポーネントで構成されます。

  • Cloud Run で実行されるフロントエンドとバックエンドで構成される画像共有ウェブアプリ。アプリのフロントエンドは Angular を使用します。アプリのバックエンドは Java で記述されます。
  • Cloud Load Balancing を使用して作成されたロードバランサは、受信リクエストを適切なリソースに転送します。
  • 画像ファイルを格納する Cloud Storage バケット。
  • Cloud CDN は Cloud Storage バケットからの画像をキャッシュに保存し、コンテンツ配信を高速化します。
  • ファイルのメタデータを保存する Firestore データベース。

費用

大規模なデータ共有を行う Java ウェブアプリ ソリューションで使用される Google Cloud リソースの費用を見積もるには、Google Cloud 料金計算ツールで事前に計算された見積もりをご覧ください。

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

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

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

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

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

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/storage.admin
  • roles/datastore.owner
  • roles/appengine.appAdmin
  • roles/compute.admin
  • roles/compute.networkAdmin
  • roles/cloudtrace.admin
  • roles/iam.serviceAccountUser
  • roles/run.admin
  • roles/monitoring.admin
  • roles/vpcaccess.admin

デプロイ方法を選択する

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

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

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

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

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

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

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

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

  1. Google Cloud ジャンプ スタート ソリューション カタログで、大規模なデータ共有を行う Java ウェブアプリ ソリューションに移動します。

    大規模なデータ共有を行う Java ウェブアプリ ソリューションに移動

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

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

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

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

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

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

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

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

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

  6. ソリューションを表示して使用するには、コンソールの [ソリューションのデプロイ] ページに戻ります。

    1. [アクション] メニューをクリックします。
    2. [ウェブアプリを表示] を選択して、画像共有アプリを開きます。

このソリューションが不要になった場合は、デプロイメントを削除して、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-large-data-sharing-java-webapp/infra かどうかを確認します。このディレクトリには、ソリューションの Terraform 構成ファイルが含まれています。このディレクトリに移動する必要がある場合は、次のコマンドを実行します。

    cd $HOME/cloudshell_open/terraform-large-data-sharing-java-webapp/infra
    
  4. 次のコマンドを実行して Terraform を初期化します。

    terraform init
    

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

    Terraform has been successfully initialized!
    

Terraform 変数を構成する

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

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

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

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

    • コード スニペットでコメントとして記載されている手順を実施します。
    • このコード スニペットには、値を設定する必要のある変数のみが含まれています。Terraform 構成には、デフォルト値を持つ他の変数が含まれています。すべての変数とデフォルト値を確認するには、$HOME/cloudshell_open/terraform-large-data-sharing-java-webapp/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"
    

    project_id については、プロジェクトの識別をご覧ください。

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

  1. 現在の作業ディレクトリが $HOME/cloudshell_open/terraform-large-data-sharing-java-webapp/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-large-data-sharing-java-webapp/infra であることを確認します。そうでない場合は、そのディレクトリに移動します。

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

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

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

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

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

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

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

    Apply complete!
    
    Outputs:
    bucket_name = "BUCKET_NAME"
    lb_external_ip = "IP_ADDRESS"
    neos_walkthrough_url = "https://console.cloud.google.com/products/solutions/deployments?walkthrough_id=solutions-in-console--large-data-sharing--large-data-sharing-java_tour"
    
  5. サンプルアプリを表示して使用するには、ブラウザで lb_external_ip を開きます。

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

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

このセクションでは、Terraform のデベロッパーが独自の技術要件とビジネス要件を満たすために、大規模なデータ共有を行う Java ウェブアプリ ソリューションを変更する方法について説明します。このセクションのガイダンスは、Terraform CLI を使用してソリューションをデプロイする場合にのみ該当します。

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

    cd $HOME/cloudshell_open/terraform-large-data-sharing-java-webapp/infra
    
  2. 次の表の例に示すように、main.tf を開き、必要な変更を加えます。


    パラメータ

    main.tf の Terraform 引数

    アプリ バックエンドの CPU 上限

    引数: cloud_run_server.limits.cpu

    main.tf の関連コード スニペット:

    module "cloud_run_server" {
    …
      limits = {
        cpu    = "2000m"
        …
      }
    


    アプリ バックエンドのメモリ上限

    引数: cloud_run_server.limits.memory

    main.tf の関連コード スニペット:

    module "cloud_run_server" {
    …
      limits = {
        …
        memory = "2Gi"
        …
    


    アプリ フロントエンドの CPU の上限

    引数: cloud_run_client.limits.cpu

    main.tf の関連コード スニペット:

    module "cloud_run_client" {
    …
      limits = {
        cpu    = "1000m"
        …
      }
    


    アプリ フロントエンドのメモリ上限

    引数: cloud_run_client.limits.memory

    main.tf の関連コード スニペット:

    module "cloud_run_client" {
    …
    
      limits = {
        …
        memory = "512Mi"
        …
    

  3. 前のセクションと同じ手順を使用して、リソースを検証しプロビジョニングします。

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

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

デプロイを削除する

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

プロジェクトを削除する

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

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

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

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

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

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

コンソールからソリューションのデプロイメントを削除しても、Firestore データベースは削除されません。このデータベースを削除するには、前述のようにプロジェクトを削除します。

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

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

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

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

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

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

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

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

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

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

Terraform CLI を使用して削除する

Terraform CLI を使用してソリューションのデプロイメントを削除しても、Firestore データベースは削除されません。このデータベースを削除するには、前述のようにプロジェクトを削除します。

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

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

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

    terraform destroy
    

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

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

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

    Destroy complete!
    

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

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

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

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

このガイドの前半で説明したように、ソリューションをデプロイしたときに、ユーザーに代わってサービス アカウントが作成されました。このサービス アカウントには特定の 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 の使用時に発生する可能性のあるデプロイエラーを示します。

Error: Error creating Database: googleapi: Error 409: Database already exists. Please use another database_id

デフォルトでは、Terraform のデプロイは Firestore データベースがプロジェクトにまだ存在しないことを前提としています。データベースがすでに存在する場合は、次のフラグを指定してデプロイを再度実行し、データベースの作成をスキップします。

$ terraform apply -var "init=false"

Error: Error creating Index: googleapi: Error 409: index already exists

このエラーは、そのソリューションが以前にこのプロジェクトにデプロイされていることを示します。別のプロジェクトを選択するか、サンプルアプリで以前に作成した Firestore インデックスを削除します。

「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 コマンドを再度実行します。

「Cannot assign requested address」エラー

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 カスタマーケアにお問い合わせください。

次のステップ