Cloud Storage のチュートリアル

このシンプルなチュートリアルでは、Cloud Storage トリガーを使用したバックグラウンド Cloud ファンクションを書き込み、デプロイ、トリガーする方法について説明します。

目標

料金

このチュートリアルでは、以下を含む Cloud Platform の有料コンポーネントを使用します。

  • Google Cloud Functions
  • Google Cloud Storage

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを作成できます。

新しい Cloud Platform ユーザーは無料トライアルをご利用いただけます。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP プロジェクトを選択または作成します。

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

  3. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 詳しくは、課金を有効にする方法をご覧ください。

  4. Cloud Functions および Cloud Storage API を有効にします。

    APIを有効にする

  5. Cloud SDK をインストールして初期化します。
  6. gcloud コンポーネントを更新します。
    gcloud components update
  7. 開発環境を準備します。

アプリケーションの準備

  1. Cloud Storage バケットを作成しテストファイルをアップロードします。ここで、YOUR_TRIGGER_BUCKET_NAME はグローバルに固有のバケット名となります。

    gsutil mb gs://YOUR_TRIGGER_BUCKET_NAME
    
  2. ローカルマシンにサンプルアプリのリポジトリのクローンを作成します。

    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 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。

  3. Cloud Functions のサンプルコードが含まれているディレクトリに移動します。

    Node.js

    cd nodejs-docs-samples/functions/helloworld/

    Python

    cd python-docs-samples/functions/gcs/

    Go

    cd golang-samples/functions/helloworld/storage_generic/

関数のデプロイとトリガー

現在、Cloud Storage の関数は Cloud Storage からの Pub/Sub 通知に基づいており、以下に挙げる類似のイベントタイプに対応しています。

以降のセクションでは、上記の各イベントタイプについて、関数をデプロイしてトリガーする方法を説明します。

オブジェクトのファイナライズ

オブジェクト ファイナライズ イベントは、Cloud Storage オブジェクトの「書き込み」が正常にファイナライズされた時点でトリガーされます。つまり、新しいオブジェクトの作成または既存のオブジェクトの上書きによって、このイベントがトリガーされます。このトリガーにより、アーカイブとメタデータの更新オペレーションは無視されます。

オブジェクトのファイナライズ: 関数のデプロイ

Cloud Storage イベントを処理するサンプル関数を見てみましょう。

Node.js

/**
 * Generic background Cloud Function to be triggered by Cloud Storage.
 *
 * @param {object} event The Cloud Functions event.
 * @param {function} callback The callback function.
 */
exports.helloGCSGeneric = (data, context, callback) => {
  const file = data;

  console.log(`  Event: ${context.eventId}`);
  console.log(`  Event Type: ${context.eventType}`);
  console.log(`  Bucket: ${file.bucket}`);
  console.log(`  File: ${file.name}`);
  console.log(`  Metageneration: ${file.metageneration}`);
  console.log(`  Created: ${file.timeCreated}`);
  console.log(`  Updated: ${file.updated}`);

  callback();
};

Python

def hello_gcs_generic(data, context):
    """Background Cloud Function to be triggered by Cloud Storage.
       This generic function logs relevant data when a file is changed.

    Args:
        data (dict): The Cloud Functions event payload.
        context (google.cloud.functions.Context): Metadata of triggering event.
    Returns:
        None; the output is written to Stackdriver Logging
    """

    print('Event ID: {}'.format(context.event_id))
    print('Event type: {}'.format(context.event_type))
    print('Bucket: {}'.format(data['bucket']))
    print('File: {}'.format(data['name']))
    print('Metageneration: {}'.format(data['metageneration']))
    print('Created: {}'.format(data['timeCreated']))
    print('Updated: {}'.format(data['updated']))

Go


// Package helloworld provides a set of Cloud Functions samples.
package helloworld

import (
	"context"
	"fmt"
	"log"
	"time"

	"cloud.google.com/go/functions/metadata"
)

// GCSEvent is the payload of a GCS event.
type GCSEvent struct {
	Bucket         string    `json:"bucket"`
	Name           string    `json:"name"`
	Metageneration string    `json:"metageneration"`
	ResourceState  string    `json:"resourceState"`
	TimeCreated    time.Time `json:"timeCreated"`
	Updated        time.Time `json:"updated"`
}

// HelloGCSInfo prints information about a GCS event.
func HelloGCSInfo(ctx context.Context, e GCSEvent) error {
	meta, err := metadata.FromContext(ctx)
	if err != nil {
		return fmt.Errorf("metadata.FromContext: %v", err)
	}
	log.Printf("Event ID: %v\n", meta.EventID)
	log.Printf("Event type: %v\n", meta.EventType)
	log.Printf("Bucket: %v\n", e.Bucket)
	log.Printf("File: %v\n", e.Name)
	log.Printf("Metageneration: %v\n", e.Metageneration)
	log.Printf("Created: %v\n", e.TimeCreated)
	log.Printf("Updated: %v\n", e.Updated)
	return nil
}

