連載「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へアクセスポリシーを使って、クライアントからダイレクトにアップロード/ダウンロードを行う方法です。
前者のアプリケーション実装方法は基本編で解説したので、今回はダイレクトアップロード/ダウンロードについて紹介していきます。まず、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のバケットとオブジェクトキーを指定します。ここでは基本編で作成したS3バケット以下へのアクセスを許可する設定を行います。
バケットとオブジェクトキーを指定する |
設定を確認して、「ポリシーの作成」ボタンを押下します。
同様に、アップロード向けのポリシーとして、アクションを「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 まで。