⇧ Microsoftさん、公開されている数々のドキュメントが整備されていないことが多々あることから察するに、内部も酷い有様なのかしらね...
GCP(Google Cloud Platform)からGoogle Cloudへ名称変わってた。
何やら、
Google Cloud Platform が Google Cloud に名称変更
お客様のエクスペリエンスをシンプルにし、プロダクト間の一貫性を保つために、Google Cloud Platform は Google Cloud という名称になりました。さらに、モバイルアプリ名(旧 Cloud Console アプリ)は、Google Cloud アプリという名称に変更されました。この変更はほとんどのウェブサイトやドキュメントに反映されています。
⇧ 改名してたっぽい...
う~む、「Google Cloud」だと略称が「GC」になっちゃうから、「Garbage Collection」の略称と被ったりして意味分からんことになるから、略称を使えんくなるやん...
Google Cloud(旧:GCP(Google Cloud Platform))のCloud Storageとは?
まぁ、名称変更されてしまったものは致し方ない。
で、2023年8月15日(火)時点で、開発に必要なサービスを提供している主要なクラウドで日本で利用されているものとなると、
- AWS(Amazon Web Service)
- Microsoft Azure(旧:Windows Azure)
- Google Cloud(旧:GCP(Google Cloud Platform))
- Oracle Cloud Infrastructure(OCI)
って感じになるのかな?
調査対象の母集団が分からんので何とも言えないのですが、クラウドのサービスのシェアの調査結果を見た限りでは、
⇧ 「Oracle Cloud Infrastructure(OCI)」はまだ、「その他」に含まれるんだとは思うけども。
まぁ、話が脱線しましたが、「Google Cloud(旧:GCP(Google Cloud Platform))」の「Cloud Storage」というサービスは、
Cloud Storage は、Google Cloud でオブジェクトを保存するためのサービスです。オブジェクトとは、任意の形式のファイルで構成される不変のデータのことです。オブジェクトをバケットと呼ばれるコンテナに保存します。すべてのバケットがプロジェクトに関連付けられ、組織のプロジェクトをグループ化できます。Compute Engine インスタンスと同様に、Google Cloud のそれぞれのプロジェクト、バケット、オブジェクトがリソースになります。
⇧ とのことで、クラウド上でファイルとかを保存しておけるサービスですと。
2023年8月15日(火)時点で、「Google Cloud(旧:GCP(Google Cloud Platform))」では、
⇧ 無料枠で利用できるようにしてくれている、ありがたや。
残念ながら、類似のサービスの「AWS(Amazon Web Service)」の「Simple Storage Service(Amazon S3)」は、12ヵ月間限定での無料枠となっていました。
本当は「AWS(Amazon Web Service)」での実装を試したかったんだが...
Cloud StorageをJavaで使ってみる
というわけで、ファイルのアップロード処理で、アップロードしたファイルを外部のサーバーに保存しておきたいという状況を実現したかったので、「Cloud Storage」をJavaで利用してみることに。
ちなみに、自分は「Google Cloud(旧:GCP(Google Cloud Platform))」の「無料トライアル」を終えてしまっている状態です。
「Cloud Storage」をJavaで利用するには、
⇧ clientライブラリが必要ですと。
その他、「Google Cloud(旧:GCP(Google Cloud Platform))」で行う必要があることについてなど、
⇧ 上記サイト様が詳しいです。
手順的には、ザックリまとめると、
- Google Cloudコンソールで必要な作業
- Cloud Storageサービスで「バケット」作成
- 認証の設定(認証・認可に必要)
- サービスアカウントの作成
- 認証キー作成
- API(Cloud Storageサービス)利用側で必要な作業
ってな感じになるかと。
では、「1. Google Cloudコンソールで必要な作業」の手順の方から実施していく感じで。
「Google Cloud(旧:GCP(Google Cloud Platform))」にログインして、「ダッシュボード」に遷移して、ページ上部のプルダウンのアイコンを押下し表示されるモーダルウィンドウで、「新しいプロジェクト」を選択。(既に存在するプロジェクトを利用する場合は、そのプロジェクトを選択するで良いかと)
適当に「プロジェクト名」を決めて、「作成」ボタン押下。
作成したプロジェクトを選択し、
ページ左上のハンバーガーメニューのアイコンをクリックし、「Cloud Storage」>「バケット」を選択。
「作成」ボタン押下。
無料枠での利用の場合、リージョンを、
のいずれかにする必要があるので、「データの保存場所の選択」で、「Region」を変更で。
他の設定は変更してません。「作成」ボタン押下。
「Cloud Storage」サービスで「バケット」作成されました。
ちなみに、
Cloud Storage はフラットな名前空間で動作します。つまり、Cloud Storage 内にフォルダは存在しません。バケット your-bucket
に folder1/file.txt
という名前のオブジェクトを作成すると、そのオブジェクトへのパスは your-bucket/folder1/file.txt
になりますが、folder1
という名前のフォルダはありません。代わりに、文字列 folder1
がオブジェクト名の一部になります。
ただし、Google Cloud コンソールと Cloud Storage CLI では、ファイルツリーが次のような階層構造で表示されます。
⇧ フォルダという概念は無い模様。
続いて、「サービスアカウント」の作成。
「IAMと管理」>「サービス アカウント」を選択。
「サービスアカウントを作成」を選択。
「作成して続行」を選択。
「ロール」を設定して、「続行」押下。
「完了」押下。
「メール」のリンクを押下。
「キー」タブを選択し、「鍵を追加」のプルダウンのアイコンを押下。
「新しい鍵を作成」を選択。
で、「サービス アカウント キー」ですが、
サービス アカウント キーを使用するコードを扱う場合は、サービス アカウント キーをソースコードとは別に格納し、鍵がソース リポジトリに誤って送信されるリスクを軽減する必要があります。多くの場合、開発中はサービス アカウント キーを使用せず、サービス アカウント キーの代わりに個人の認証情報を使用することで、このリスクをさらに低減できます。
https://cloud.google.com/iam/docs/best-practices-for-managing-service-account-keys?hl=ja
⇧ とあり、開発中は「サービス アカウント キー」を使用しない方が良かったみたい...
「サービス アカウント キー」について、ソースコードと一緒に管理するのはNGらしいので、アプリケーションをデプロイしたマシン上の適当なディレクトリに配置する感じになるんかね?
とりあえず、適当な場所に配置。本来なら、他のメンバーもアクセスできる場所に配置すべきですが...
「Google Cloud(旧:GCP(Google Cloud Platform))」側での作業が済んだので、続いて、「2.API(Cloud Storageサービス)利用側で必要な作業」を進めていきます。
Eclipseを起動して、「Spring Boot」なプロジェクトを作成。
「依存関係」を追加し、「次へ(N)>」を押下。
「完了(F)」押下。
で、Eclipseで用意されていた「Google Cloud(旧:GCP(Google Cloud Platform))」の依存関係を使うと、エラーになるので、依存関係は修正・追加が必要でした...。
ソースコードは、
⇧ GitHubに上げました。
PostgreSQLのデータベースに、「Cloud Storage」で保存したファイルの情報を管理すためのテーブルを作成。
CREATE TYPE upload_status AS ENUM ('SUCCESS', 'FAILED'); -- DROP TYPE upload_status CASCADE; CREATE TABLE google_cloud_storage_info( id serial NOT NULL ,bucket_name varchar(255) ,blob_name varchar(1024) ,blob_generation bigint ,file_name varchar(1024) NOT NULL ,upload_status upload_status NOT NULL ,file_size bigint ,upload_byte_size bigint ,delete_flg boolean NOT NULL ,created_time timestamp with time zone NOT NULL ,updated_time timestamp with time zone ,primary key(id) ); COMMENT ON TABLE google_cloud_storage_info IS 'Google Cloud Storage 情報'; COMMENT ON COLUMN google_cloud_storage_info.id IS 'ID'; COMMENT ON COLUMN google_cloud_storage_info.bucket_name IS 'バケット名'; COMMENT ON COLUMN google_cloud_storage_info.blob_name IS 'blob名'; COMMENT ON COLUMN google_cloud_storage_info.blob_generation IS 'blobロケーション'; COMMENT ON COLUMN google_cloud_storage_info.file_name IS 'ファイル名'; COMMENT ON COLUMN google_cloud_storage_info.upload_status IS 'アップロード状態'; COMMENT ON COLUMN google_cloud_storage_info.file_size IS 'ファイルサイズ'; COMMENT ON COLUMN google_cloud_storage_info.upload_byte_size IS 'アップロードバイトサイズ'; COMMENT ON COLUMN google_cloud_storage_info.delete_flg IS '削除フラグ'; COMMENT ON COLUMN google_cloud_storage_info.created_time IS '作成日時'; COMMENT ON COLUMN google_cloud_storage_info.updated_time IS '更新日時';
で、Eclipseで「Spring Boot」なプロジェクトを起動しておいて、
Postmanから、画像をアップロードするリクエストを投げる。
で、「Google Cloud(旧:GCP(Google Cloud Platform))」のコンソールで、「Cloud Storage」のバケットを確認すると、
⇧ ファイルアップロードできてました。
テーブルも確認したところ、
⇧ データが登録できているのを確認。
とりあえず、「Google Cloud(旧:GCP(Google Cloud Platform))」の「Cloud Storage」に作成した「バケット」へ、Javaの実装でのファイルアップロードができました。
それにしても、PostgreSQLのenum型の対応がめちゃくちゃ面倒だったんが...
毎度モヤモヤ感が半端ない...