見出し画像

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サービスの開発エンジニアを募集しています!
社員・フリーランスに関わらず、参画後に安心してご活躍できることを目指し、応募された方の特性・ご希望にマッチしたチームをご紹介します。
ちょっと話を聞いてみたい、ぜひ応募したい、など、当社にご興味を持っていただけましたら、お気軽にエントリーください!!