WorkflowsでCloud Storage用コネクタを用いてオブジェクトのコピーと削除する方法

WorkflowsでCloud Storage用コネクタを用いてオブジェクトのコピーと削除する方法

WorkflowsでCloud Storage用コネクタを用いてファイルのコピーと移動を試してみました。
Clock Icon2024.10.29

概要

WorkflowsでCloud Storage用のコネクタを用いると、バケット一覧の取得・メタデータの取得・オブジェクトの削除・バケットの削除などCloud Storageに対する各種操作をWorkflowsから容易に行うことができます。
そんな便利なCloud Storage用コネクタを用いて今回はCloud Storage上のオブジェクトのバケット間のコピーや削除を行ってみましたので備忘録も兼ねて記事にしてみました。

やってみる

まずはコネクタを探す

まずはコピーから試してみます。
以下のリファレンスから探します。(サンプル(Cloud Storage JSON connector sample)が載っていましたがコピーしている感じのサンプルはなさそうでした)
https://cloud.google.com/workflows/docs/reference/googleapis/storage/Overview

オブジェクト操作関連の箇所は以下でした。
https://cloud.google.com/workflows/docs/reference/googleapis/storage/Overview#module_googleapisstoragev1objects

下記がコピー操作をしているコネクタとあたりをつけました。

Functions
copy Copies a source object to a destination object. Optionally overrides metadata.(コピー元オブジェクトをコピー先オブジェクトにコピーします。 オプションでメタデータを上書きします。)
Method: googleapis.storage.v1.objects.copy

https://cloud.google.com/workflows/docs/reference/googleapis/storage/v1/objects/copy

上記コネクタのページにアクセスすると以下の記載が注意点として記載されています。

オブジェクト名をurl_encode関数またはurl_encode_plus関数を用いてURLエンコードしないとフォルダ(プレフィックス)がある場合操作に失敗するという旨の注意です。

実際にオブジェクトが以下の様なプレフィックスであった場合、エンコードしないとNot Foundエラーとなります。

hoge1/hoge2/test4.txt

上記のプレフィックスの場合はURLエンコードを適用する必要があります。

${text.url_encode("hoge1/hoge2/test4.txt")}

url_encode関数url_encode_plus関数の違いですが、これはスペースのエンコードのされ方に違いがあります。

  • url_encode関数

この関数は、URLエンコードを行う際に、スペースを%20にエンコードします。これは、一般的なURLエンコードの方法であり、RFC3986に準拠しています。

  • url_encode_plus関数

この関数は、URLエンコードを行う際に、スペースを+にエンコードします。これは、HTMLフォームの送信時に使われるapplication/x-www-form-urlencodedのエンコード形式に準拠しています。

両者の特徴をまとめると以下となります。

関数 エンコード
text.url_encode スペースを%20にエンコード
text.url_encode_plus スペースを+にエンコード

今回はurl_encode関数で進めます。

コピー方法

copyのコネクタのリファレンスを見ると以下の4つの引数が必須でした(その他にも大量の引数がありメタデータなども設定できるようですが今回は取り扱いません)。

引数 設定値
destinationBucket 宛先バケット名
destinationObject 宛先バケットに作成するオブジェクト名
sourceBucket コピー元オブジェクトのあるバケット名
sourceObject コピー元オプジェクトのオブジェクト名(プレフィックス付き)

上記をもとに実装すると以下となります、。

- init:
    assign:
      - dest_bucket_name: "宛先バケット名" 
      - dest_object_name: "宛先バケットに作成するオブジェクト名"
      - src_bucket_name: "コピー元オブジェクトのあるバケット名" 
      - src_object_name: "コピー元オプジェクトのオブジェクト名(プレフィックス付き)"
- copy:
    call: googleapis.storage.v1.objects.copy
    args:
        destinationBucket: ${dest_bucket_name}
        destinationObject: ${text.url_encode(dest_object_name)}
        sourceBucket: ${src_bucket_name}
        sourceObject: ${text.url_encode(src_object_name)}

コネクタgoogleapis.storage.v1.objects.copyを用いて、引数に必須のものを指定しています。また、オブジェクト名に関してはプレフィックスによってはエンコードが必要なのでurl_encode関数を用いて${text.url_encode(***)}というようにエンコードしています。

上記を実行すると指定バケットにオブジェクトがコピーされます。

削除する方法

削除も同じ調子で試してみます。まずはコネクタを探して下記のコネクタとあたりをつけました。

Method: googleapis.storage.v1.objects.delete

https://cloud.google.com/workflows/docs/reference/googleapis/storage/v1/objects/delete

こちらのコネクタもcopyの場合と同様にオブジェクト名のエンコードに注意してあげる必要があります。

リファレンスを読み込むと以下の2つの引数が必須でした。

引数 設定値
bucket 削除対象オブジェクトが存在するバケット名
object 削除対象オブジェクト名(プレフィックス付き)

実装は以下となります。

- init:
    assign:
      - delete_target_bucket: "削除対象オブジェクトが存在するバケット名"
      - delete_target_object: "削除対象オブジェクト名(プレフィックス付き)"
- delete:
    call: googleapis.storage.v1.objects.delete
    args:
        bucket: ${delete_target_bucket}
        object: ${text.url_encode(delete_target_object)}

上記を実行すると指定したバケットのオブジェクトが削除されます。

オブジェクトを移動する

Cloud Storage用コネクタやCloud Storage APIではオブジェクトの移動する方法として直接は提供されておらず、コピー + 元ファイルの削除という手順を踏むことになります。
せっかくなので移動(コピー + 削除)も実装してみました(組み合わせただけですが・・・)。

- init:
    assign:
      - dest_bucket_name: "宛先バケット名"
      - dest_object_name: "宛先バケットに作成するオブジェクト名"
      - src_bucket_name: "コピー元オブジェクトのあるバケット名"
      - src_object_name: "コピー元オブジェクトのオブジェクト名(プレフィックス付き)"
- copy:
    call: googleapis.storage.v1.objects.copy
    args:
        destinationBucket: ${dest_bucket_name}
        destinationObject: ${text.url_encode(dest_object_name)}
        sourceBucket: ${src_bucket_name}
        sourceObject: ${text.url_encode(src_object_name)}
- delete:
    call: googleapis.storage.v1.objects.delete
    args:
        bucket: ${src_bucket_name}
        object: ${text.url_encode(src_object_name)}

※移動先でも同じ名前のオブジェクトにしたい場合はdestinationObjectsrc_object_nameを指定してください。

まとめ

オブジェクト名のエンコードに注意すれば特に問題なく使えるかなと思いました。url_encode関数またはurl_encode_plus関数のどちらを用いるかはワークロードによるかなと思います。

Workflowsにはまだまだワクワクするコネクタがたくさんあるのでもっともっと試してみたいと思います。
それではまた。ナマステー

参考

オブジェクトを移動する

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.