関数をデプロイするには、サンプルコードがあるディレクトリで次のコマンドを実行します。

Node.js

gcloud functions deploy helloGCSGeneric --runtime nodejs8 --trigger-resource YOUR_TRIGGER_BUCKET_NAME --trigger-event google.storage.object.finalize
異なるバージョンの Node.js を使用するには、--runtime フラグに次の値を使用します。
  • nodejs6(非推奨)
  • nodejs8
  • nodejs10(ベータ版)

Python

gcloud functions deploy hello_gcs_generic --runtime python37 --trigger-resource YOUR_TRIGGER_BUCKET_NAME --trigger-event google.storage.object.finalize

Go

gcloud functions deploy HelloGCSInfo --runtime go111 --trigger-resource YOUR_TRIGGER_BUCKET_NAME --trigger-event google.storage.object.finalize

YOUR_TRIGGER_BUCKET_NAME は、関数をトリガーする Cloud Storage バケットの名前です。

オブジェクトのファイナライズ: 関数のトリガー

関数をトリガーするには、以下の手順に従います。

  1. サンプルコードがあるディレクトリに空の gcf-test.txt ファイルを作成します。

  2. 関数をトリガーするために、Cloud Storage にファイルをアップロードします。

    gsutil cp gcf-test.txt gs://YOUR_TRIGGER_BUCKET_NAME
    

    YOUR_TRIGGER_BUCKET_NAME は、テストファイルをアップロードする Cloud Storage バケットの名前です。

  3. 実行が完了したことをログで確認します。

    gcloud functions logs read --limit 50
    

オブジェクトの削除

オブジェクト削除イベントは、バージョニング非対応バケットには特に便利です。このイベントがトリガーされるのは、オブジェクトの古いバージョンが削除された時点です。さらに、オブジェクトが上書きされた場合にもトリガーされます。また、オブジェクト削除トリガーをバージョニング対応バケットで使用することもできます。この場合、オブジェクトのバージョンが完全に削除された時点でトリガーされます。

オブジェクトの削除: 関数のデプロイ

ファイナライズの例と同じサンプルコードを使用して、トリガー イベントとしてオブジェクトの削除を行う関数をデプロイします。サンプルコードがあるディレクトリで次のコマンドを実行します。

Node.js

gcloud functions deploy helloGCSGeneric --runtime nodejs8 --trigger-resource YOUR_TRIGGER_BUCKET_NAME --trigger-event google.storage.object.delete
異なるバージョンの Node.js を使用するには、--runtime フラグに次の値を使用します。
  • nodejs6(非推奨)
  • nodejs8
  • nodejs10(ベータ版)

Python

gcloud functions deploy hello_gcs_generic --runtime python37 --trigger-resource YOUR_TRIGGER_BUCKET_NAME --trigger-event google.storage.object.delete

Go

gcloud functions deploy HelloGCSInfo --runtime go111 --trigger-resource YOUR_TRIGGER_BUCKET_NAME --trigger-event google.storage.object.delete

YOUR_TRIGGER_BUCKET_NAME は、関数をトリガーする Cloud Storage バケットの名前です。

オブジェクトの削除: 関数のトリガー

関数をトリガーするには、以下の手順に従います。

  1. サンプルコードがあるディレクトリに空の gcf-test.txt ファイルを作成します。

  2. バケットがバージョニング対応でないことを確認します。

    gsutil versioning set off gs://YOUR_TRIGGER_BUCKET_NAME
    
  3. Cloud Storage にファイルをアップロードします。

    gsutil cp gcf-test.txt gs://YOUR_TRIGGER_BUCKET_NAME
    

    YOUR_TRIGGER_BUCKET_NAME は、テストファイルをアップロードする Cloud Storage バケットの名前です。この時点ではまだ関数は実行されません。

  4. ファイルを削除して関数をトリガーします。

    gsutil rm gs://YOUR_TRIGGER_BUCKET_NAME/gcf-test.txt
    
  5. 実行が完了したことをログで確認します。

    gcloud functions logs read --limit 50
    

関数の実行が完了するまでに時間がかかる場合があります。

オブジェクトのアーカイブ

オブジェクト アーカイブ イベントは、バージョニング対応バケットでのみ使用できます。このイベントがトリガーされるのは、オブジェクトの古いバージョンがアーカイブされた時点です。つまり、オブジェクトが上書きまたは削除されると、アーカイブ イベントがトリガーされます。

オブジェクトのアーカイブ: 関数のデプロイ

ファイナライズの例と同じサンプルコードを使用して、トリガー イベントとしてオブジェクトのアーカイブを行う関数をデプロイします。サンプルコードがあるディレクトリで次のコマンドを実行します。

