Cloud Functions を使用するワークフロー

始める前に

まだ設定していない場合は、Google Cloud プロジェクトと 2 つの Cloud Storage バケットを設定します。

プロジェクトを設定する

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Dataproc, Compute Engine, Cloud Storage, and Cloud Functions API を有効にします。

    API を有効にする

  5. Cloud SDK をインストールして初期化します。
  6. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

  7. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  8. Dataproc, Compute Engine, Cloud Storage, and Cloud Functions API を有効にします。

    API を有効にする

  9. Cloud SDK をインストールして初期化します。

プロジェクトで 2 つの Cloud Storage バケットを作成または使用する

プロジェクトには、入力ファイル用と出力ファイル用の 2 つの Cloud Storage バケットが必要です。

  1. Cloud Console で、Cloud Storage ブラウザページに移動します。

    [ブラウザ] に移動

  2. [バケットを作成] をクリックします。
  3. [バケットの作成] ページでユーザーのバケット情報を入力します。次のステップに進むには、[続行] をクリックします。
    • [バケットに名前を付ける] で、バケット名の要件を満たす名前を入力します。
    • [データの保存場所の選択] で、次の操作を行います。
      • [ロケーション タイプ] オプションを選択します。
      • [ロケーション] オプションを選択します。
    • [データのデフォルトのストレージ クラスを選択する] で、ストレージ クラスを選択します。
    • [オブジェクトへのアクセスを制御する方法を選択する] で [アクセス制御] オプションを選択します。
    • [詳細設定(省略可)] には、暗号化メソッド保持ポリシー、またはバケットラベルを指定します。
  4. [作成] をクリックします。

ワークフロー テンプレートを作成する

ローカル ターミナルウィンドウまたは Cloud Shell で以下に表示されているコマンドをコピーして実行し、ワークフロー テンプレートを作成して定義します。

注:

  • このコマンドでは、「us-central1」リージョンを指定しています。以前に gcloud config set compute/region を実行してリージョン プロパティを設定した場合は、別のリージョンを指定するか、--region フラグを削除できます。
  • 「-- 」(ダッシュ、ダッシュ、スペース)シーケンスは、jar ファイルに引数を渡します。wordcount input_bucket output_dir コマンドは、Cloud Storage input_bucket に含まれるテキスト ファイルに対して、jar のワードカウント アプリケーションを実行し、ワードカウント ファイルを output_bucket に出力します。関数でこの引数を指定できるように、ワードカウントの入力バケット引数をパラメータ化します。

  1. ワークフロー テンプレートを作成します。

    gcloud dataproc workflow-templates create wordcount-template \
        --region=us-central1
    

  2. ワードカウント ジョブをワークフロー テンプレートに追加します。
    1. コマンドを実行する前に output-bucket-name を指定します(関数は入力バケットを提供します)。出力バケット名を挿入すると、出力バケット引数は gs://your-output-bucket/wordcount-output" のようになります。
    2. 「count」ステップ ID は必須です。追加された Hadoop ジョブを識別します。

    gcloud dataproc workflow-templates add-job hadoop \
        --workflow-template=wordcount-template \
        --step-id=count \
        --jar=file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar \
        --region=us-central1 \
        -- wordcount gs://input-bucket gs://output-bucket-name/wordcount-output
    

  3. ワークフローを実行するには、マネージド単一ノードクラスタを使用します。Dataproc によってクラスタが作成され、ワークフローがクラスタ上で実行され、ワークフローの完了時にクラスタが削除されます。

    gcloud dataproc workflow-templates set-managed-cluster wordcount-template \
        --cluster-name=wordcount \
        --single-node \
        --region=us-central1
    

  4. Cloud Console の [Dataproc ワークフロー] ページで wordcount-template 名をクリックし、[ワークフロー テンプレートの詳細] ページを開きます。「wordcount-template」属性を確認します。

ワークフロー テンプレートをパラメータ化する

ワークフロー テンプレートに渡す入力バケット変数をパラメータ化します。

  1. パラメータ化のために、ワークフロー テンプレートを wordcount.yaml テキスト ファイルにエクスポートします。
    gcloud dataproc workflow-templates export wordcount-template \
        --destination=wordcount.yaml \
        --region=us-central1
    
  2. テキスト エディタを使用して wordcount.yaml を開き、ワークフローがトリガーされた際に、ワードカウント バイナリに args[1] として Cloud Storage の INPUT_BUCKET_URI が渡されるようにするため、YAML ファイルの末尾に parameters ブロックを追加します。

    エクスポートされた YAML ファイルの例を以下に示します。テンプレートを更新する方法は次の 2 つがあります。このうちの 1 つを選びます。

    1. your-output_bucket を出力バケット名に置き換えたあと、エクスポートした wordcount.yaml を置き換えるため、ファイル全体をコピーして貼り付けます。
    2. エクスポートした wordcount.yaml ファイルの末尾に、parameters セクションのみをコピーして貼り付けます。
    jobs:
    - hadoopJob:
        args:
        - wordcount
        - gs://input-bucket
        - gs://your-output-bucket/wordcount-output
        mainJarFileUri: file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar
      stepId: count
    placement:
      managedCluster:
        clusterName: wordcount
        config:
          softwareConfig:
            properties:
              dataproc:dataproc.allow.zero.workers: 'true'
    parameters:
    - name: INPUT_BUCKET_URI
      description: wordcount input bucket URI
      fields:
      - jobs['count'].hadoopJob.args[1]
    
  3. パラメータ化された wordcount.yaml テキスト ファイルをインポートします。テンプレートを上書きするように求められたら、「Y」(Yes の Y)を入力します。
    gcloud dataproc workflow-templates import  wordcount-template \
        --source=wordcount.yaml \
        --region=us-central1
    

