1. 概要
Spring Framework には、ファイル システム、クラスパス、ウェブなど、さまざまなソースからファイルを簡単に読み書きできる ResourceLoader 抽象化が用意されています。リソースの URI を指定するには、よく知られているプロトコル プレフィックスを使用します。たとえば、ローカル ファイル システム上のファイルにアクセスするには、file:/data/config.yaml のような URI を指定します。
Spring リソース抽象化と gs: プロトコル プレフィックスを使用して、Cloud Storage に保存されたファイルにアクセスする Spring Boot アプリを作成します。
これを行うには、Cloud Shell と Cloud SDK の gcloud コマンドライン ツールを使用します。
学習内容
- Cloud Storage Spring Boot スターターの使用方法
- Spring を使用して Cloud Storage 内のファイルにアクセスする方法
- Spring の
Resource抽象化とWritableResource抽象化の使用方法
必要なもの
- Google Cloud プロジェクト
- ブラウザ(Google Chrome など)
- Linux の標準的なテキスト エディタ(Vim、Emacs、GNU Nano など)を使い慣れていること
この Codelab をどのように使用しますか?
HTML と CSS のウェブアプリの作成経験についてお答えください。
Google Cloud サービスの使用経験はどの程度ありますか?
2. 設定と要件
セルフペース型の環境設定
- Cloud Console にログインし、新しいプロジェクトを作成するか、既存のプロジェクトを再利用します(Gmail アカウントまたは G Suite アカウントをお持ちでない場合は、アカウントを作成する必要があります)。
プロジェクト ID を忘れないようにしてください。プロジェクト ID はすべての Google Cloud プロジェクトを通じて一意の名前にする必要があります(上記の名前はすでに使用されているので使用できません)。以降、このコードラボでは PROJECT_ID と呼びます。
- 次に、Google Cloud リソースを使用するために、Cloud Console で課金を有効にする必要があります。
このコードラボを実行しても、費用はほとんどかからないはずです。このチュートリアル以外で請求が発生しないように、リソースのシャットダウン方法を説明する「クリーンアップ」セクションの手順に従うようにしてください。Google Cloud の新規ユーザーは、 300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell
Google Cloud 上で動作するコマンドライン環境の Cloud Shell を使用します。
Cloud Shell をアクティブにする
- Cloud Console で、[Cloud Shell をアクティブにする]
をクリックします。
Cloud Shell を起動したことがない場合、その内容を説明する中間画面が(スクロールしなければ見えない範囲に)が表示されます。その場合は、[続行] をクリックします(以後表示されなくなります)。このワンタイム スクリーンは次のようになります。
Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。
この仮想マシンには、必要な開発ツールがすべて準備されています。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働するため、ネットワーク パフォーマンスが充実しており認証もスムーズです。このコードラボでの作業のほとんどは、ブラウザまたは Chromebook から実行できます。
Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。
- Cloud Shell で次のコマンドを実行して、認証されたことを確認します。
gcloud auth list
コマンド出力
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
gcloud config list project
コマンド出力
[core] project = <PROJECT_ID>
上記のようになっていない場合は、次のコマンドで設定できます。
gcloud config set project <PROJECT_ID>
コマンド出力
Updated property [core/project].
3. Cloud Storage にファイルを作成する
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 の ストレージ ブラウザに移動し、バケットとファイルが存在することを確認します。
4. Spring Boot アプリを初期化する
コマンドラインを使用して Spring Initializr で新しい Spring Boot アプリを生成し、アプリの作成を開始します。
$ curl https://start.spring.io/starter.tgz \ -d type=maven-project \ -d dependencies=web,cloud-gcp-storage -d baseDir=spring-gcs | tar -xzvf -
Initializr は、テンプレート アプリの pom.xml の依存関係に spring-boot-starter-web と spring-cloud-gcp-starter-storage を自動的に追加します。
テンプレート アプリのディレクトリに移動します。
$ cd spring-gcs
JAVA_HOME が正しい JDK バージョンに設定されていることを確認します。
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
Maven を使用してアプリをビルドして実行します。
$ ./mvnw spring-boot:run
アプリがポート 8080 をリッスンします。新しい Cloud Shell タブを開き、curl を実行してアプリにアクセスします。
$ curl localhost:8080
アプリはまだ何も有用な処理を行っていないため、404 レスポンスが返されます。
アプリが実行されている前の Cloud Shell タブに戻り、Control+C(Macintosh の場合は Command+C)で終了します。
5. Cloud Storage 内のファイルを読み取る
Cloud Storage に保存したファイル my-file.txt にアクセスするように Spring Boot アプリを変更します。目標は、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.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GcsController {
@Value("gs://REPLACE_WITH_YOUR_BUCKET/my-file.txt")
private Resource gcsFile;
@GetMapping("/")
public String readGcsFile() throws IOException {
return StreamUtils.copyToString(
gcsFile.getInputStream(),
Charset.defaultCharset());
}
}
Maven を使用してアプリをビルドして実行します。
$ ./mvnw spring-boot:run
アプリがポート 8080 をリッスンします。新しい Cloud Shell タブを開き、curl を実行してアプリにアクセスします。
$ curl localhost:8080
アプリから返されたファイルの内容が表示されます。アプリが実行されている前の Cloud Shell タブに戻り、Control+C(Macintosh の場合は Command+C)で終了します。
6. Cloud Storage 内のファイルに書き込む
Cloud Storage 内のファイルの内容を読み取り、Spring REST コントローラを介して公開しました。次に、新しいファイルの内容を同じ HTTP エンドポイントに投稿して、ファイルの内容を変更します。
HTTP POST に応答し、Cloud Storage 内のファイルにデータを書き込む別のメソッドを GcsController に追加する必要があります。今回は、Spring Resource を WritableResource にキャストします。
必要な追加のインポートを使用して 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;
import org.springframework.web.bind.annotation.PostMapping;
新しいエンドポイント メソッドをコントローラに追加します。
src/main/java/com/example/demo/GcsController.java
@RestController
public class GcsController {
@PostMapping("/")
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)で終了します。
7. 完了
Spring リソース抽象化を使用して Cloud Storage 内のファイルに簡単にアクセスする方法を学習しました。Cloud Storage 内のファイルを読み書きできる Spring Boot ウェブアプリを作成しました。また、その機能を有効にする Cloud Storage 用の Spring Boot スターターについても学習しました。
詳細
- Cloud Storage
- Google Cloud 上の Spring Framework
- Google Cloud GitHub リポジトリの Spring
- Google Cloud での Java
ライセンス
この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。