Node.js

gcloud functions deploy helloGCSGeneric --runtime nodejs8 --trigger-resource YOUR_TRIGGER_BUCKET_NAME --trigger-event google.storage.object.archive
異なるバージョンの Node.js を使用するには、--runtime フラグに次の値を使用します。
  • nodejs6(非推奨)
  • nodejs8
  • nodejs10(ベータ版)

Python

gcloud functions deploy hello_gcs_generic --runtime python37 --trigger-resource YOUR_TRIGGER_BUCKET_NAME --trigger-event google.storage.object.archive

Go

gcloud functions deploy HelloGCSInfo --runtime go111 --trigger-resource YOUR_TRIGGER_BUCKET_NAME --trigger-event google.storage.object.archive

YOUR_TRIGGER_BUCKET_NAME は、関数をトリガーする Cloud Storage バケットの名前です。

オブジェクトのアーカイブ: 関数のトリガー

関数をトリガーするには、以下の手順に従います。

  1. サンプルコードがあるディレクトリに空の gcf-test.txt ファイルを作成します。

  2. バケットのバージョニングが有効になっていることを確認します。

    gsutil versioning set on gs://YOUR_TRIGGER_BUCKET_NAME
    
  3. Cloud Storage にファイルをアップロードします。

    gsutil cp gcf-test.txt gs://YOUR_TRIGGER_BUCKET_NAME
    

    YOUR_TRIGGER_BUCKET_NAME は、テストファイルをアップロードする Cloud Storage バケットの名前です。この時点ではまだ関数は実行されません。

  4. ファイルをアーカイブして関数をトリガーします。

    gsutil rm gs://YOUR_TRIGGER_BUCKET_NAME/gcf-test.txt
    
  5. 実行が完了したことをログで確認します。

    gcloud functions logs read --limit 50
    

オブジェクト メタデータの更新

メタデータ更新イベントは、既存のオブジェクトのメタデータが更新された時点でトリガーされます。

オブジェクト メタデータの更新: 関数のデプロイ

ファイナライズの例と同じサンプルコードを使用して、トリガー イベントとしてメタデータの更新を行う関数をデプロイします。サンプルコードがあるディレクトリで次のコマンドを実行します。

Node.js

gcloud functions deploy helloGCSGeneric --runtime nodejs8 --trigger-resource YOUR_TRIGGER_BUCKET_NAME --trigger-event google.storage.object.metadataUpdate
異なるバージョンの Node.js を使用するには、--runtime フラグに次の値を使用します。
  • nodejs6(非推奨)
  • nodejs8
  • nodejs10(ベータ版)

Python

gcloud functions deploy hello_gcs_generic --runtime python37 --trigger-resource YOUR_TRIGGER_BUCKET_NAME --trigger-event google.storage.object.metadataUpdate

Go

gcloud functions deploy HelloGCSInfo --runtime go111 --trigger-resource YOUR_TRIGGER_BUCKET_NAME --trigger-event google.storage.object.metadataUpdate

YOUR_TRIGGER_BUCKET_NAME は、関数をトリガーする Cloud Storage バケットの名前です。

オブジェクト メタデータの更新: 関数のトリガー

関数をトリガーするには、以下の手順に従います。

  1. サンプルコードがあるディレクトリに空の gcf-test.txt ファイルを作成します。

  2. バケットがバージョニング対応でないことを確認します。

    gsutil versioning set off gs://YOUR_TRIGGER_BUCKET_NAME
    
  3. Cloud Storage にファイルをアップロードします。

    gsutil cp gcf-test.txt gs://YOUR_TRIGGER_BUCKET_NAME
    

    YOUR_TRIGGER_BUCKET_NAME は、テストファイルをアップロードする Cloud Storage バケットの名前です。この時点ではまだ関数は実行されません。

  4. ファイルのメタデータを更新します。

    gsutil -m setmeta -h "Content-Type:text/plain" gs://YOUR_TRIGGER_BUCKET_NAME/gcf-test.txt
    
  5. 実行が完了したことをログで確認します。

    gcloud functions logs read --limit 50
    

クリーンアップ

このチュートリアルで使用するリソースについて、Google Cloud Platform アカウントへの課金が発生しないようにする手順は次のとおりです。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. GCP Console で [プロジェクト] ページに移動します。

    プロジェクト ページに移動

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

Cloud ファンクションの削除

Cloud Functions を削除しても、Cloud Storage に保存されたリソースは削除されません。

このチュートリアルで作成した Cloud ファンクションを削除するには、次のコマンドを実行します。

Node.js

gcloud functions delete helloGCSGeneric 

Python

gcloud functions delete hello_gcs_generic 

Go

gcloud functions delete HelloGCSInfo 

Google Cloud Console から Cloud Functions を削除することもできます。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Functions のドキュメント