KotlinでGCSにファイルをアップロードするための署名付きURLを生成する方法を調べた
ちなみにサービスアカウントは作成済みで設定も済んでいるとする
まず、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