UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Kotlin】GCSへのアップロード用署名付きURLの作成

KotlinでGCSにファイルをアップロードするための署名付きURLを生成する方法を調べた

ちなみにサービスアカウントは作成済みで設定も済んでいるとする

uga-box.hatenablog.com

まず、Gradleのbuild.gradle.ktsに以下を追加して、Google Cloud Storageライブラリをインストールする

dependencies {
    implementation("com.google.cloud:google-cloud-storage:2.16.0")
}

実装は以下

import com.google.auth.oauth2.ServiceAccountCredentials
import com.google.cloud.storage.Storage
import com.google.cloud.storage.StorageOptions
import com.google.cloud.storage.BlobInfo
import java.net.URL
import java.nio.file.Files
import java.nio.file.Paths
import java.util.concurrent.TimeUnit

fun generateSignedUrl(
    bucketName: String,
    objectName: String,
    serviceAccountPath: String
): URL {
    // Storageクライアントを作成
    val storage: Storage = StorageOptions.getDefaultInstance().service

    // Blob(オブジェクト)の情報を設定
    val blobInfo = BlobInfo.newBuilder(bucketName, objectName).build()

    // 署名付きURLを生成(POST用)
    val signedUrl = storage.signUrl(
        blobInfo,
        15, TimeUnit.MINUTES, // URLの有効期限を15分に設定
        Storage.SignUrlOption.httpMethod(HttpMethod.POST) // HTTPメソッドをPOSTに指定
    )

    return signedUrl
}

fun main() {
    val bucketName = "your-bucket-name"  // GCSのバケット名
    val objectName = "your-object-name"  // GCSにアップロードするオブジェクト名
    val serviceAccountPath = "path-to-your-service-account.json" // サービスアカウントキーのパス

    // 署名付きURLを生成
    val signedUrl = generateSignedUrl(bucketName, objectName, serviceAccountPath)

    // 署名付きURLを出力
    println("Generated signed URL: $signedUrl")
}

この署名付きURLを使ってファイルをPOSTでアップロードできる

ちなみに、StorageOptions.getDefaultInstance().service環境変数やデフォルトの認証情報を使用して Storage インスタンスを取得する

簡単に使用できるため、特別な設定が不要

カスタムしたい場合は StorageOptions.newBuilder()を使う

// カスタム設定を使用
val storageCustom = StorageOptions.newBuilder()
    .setProjectId("your-project-id")
    .setCredentials(GoogleCredentials.fromStream(FileInputStream("path/to/credentials.json")))
    .build()
    .service