Google Cloud Storage をAPIで操作する
こんにちは。株式会社レスキューナウで基幹システムを担当しているエンジニアです。
今回はGoogle Cloud Storage APIを使用して、JavaからGCS(Google Cloud Storage )のデータを操作する手順についてまとめました。
バケットを作成
GCPコンソールでCloud Storageにバケットを作成します。
認証キーを作成
GCPコンソールでサービスアカウントを作成し、「Storageオブジェクト管理者」などのロールを付与してStorageへのアクセスを許可します。
作成したサービスアカウントを選択し、鍵(JSONタイプ)を作成します。
作成したJSONキーはダウンロードされるので、それを利用して接続します。
APIでGCSを操作する
Google Cloud Storage APIを使用してGCSのBucketを操作します。
(1)Bucketにファイルをアップロードする
Storageオブジェクトのインスタンスを生成し、Bucketにファイルをアップロードします。
/**
* GoogleCloudStorageにファイルをアップロードする。
*
* @param aBucketName バケット名を指定する。
* @param aKeyFileName 鍵ファイル名を指定する。
* @param aServerFileName バケットに登録するファイル名を指定する。
* @param aLocalFileName アップロードするファイル名を指定する。
*/
private void gcsFileUpload(String aBucketName, String aKeyFileName,
String aServerFileName, String aLocalFileName) {
try {
// Storageオブジェクトの生成
Storage storage;
if(aKeyFileName.equals("") != true) {
storage = getStorageFromJsonKey(aKeyFileName);
} else {
storage = StorageOptions.getDefaultInstance().getService();
}
// Bucketにファイルをアップロード
BlobId blobId = BlobId.of(aBucketName, aServerFileName);
BlobInfo blobInfo = BlobInfo.newBuilder(blobId).build();
storage.create(blobInfo, Files.readAllBytes(Paths.get(aLocalFileName)));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* GoogleCloudStorageのStorageオブジェクトを生成する。
*
* @param aKeyFileName 鍵ファイル名を指定する。
*
* @return 生成したStorageオブジェクトが戻る。
*/
private Storage getStorageFromJsonKey(String aKeyFileName) throws IOException {
TransportOptions transportOptions = HttpTransportOptions.newBuilder()
.setConnectTimeout(connectTimeout)
.setReadTimeout(readTimeout)
.build();
RetrySettings retrySettings= RetrySettings.newBuilder()
.setMaxAttempts(10)
.setMaxRetryDelay(Duration.ofMillis(180_000L))
.setTotalTimeout(Duration.ofMillis(300_000L))
.setInitialRetryDelay(Duration.ofMillis(10_000L))
.setRetryDelayMultiplier(2.0)
.setInitialRpcTimeout(Duration.ofMillis(180_000L))
.setRpcTimeoutMultiplier(1.0)
.setMaxRpcTimeout(Duration.ofMillis(180_000L))
.build();
return StorageOptions.newBuilder()
.setTransportOptions(transportOptions)
.setRetrySettings(retrySettings)
.setCredentials(ServiceAccountCredentials.fromStream(new FileInputStream(aKeyFileName)))
.build()
.getService();
}
(2)Bucket内のオブジェクトを一覧表示する
Bucket内のオブジェクトを一覧表示してアップロードされているファイルを確認します。
/**
* GoogleCloudStorageのBucket内を一覧表示する。
*
* @param aBucketName バケット名を指定する。
* @param aKeyFileName 鍵ファイル名を指定する。
* @param aTargPath 一覧表示するフォルダを指定する。
*/
private void gcsFileList(String aBucketName, String aKeyFileName, String aTargPath) {
try {
// Storageオブジェクトの生成
Storage storage;
if(aKeyFileName.equals("") != true) {
storage = getStorageFromJsonKey(aKeyFileName);
} else {
storage = StorageOptions.getDefaultInstance().getService();
}
// Bucketオブジェクトの取得
Bucket bucket = storage.get(aBucketName);
if(bucket == null) {
System.out.println("bucket not found");
return;
}
// Bucket内のオブジェクトの一覧表示
Page<Blob> blobs = null;
if(aTargPath == null || aTargPath.equals("") == true) {
blobs = bucket.list(Storage.BlobListOption.versions(true));
} else {
blobs = bucket.list(Storage.BlobListOption.prefix(aTargPath));
}
for(Blob blob : blobs.iterateAll()) {
System.out.println(blob.getName() + ", " + new Date(blob.getUpdateTime()));
}
} catch (Exception e) {
e.printStackTrace();
}
}
まとめ
以上で終了になります。
ファイルのアップロードでは、フォルダの有無を意識する必要がなく、途中のフォルダが存在しない場合は自動的に作成してくれるのが、何気に便利だと感じました。
最後までご覧いただき、ありがとうございました。
最後に
現在、レスキューナウでは、災害情報の提供、災害情報を活用した安否確認サービスなどのWebサービスの開発エンジニアを募集しています!
社員・フリーランスに関わらず、参画後に安心してご活躍できることを目指し、応募された方の特性・ご希望にマッチしたチームをご紹介します。
ちょっと話を聞いてみたい、ぜひ応募したい、など、当社にご興味を持っていただけましたら、お気軽にエントリーください!!