今回から3回にわたり、「Spring Cloud AWS」を用いてAmazon S3(Simple Storage Service)へアクセスするSpringアプリケーションの実装方法について解説していきます。

なお、解説にあたっては以下の前提知識がある開発者を想定しています。

対象読者 前提知識
エンタープライズ開発者 Java言語及びSpringFrameworkを使った開発に従事したことがある経験者。経験がなければ、こちらのチュートリアルを実施することを推奨します。TERASOLUNAはSpringのベストプラクティスをまとめた開発方法論で、このチュートリアルでは、JavaやSpring Frameworkを使った開発に必要な最低限の知識を得ることができます
GitHubなどのバージョン管理ツールや「Apache Maven」などのライブラリ管理ツールを使った開発に従事したことがある経験者
AWS開発経験者 AWSアカウントをもち、コンソール上で各サービスを実行したことがある経験者

また、動作環境は以下のバージョンを利用しています。

動作対象 バージョン
Java 1.8
Spring Boot 2.1.6.RELEASE
Spring Cloud AWS 2.1.2.RELEASE

ただし、将来的には、AWSコンソール上の画面イメージや操作、バージョンアップにより、Javaのソースコード内で使用するクラスが変わる可能性があります。

Amazon S3の概要

Amazon S3は、各リージョンごとに利用可能なWebベースのデータストレージサービスです。基本的に、AWSコンソールやアプリケーションを経由し、データの保存や取り出しが可能となっています。保存できるファイル数に限界はありませんが、1ファイルあたりのサイズ制限は最大5TBです。

保存先のストレージの主な特徴として、データセンタ内の複数ストレージに必ず3カ所以上に複製される点が挙げられます。これにより、きわめて高い信頼性を確保できる(イレブン9のオーダー)とともに、ファイルにバージョンを付与することで、ユーザーの誤操作による復元も可能です。なお、S3のデータは同一リージョンの専用のデータ領域に保存されます。

データは、ユーザーが最初に作成する「バケット」と呼ばれる保存場所に「オブジェクト」として、アップロードするかたちとなります。オブジェクトを保存するときは、オプションで「スタンダード」「低冗長化」「標準IA」「Glacier」が選択できます。料金は、おおむね以下の通り、データ使用量に応じた従量課金性(リージョンにより単価は異なる)ですが、信頼性とアクセス頻度に応じて異なります。

オプション 信頼性 料金
スタンダード 99.999999999% 1GBあたり3円程度
低冗長化 99.99% スタンダードの2/3
標準IA 99.999999999% スタンダードの2/3。ただし、アクセス料金が高い
Glacier 99.999999999% スタンダードの1/3。ただし、データの取り出しに数時間必要

S3へアクセスする全ての通信はSSLによって暗号化され、バケットごとにポリシーを設定できるので、アクセスの詳細な制御が可能です。アップロードデータの自動暗号化機能もあり、こちらを有効化すると万一情報漏洩が発生してもデータの参照はできません。

また、S3はWebサーバとしても動作し、アップロードされたデータをそのままコンテンツとして保存できます。 ただし、スクリプト言語やデータベースの導入はできないため、動的なコンテンツは利用できませんが、HTMLや画像ファイルなどの静的なコンテンツならば、 信頼性が高いWebサイトをそのまま構築することが可能です。

バケットの作成とファイルのアップロード

まず最初に、データを保存するためのバケットを作成しましょう。AWSマネジメントコンソールからS3サービスメニューを選択し、「バケットを作成する」ボタンを押下してください。すると、「バケットの作成」画面が開かれるので、バケット名を入力し、リージョンを選択します。

バケット名には小文字の英文字、数字およびハイフン(-)やドット(.)を含むことができます。ただし、S3へのダイレクトアップロード時などにドットを含めるとエラーとなるため、AWSの公式ページ「バケット命名規則」に従って、バケット名を作成してください。なお、作成後にバケット名を変更することはできません。

バケット名とリージョンを選択する

入力が終わったら、「次へ」ボタンを押下してください。オプションの設定項目が表示されますが、今回は何も設定せず、そのまま「次へ」ボタンを押下します。

今回はここでは何も設定しない

アクセス制御では、パブリックアクセスをブロックしておきます。

パブリックアクセスをブロックする

■ここに注意!
最近では、S3のドメインを自動スキャンしてパブリックアクセスが可能なバケットに悪意のあるJavaScriptのコードを埋め込むセキュリティ攻撃が確認されています。開発や検証用途のバケットだとしても基本的にパブリックアクセスは避けるように設定しましょう。

設定内容を確認し、「バケットを作成」ボタンを押下します。

設定に問題がなければ「バケットを作成」ボタンを押下

バケットを作成できたら、ファイルをアップロードしてみましょう。作成したバケットを選択し、「アップロード」ボタンを押下します。ダイアログが表示されたら「ファイルを追加」ボタンを押下し、ファイルを選択して「次へ」ボタンを押下します。

「アップロード」画面

Amazon S3では、オブジェクトのキー名に基づいてバケットが仕切られるため、タイムスタンプやアルファベット順など、重複するプレフィックスを使用すると、特定のパーティションが使用される確率が高くなります。S3のリクエストのワークロードが1秒につき、100を超えるPUT、LIST、DELETE、あるいは300を超えるGETが見込まれるときは、ガイドラインに従い、パフォーマンスの向上のためにバケット名の先頭に異なる英数字の使用を検討しましょう。

アップロードするファイルへのアクセス権限を設定します。ここではデフォルトのまま、所有者のみアクセス権限を設定しておきます。

ファイルへのアクセス権限を設定する

アップロードするファイルのストレージオプションを選択します。ここでは「スタンダード」を選択します。

ファイルのストレージオプションを選択する

内容を確認したら「アップロード」ボタンを押下します。

「アップロード」ボタンを押下するとファイルがアップロードされる

これでファイルをアップロードできました。次回は、SpringアプリケーションでS3へアクセスする方法を説明した上で、実装していきます。

著者紹介


川畑 光平(KAWABATA Kohei) - NTTデータ 課長代理

金融機関システム業務アプリケーション開発・システム基盤担当を経て、現在はソフトウェア開発自動化関連の研究開発・推進に従事。

Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professional等の資格を持ち、アプリケーション基盤・クラウドなどさまざまな開発プロジェクト支援にも携わる。2019 APN AWS Top Engineers & Ambassadors選出。