Spring Resource の抽象化を使用して Cloud Storage 内のファイルにアクセスする

Spring Framework には、ファイル システム、クラスパス、ウェブなど、さまざまなソースからファイルを簡単に読み書きするための ResourceLoader 抽象化が用意されています。それには、既知のプロトコル接頭辞を使用してリソースへの URI を指定するだけです。たとえば、ローカル ファイル システム上のファイルにアクセスするには、file:/data/config.yaml のような URI を指定します。

Spring Resource の抽象化と gs: プロトコル接頭辞を使用して Cloud Storage に保存されているファイルにアクセスする Spring Boot アプリを作成します。

作成には Cloud Shell と Cloud SDK の gcloud コマンドライン ツールを使用します。

ラボの内容

  • Cloud Storage Spring Boot スターターの使用方法
  • Spring を使用して Cloud Storage のファイルにアクセスする方法
  • Spring の ResourceWritableResource の抽象化を使用する方法

必要なもの

  • Google Cloud プロジェクト
  • Google Chrome などのブラウザ
  • Linux の標準的なテキスト エディタ(Vim、Emacs、GNU Nano など)の使用経験

この Codelab をどのように使用しますか。

読み取り専用 演習を読み、完了する

HTML および CSS ウェブアプリ作成のご経験についてお答えください。

初心者 中級者 上級者

Google Cloud サービスの使用経験はどの程度ありますか?

初心者 中級者 上級者

セルフペース型の環境設定

Google アカウント(Gmail または Google Apps)をまだお持ちでない場合は、アカウントを作成する必要があります。Google Cloud Platform Console(console.cloud.google.com)にログインして、新しいプロジェクトを作成します。

2016-02-10 12:45:26.png のスクリーンショット

プロジェクト ID を忘れないようにしてください。プロジェクト ID はすべての Google Cloud プロジェクトを通じて一意の名前にする必要があります(上記の名前はすでに使用されているので使用できません)。以降、このコードラボでは PROJECT_ID と呼びます。

次に、Google Cloud リソースを使用するために、Cloud Console で課金を有効にする必要があります。

この Codelab を実施した場合、費用は数ドルを超えることはありませんが、より多くのリソースを使用する場合や、実行したままにしておくとさらにコストがかかる場合があります(このドキュメントの最後にある「クリーンアップ」セクションをご覧ください)。

Google Cloud Platform の新規ユーザーは 300 ドル分の無料トライアルをご利用いただけます。

Cloud Shell

Google Cloud で実行するコマンドライン環境である Cloud Shell を使用します。

Google Cloud Shell をアクティブにする

GCP Console で右上のツールバーにある Cloud Shell アイコンをクリックします。

[Cloud Shell の起動] をクリックします。

プロビジョニングと環境への接続にはそれほど時間はかかりません。

この仮想マシンには、必要な開発ツールがすべて準備されています。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働するため、ネットワーク パフォーマンスが充実しており認証もスムーズです。このラボでの作業のほとんどは、ブラウザまたは Google Chromebook から実行できます。

Cloud Shell に接続されると、認証が完了し、プロジェクトが PROJECT_ID に設定されていることが確認できます。

Cloud Shell で次のコマンドを実行して、認証されたことを確認します。

gcloud auth list

コマンド出力

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

コマンド出力

[core]
project = <PROJECT_ID>

上記のようになっていない場合は、次のコマンドで設定できます。

gcloud config set project <PROJECT_ID>

コマンド出力

Updated property [core/project].

Cloud Shell が起動したら、ファイルを作成して Cloud Storage に転送できます。

my-file.txt という名前のファイルを作成します。

$ echo "Hello World from GCS" > my-file.txt

次に、Cloud Storage に新しい一意のバケットを作成し、gsutil を使用してファイルを転送します。

$ BUCKET=spring-bucket-$USER
$ gsutil makebucket gs://$BUCKET
$ gsutil copy my-file.txt gs://$BUCKET

Cloud Storage のストレージ ブラウザに移動し、バケットとファイルが存在することを確認します。

コマンドラインを使用してアプリケーションの作成を開始し、Spring Initializr を使用して新しい Spring Boot アプリを生成します。

$ curl https://start.spring.io/starter.tgz \
-d dependencies=web,cloud-gcp-storage -d baseDir=spring-gcs | tar -xzvf -

