OSS(Object Storage Service)へのファイルのアップロード、ダウンロード、読み取り機能を備えた Spring Cloud アプリケーションを作成し、コードや構成の変更を加えずに Enterprise Distributed Application Service (EDAS) にデプロイします。
OSS を利用する理由
OSS は、Alibaba Cloud が開発した、安全でコスト効率が高く、信頼性の高いストレージサービスであり、クラウドに大量のデータを保存できます。OSS はプラットフォームに依存しない RESTful API オペレーションを提供しているため、Spring Cloud で開発されたアプリケーションであらゆる種類のデータを保存し、アクセスできます。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
OSS が有効化済みの Alibaba Cloud アカウント
セキュリティ管理ページから取得した AccessKey ペア(AccessKey ID および AccessKey Secret)
ご利用のバケットが配置されているリージョンに対応する OSS エンドポイント(「リージョンとエンドポイント」をご参照ください)
ローカル環境に JDK 8 以降および Maven がインストール済み
仕組み
Spring Cloud AliCloud OSS は、Spring Cloud アプリケーションと Alibaba Cloud OSS を統合するためのライブラリです。スターター依存関係を追加し、認証情報を設定すると、以下の操作が可能になります。
Spring Bean に直接
OSSクライアントをインジェクトできます。Resourceインスタンスとして OSS オブジェクトにアクセスできます(@Value("oss://...")を使用)。コードや構成を変更せずに、同一アプリケーションを EDAS にデプロイできます。
Maven プロジェクトのセットアップ
oss-exampleという名前の Maven プロジェクトを作成します。pom.xmlに以下の依存関係を追加します。Spring Boot 1.x は保守終了しています。Spring Boot 1.x を使用する必要がある場合は、Spring Cloud Edgware および Spring Cloud Alibaba 1.5.1.RELEASE とともに、バージョン 1.5.x を使用してください。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alicloud-oss</artifactId> <version>2.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>src/main/java配下に、spring.cloud.alicloud.ossというパッケージを作成します。
アプリケーションのエントリーポイントの作成
spring.cloud.alicloud.oss パッケージ内に、起動クラス OssApplication を作成します。起動時に、対象のバケットが存在するかを確認し、存在しない場合は自動的に作成します。
package spring.cloud.alicloud.oss;
import com.aliyun.oss.OSS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import java.net.URISyntaxException;
@SpringBootApplication
public class OssApplication {
// 実際のバケット名に置き換えてください
public static final String BUCKET_NAME = "test-bucket";
public static void main(String[] args) throws URISyntaxException {
SpringApplication.run(OssApplication.class, args);
}
@Bean
public AppRunner appRunner() {
return new AppRunner();
}
class AppRunner implements ApplicationRunner {
@Autowired
private OSS ossClient;
@Override
public void run(ApplicationArguments args) throws Exception {
try {
if (!ossClient.doesBucketExist(BUCKET_NAME)) {
ossClient.createBucket(BUCKET_NAME);
}
} catch (Exception e) {
System.err.println("oss handle bucket error: " + e.getMessage());
System.exit(-1);
}
}
}
}サンプルファイルの追加
src/main/resources 配下に、oss-test.json というファイルを作成します。
{
"name": "oss-test"
}REST コントローラーの作成
spring.cloud.alicloud.oss パッケージ内に、OssController を作成します。このコントローラーは、Spring Resource インターフェイスを介してファイルのアップロード、ダウンロード、読み取りを行う 3 つのエンドポイントを公開します。
package spring.cloud.alicloud.oss;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.utils.IOUtils;
import com.aliyun.oss.model.OSSObject;
import org.apache.commons.codec.CharEncoding;
import org.springframework.beans.factory.annotation.Autowired;
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;
import java.nio.charset.Charset;
@RestController
public class OssController {
@Autowired
private OSS ossClient;
// OSS オブジェクトを Spring Resource としてアクセス
@Value("oss://" + OssApplication.BUCKET_NAME + "/oss-test.json")
private Resource file;
/**
* クラスパスから oss-test.json を OSS バケットにアップロードします。
*/
@GetMapping("/upload")
public String upload() {
try {
ossClient.putObject(OssApplication.BUCKET_NAME, "oss-test.json", this
.getClass().getClassLoader().getResourceAsStream("oss-test.json"));
} catch (Exception e) {
e.printStackTrace();
return "upload fail: " + e.getMessage();
}
return "upload success";
}
/**
* Spring Resource インターフェイスを介して OSS オブジェクトを読み取ります。
*/
@GetMapping("/file-resource")
public String fileResource() {
try {
return "get file resource success. content: " + StreamUtils.copyToString(
file.getInputStream(), Charset.forName(CharEncoding.UTF_8));
} catch (Exception e) {
e.printStackTrace();
return "get resource fail: " + e.getMessage();
}
}
/**
* OSS クライアントを直接使用して OSS オブジェクトをダウンロードします。
*/
@GetMapping("/download")
public String download() {
try {
OSSObject ossObject = ossClient.getObject(OssApplication.BUCKET_NAME, "oss-test.json");
return "download success, content: " + IOUtils
.readStreamAsString(ossObject.getObjectContent(), CharEncoding.UTF_8);
} catch (Exception e) {
e.printStackTrace();
return "download fail: " + e.getMessage();
}
}
}エンドポイントのまとめ:
| エンドポイント | メソッド | 説明 |
|---|---|---|
/upload | GET | oss-test.json をクラスパスからご利用の OSS バケットにアップロードします |
/file-resource | GET | Spring の Resource 抽象化(@Value("oss://..."))を介してファイルを読み取ります |
/download | GET | OSS クライアントを直接使用してファイルを取得します |
認証情報およびエンドポイントの構成
セキュリティ管理ページから、AccessKey ID および AccessKey Secret を取得します。
ご利用のバケットが配置されているリージョンに対応するエンドポイントを取得します。「リージョンとエンドポイント」をご参照ください。
src/main/resources配下に、application.propertiesを作成します。以下のプレースホルダーを実際の値に置き換えてください。プレースホルダー 説明 例 <your-access-key>AccessKey ID LTAI5tXxx<your-secret-key>AccessKey Secret xXxXxXx<your-endpoint>リージョン別エンドポイントのプレフィックス oss-cn-hangzhouspring.application.name=oss-example server.port=18084 # 実際の認証情報およびエンドポイントに置き換えてください spring.cloud.alicloud.access-key=<your-access-key> spring.cloud.alicloud.secret-key=<your-secret-key> spring.cloud.alicloud.oss.endpoint=<your-endpoint>.aliyuncs.com management.endpoints.web.exposure.include=*
結果の検証
OssApplicationのmainメソッドを実行して、サービスを起動します。ブラウザで
http://127.0.0.1:18084/uploadを開きます。upload successが表示された場合、ファイルのアップロードに成功しています。OSS コンソール で確認します:ご利用のバケットに移動し、左側ナビゲーションウィンドウの ファイル をクリックして、ファイル一覧に
oss-test.jsonが表示されることを確認します。http://127.0.0.1:18084/downloadを開いてファイルをダウンロードします。期待される出力は以下のとおりです。{ "name": "oss-test" }http://127.0.0.1:18084/file-resourceを開いて、Spring Resource インターフェイスを介してファイルを読み取ります。期待される出力は以下のとおりです。{ "name": "oss-test" }
いずれかのステップで失敗した場合は、コンソールログを確認してエラーを特定し、問題を修正してからアプリケーションを再起動してください。
EDAS へのデプロイ
Spring Cloud AliCloud OSS は、既存の開発環境から EDAS へのアプリケーション移行ニーズに対応するために開発されています。コードや構成を変更せずにアプリケーションをデプロイできます。
デプロイ手順については、以下をご参照ください。
構成リファレンス
| プロパティ | 説明 | 例 |
|---|---|---|
spring.cloud.alicloud.access-key | 認証用の AccessKey ID | LTAI5tXxx |
spring.cloud.alicloud.secret-key | 認証用の AccessKey Secret | xXxXxXx |
spring.cloud.alicloud.oss.endpoint | OSS のリージョン別エンドポイント | oss-cn-hangzhou.aliyuncs.com |
server.port | アプリケーションのポート | 18084 |
spring.application.name | Spring アプリケーション名 | oss-example |