関数を作成する

  1. Cloud Console で [Cloud Functions] ページを開き、[関数の作成] をクリックします。

  2. [関数の作成] ページで、次の情報を入力または選択します。

    1. [名前]: wordcount
    2. [メモリ割り当て]: デフォルトの選択のままにします。
    3. [トリガー]:
      • クラウド ストレージ
      • [イベント タイプ]: 確定 / 作成
      • [バケット]: 入力バケットを選択します(プロジェクトで Cloud Storage バケットを作成するを参照)。このバケットにファイルが追加されると、この関数はワークフローをトリガーします。ワークフローでワードカウント アプリケーションが実行され、バケット内のすべてのテキスト ファイルが処理されます。
    4. ソースコード:

      • インライン エディタ
      • [ランタイム]: Node.js 8
      • [INDEX.JS タブ]: デフォルトのコード スニペットを、次のコードに置き換えます。そして、-your-project-id-(先頭または末尾に「-」がないもの)を指定するように const projectId 行を編集します
      const dataproc = require('@google-cloud/dataproc').v1;
      
      exports.startWorkflow = (data) => {
       const projectId = '-your-project-id-'
       const region = 'us-central1'
       const workflowTemplate = 'wordcount-template'
      
      const client = new dataproc.WorkflowTemplateServiceClient({
         apiEndpoint: `${region}-dataproc.googleapis.com`,
      });
      
      const file = data;
      console.log("Event: ", file);
      
      const inputBucketUri = `gs://${file.bucket}/${file.name}`;
      
      const request = {
        name: client.projectRegionWorkflowTemplatePath(projectId, region, workflowTemplate),
        parameters: {"INPUT_BUCKET_URI": inputBucketUri}
      };
      
      client.instantiateWorkflowTemplate(request)
        .then(responses => {
          console.log("Launched Dataproc Workflow:", responses[1]);
        })
        .catch(err => {
          console.error(err);
        });
      };
      
      • [PACKAGE.JSON タブ]: デフォルトのコード スニペットを、次のコードに置き換えます。
      {
        "name": "dataproc-workflow",
        "version": "1.0.0",
        "dependencies":{ "@google-cloud/dataproc": ">=1.0.0"}
      }
      
      • 実行する関数: 「startWorkflow」を挿入します。
    5. [作成] をクリックします。

関数をテストする

  1. 公開ファイル rose.txt をバケットにコピーして、関数をトリガーします。コマンドに your-input-bucket-name(関数のトリガーに使用されるバケット)を挿入します。

    gsutil cp gs://pub/shakespeare/rose.txt gs://your-input-bucket-name
    

  2. 30 秒待ってから、次のコマンドを実行して関数が正常に完了したことを確認します。

    gcloud functions logs read wordcount
    
    ...
    Function execution took 1348 ms, finished with status: 'ok'
    

  3. Cloud Console の [関数リスト] ページから関数ログを表示するには、wordcount 関数名をクリックし、[関数の詳細] ページで [ログを表示] をクリックします。

  4. 出力バケットの wordcount-output フォルダは、Cloud Console の [ストレージ ブラウザ] ページから表示できます。

  5. ワークフローが完了すると、ジョブの詳細は Cloud Console に残ります。Dataproc の [ジョブ] ページに表示されているcount...ジョブをクリックして、ワークフロー ジョブの詳細を表示します。

クリーンアップ

このチュートリアルのワークフローでは、ワークフローが完了するとマネージド クラスタが削除されます。繰り返し費用が発生しないようにするには、このチュートリアルに関連する他のリソースを削除します。

プロジェクトの削除

  1. Cloud Console で [リソースの管理] ページに移動します。

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

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

Cloud Storage バケットの削除

  1. Cloud Console の Cloud Storage ブラウザページに移動します。

    [ブラウザ] に移動

  2. 削除するバケットのチェックボックスをクリックします。
  3. バケットを削除するには、 [削除] をクリックして、指示に沿って操作します。

ワークフロー テンプレートの削除

gcloud dataproc workflow-templates delete wordcount-template \
    --region=us-central1

Cloud Functions の関数の削除

Cloud Console で [Cloud Functions] ページを開き、wordcount 関数の左側にあるボックスを選択して、[削除] をクリックします。

次のステップ