Initializr により、spring-boot-starter-webspring-cloud-gcp-starter-storage がテンプレート アプリの pom.xml の依存関係に自動的に追加されます。

テンプレート アプリのディレクトリに移動します。

$ cd spring-gcs

Maven を使用してアプリをビルドして実行します。

$ ./mvnw spring-boot:run

ポート 8080 のリッスンが開始されます。新しい Cloud Shell タブを開き、curl を実行してアプリにアクセスします。

$ curl localhost:8080

アプリはまだ何もしないため、404 レスポンスが返されます。アプリが動作している以前の Cloud Shell タブに戻り、Control+C(Macintosh では Command+C)で強制終了します。

Spring Boot アプリを変更して、以前に Cloud Storage に保存した my-file.txt ファイルにアクセスします。目標は、ファイルの内容を HTTP 経由で返すだけです。

以下の手順では、Vim を使用してファイルを編集しますが、Emacs、GNU Nano、または Cloud Shell の組み込みのコードエディタを使用することもできます。

$ cd ~/spring-gcs

REST コントローラ GcsController をアプリに追加します。

$ vi src/main/java/com/example/demo/GcsController.java

次のコードを貼り付けます。この際、リソース URI を先ほど作成したバケットで修正してください。echo $BUCKET コマンドを実行するとバケットを確認できます。

src/main/java/com/example/demo/GcsController.java

package com.example.demo;

import java.io.IOException;
import java.nio.charset.Charset;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GcsController {

  @Value("gs://REPLACE_WITH_YOUR_BUCKET/my-file.txt")
  private Resource gcsFile;

  @RequestMapping(value = "/", method = RequestMethod.GET)
  public String readGcsFile() throws IOException {
    return StreamUtils.copyToString(
        gcsFile.getInputStream(),
        Charset.defaultCharset()) + "\n";
  }
}

Maven を使用してアプリをビルドして実行します。

$ ./mvnw spring-boot:run

アプリはポート 8080 のリッスンを開始します。新しい Cloud Shell タブを開き、curl を実行してアプリにアクセスします。

$ curl localhost:8080

アプリから返されたファイルの内容が表示されます。アプリが実行されている Cloud Shell タブに移動し、Control+C(Macintosh の場合は Command+C)で強制終了します。

Cloud Storage 内のファイルの内容を読み取り、Spring REST コントローラを介して公開しました。次に、新しいファイル コンテンツを同じ HTTP エンドポイントに送信して、ファイルの内容を変更します。

HTTP POST に応答して Cloud Storage のファイルにデータを書き込む別のメソッドを GcsController に追加する必要があります。今回は、Spring ResourceWritableResource にキャストします。

必要な追加インポートで GcsController を更新します。

src/main/java/com/example/demo/GcsController.java

import java.io.OutputStream;
import org.springframework.core.io.WritableResource;
import org.springframework.web.bind.annotation.RequestBody;

新しいエンドポイント メソッドをコントローラに追加します。

src/main/java/com/example/demo/GcsController.java

@RestController
public class GcsController {
  @RequestMapping(value = "/", method = RequestMethod.POST)
  String writeGcs(@RequestBody String data) throws IOException {
    try (OutputStream os = ((WritableResource) gcsFile).getOutputStream()) {
      os.write(data.getBytes());
    }
    return "file was updated\n";
  }
  ...
}

Maven を使用してアプリをビルドして実行します。

$ ./mvnw spring-boot:run

アプリはポート 8080 のリッスンを開始します。新しい Cloud Shell タブを開き、curl を実行してアプリにメッセージを投稿します。

$ curl -d 'new message' -H 'Content-Type: text/plain' localhost:8080

ファイルの内容が更新されたことを示す確認メッセージが表示されます。ただし、GET を実行してこれを検証します。

$ curl localhost:8080

アプリから返されたファイルの更新内容が表示されます。アプリが実行されている Cloud Shell のタブに戻り、Control+C(Macintosh の場合は Command+C)で強制終了します。

Spring Resource の抽象化を使用して、Cloud Storage 内のファイルに簡単にアクセスする方法を学習しました。ここでは、Cloud Storage 内のファイルの読み取りと書き込みが可能な Spring Boot ウェブアプリを作成しました。また、Cloud Storage の Spring Boot スターターを使ってこの機能を有効にすることもできます。

詳細

ライセンス

この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。