連載「AWSで作るクラウドネイティブアプリケーションの基本」では、これまで32回にわたり、AWS ECSやALB、RDS、DynamoDB、ElastiCache、SQS、AWS Lambda、API Gateway等を使って、「Spring Boot」をベースとしたアプリケーションを実装する方法を紹介してきました。

続いて「応用」と冠した本連載では、以下のようなAWSサービスを使って、より発展的なアプリケーションの実装方法を紹介していきます

  • Amazon S3へのダイレクトアクセス
  • Amazon DynamoDBにおける高度なデータモデル、より実践的なアプリケーション実装
  • Amazon Keyspaces(for Apache Cassandra)を使ったアプリケーション実装
  • Amazon ECS Fargateを使ったアプリケーション実装
  • Amazon EKS を使ったアプリケーション実装
  • Amazon Auroraを使ったアプリケーション実装
  • Amazon Kinesisを使ったアプリケーション実装
  • Amazon MSK(Managed Streaming for Apache Kafka)を使ったアプリケーション実装
  • Amazon MQ(Message Queue)を使ったアプリケーション実装
  • AWS Batchを使ったアプリケーション実装
  • AWS StepFunctionsを使ったアプリケーション実装

初回となる今回は、基本編で紹介したAmazon S3、およびSTS(Security Token Service)を使ったより高度なSpring Bootアプリケーションの実装方法について解説します。本編を読み進めるにあたって、基本編の27回も適宜参照してください。

なお、本連載は以下の前提知識がある開発者を想定しています。

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

また、動作環境は以下のバージョンで実施しています。

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

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

※ 順不同。複数のサービスを組み合わせる場合もあります。

Amazon S3へのダイレクトアップロード・ダウンロード

基本編の第26回でも解説した通り、アプリケーションからAmazon S3にアクセスする方法は2つあります。VPC内にあるEC2や、ECSで実行されているアプリケーション内からAmazon SDK(Software Developers Kit:ライブラリ)を使ってアクセスする方法と、下記の図に示すように、AWS STSで、一時的に有効なURLや署名されたS3へアクセスポリシーを使って、クライアントからダイレクトにアップロード/ダウンロードを行う方法です。

AWS STSを使ってクライアントからダイレクトにアップロード/ダウンロードを行う方法

前者のアプリケーション実装方法は基本編で解説したので、今回はダイレクトアップロード/ダウンロードについて紹介していきます。まず、STSについて説明しましょう。

AWS STSの概要

AWS STSは、AWSリソースへのアクセスを一時的に許可する認証情報を作成するためのサービスです。STSに対して、SDKやCLI(Command Line Interface)から「AssumeRole」というAPIを実行すると、指定したIAMロールに設定された権限と同様のポリシーを一時的な認証情報として受け取ることができます(AWSコンソール上からはSTSのサービスはないので実行できません)。

もちろん、誰でもAssumeRole APIを実行してポリシーを取得できるわけではありません。事前に、AsumeRole APIが実行可能な対象を「信頼された対象(エンティティ)」として設定しておく必要があります。今回はその対象として設定したアプリケーションユーザーが、引き受け対象として設定されたIAMロールに付与されたポリシーを取得し、一時的に許可されたAWSリソースへアクセスする権限を得ることになります。

それでは、実際にIAMロールにS3へのアクセスが許可されたポリシーを設定してみましょう。

IAMロールとポリシーの設定

今回のように、アプリケーション内でSDKのライブラリからSTSのAssumeRole APIを実行する場合、AssumeRole APIの引き受け対象となるIAMロールとそれにアタッチするポリシーが必要です(基本編の第26回のようにアプリケーションから直接S3へアクセスする場合は不要)。

また、「信頼されたエンティティ」として設定するアプリケーションユーザーを事前に作成しておく必要がありますが、本連載では基本編で作成したものを利用します。もし、新たにアプリケーションユーザーを作成する場合は、基本編の第11回を参考にしてください。

なお、S3へのアクセスポリシーは後ほど作成するIAMロールに設定(アタッチ)するので、アプリケーションユーザーには設定しなくてもかまいません。

それでは、まずIAMロールにアタッチ(設定)する、S3へのアクセスポリシーを作成します。AWSコンソールから、IAMサービスを選択し、ポリシーメニューから「ポリシーの作成」ボタンをクリックします。

「ポリシーの作成」ボタンをクリックする

サービスは「S3」、アクションはダウンロード向けに「GetObject」を選択します。

サービスは「S3」、アクションはダウンロード向けに「GetObject」を選択

アクセス対象となるS3のバケットとオブジェクトキーを指定します。ここでは基本編で作成したS3バケット以下へのアクセスを許可する設定を行います。

バケットとオブジェクトキーを指定する

設定を確認して、「ポリシーの作成」ボタンを押下します。

「ポリシーの作成」ボタンを押下する

同様に、アップロード向けのポリシーとして、アクションを「PutObject」にして、ポリシーを作成します。

「PutObject」チェックボックスにチェックを入れる

「リソース」ラジオボタンで「指定」を選択する

「Amazonリソースネーム」を指定する

「名前」テキストボックスに任意の名前を入力する

続いて、作成したポリシーをアタッチするIAMロールを作成します。このロールが、AssumeRole APIの引き受け対象になります。同じくIAMロールメニューから、「ロールの作成」ボタンを押下し、「信頼されたエンティティの種類」に「別のAWSアカウント」を選択して自身のアカウントIDを入力の上、「次のステップ:アクセス権限」ボタンをクリックします。

エンティティの種類を選択する

先ほど作成したポリシーをアタッチします。

アタッチするポリシーを選択し、ロールを作成する

上記はダウンロード用ロールを作成した例ですが、同様にアップロード向けのロールも作成しておいてください。

上記で作成したロールは「信頼されたエンティティ」が自身のアカウントIDになっているので、アプリケーション用のユーザーとなるように編集します。まず、作成したロールを選択し、「信頼関係」タブから、「信頼関係の編集」ボタンを押下します。

「信頼関係の編集」ボタンを押下

開かれた「信頼関係の編集」画面で、エンティティを「arn:aws:iam:[account-id]:user/[app-user-name]」となるよう編集し、「信頼ポリシーの更新」ボタンを押下します。

エンティティを編集する

上記はダウンロード用ロールの例ですが、同様にアップロード用ロールも「信頼されたエンティティ」を編集しておいてください。

これで、S3へダイレクトアップロード/ダウンロードするアプリケーションを実装する準備が整いました。次回は、S3へアクセスが許可された署名付きURLを生成して、クライアントからダイレクトファイルダウンロードするアプリケーションを実装してみます。

著者紹介


川畑 光平(KAWABATA Kohei) - NTTデータ

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

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

本連載の内容に対するご意見・ご質問は Facebook まで。