この Codelab について
1. 概要
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 の
Resource
とWritableResource
の抽象化を使用する方法
必要なもの
- Google Cloud プロジェクト
- Google Chrome などのブラウザ
- Linux の標準的なテキスト エディタ(Vim、Emacs、GNU Nano など)の使用経験
この Codelab をどのように使用しますか。
HTML および CSS ウェブアプリ作成のご経験についてお答えください。
Google Cloud サービスの使用経験はどの程度ありますか?
2. 設定と要件
セルフペース型の環境設定
Google アカウント(Gmail または Google Apps)をまだお持ちでない場合は、アカウントを作成する必要があります。Google Cloud Platform Console(console.cloud.google.com)にログインして、新しいプロジェクトを作成します。
プロジェクト 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].
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 dependencies=web,cloud-gcp-storage -d baseDir=spring-gcs | tar -xzvf -
Initializr により、spring-boot-starter-web
と spring-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
)で強制終了します。
5. Cloud Storage にあるファイルの読み取り
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
)で強制終了します。
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;
新しいエンドポイント メソッドをコントローラに追加します。
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
)で強制終了します。
7. お疲れさまでした
Spring Resource の抽象化を使用して、Cloud Storage 内のファイルに簡単にアクセスする方法を学習しました。ここでは、Cloud Storage 内のファイルの読み取りと書き込みが可能な Spring Boot ウェブアプリを作成しました。また、Cloud Storage の Spring Boot スターターを使ってこの機能を有効にすることもできます。
詳細
- Cloud Storage
- Spring Cloud Google Cloud プロジェクト
- Spring on Google Cloud GitHub リポジトリ
- Google Cloud での Java
ライセンス
この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。