AWS SDK for Java
開発者ガイド

Amazon EC2 での IAM ロールを使用した AWS リソースへのアクセス権限の付与

アマゾン ウェブ サービス (AWS) へのリクエストはすべて、AWS が発行した認証情報を使用して暗号で署名される必要があります。IAM ロールを使用することで、Amazon EC2 インスタンスから AWS リソースへのセキュアなアクセスを簡単に付与できます。

このトピックでは、Amazon EC2 で実行されている Java SDK アプリケーションで IAM ロールを使用する方法について説明します。IAM インスタンスの詳細については、『Amazon EC2 User Guide for Linux Instances』の「Amazon EC2 の IAM ロール」を参照してください。

デフォルトプロバイダチェーンと EC2 インスタンスプロファイル

アプリケーションでデフォルトのコンストラクタを使用して AWS クライアントを作成する場合、そのクライアントはデフォルトの認証情報プロバイダチェーンを使用して次の順序で認証情報を検索します。

  1. システム環境変数: AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY

  2. Java のシステムプロパティ: aws.accessKeyIdaws.secretKey

  3. デフォルトの認証情報ファイル (このファイルの場所はプラットフォームによって異なります)。

  4. インスタンスプロファイル認証情報。EC2 インスタンスの IAM ロールに関連付けられたインスタンスメタデータ内にあります。

デフォルトのプロバイダチェーンの最後のステップは、アプリケーションを Amazon EC2 インスタンスで実行する場合にのみ使用できます。Amazon EC2 インスタンスを使用する場合にもっとも使い方が簡単でセキュリティに優れた方法です。また、InstanceProfileCredentialsProvider インスタンスを直接クライアントコンストラクタに渡して、デフォルトプロバイダーチェーン全体を経ることなく、インスタンスプロファイル認証情報を取得することもできます。

以下に例を示します。

AmazonS3 s3 = AmazonS3ClientBuilder.standard() .withCredentials(new InstanceProfileCredentialsProvider(false)) .build();

この方法を使用する場合、SDK はインスタンスプロファイル内の Amazon EC2 インスタンスに関連付けられている IAM ロールに関連付けられたアクセス権限と同じアクセス権限を持つ一時的な AWS 認証情報を取得します。これらの認証情報は一時的なもので、最終的には失効しますが、InstanceProfileCredentialsProvider によって定期的に更新されるため、取得済みの認証情報で引き続き AWS にアクセスできます。

重要

自動認証情報の更新は、自己の InstanceProfileCredentialsProvider をデフォルトのプロバイダチェーンの一部として作成するデフォルトのクライアントコンストラクタを使用している場合、または InstanceProfileCredentialsProvider インスタンスを直接クライアントコンストラクタに渡す場合にのみ発生します。その他の手段でインスタンスプロファイル認証情報を取得または渡す場合は、お客様自身で期限切れ認証情報を確認し更新する必要があります。

クライアントコンストラクタが認証情報プロバイダチェーンを使用して証明書を見つけられない場合、AmazonClientException がスローされます。

ウォークスルー: EC2 インスタンスでの IAM ロールの使用

以下のウォークスルーでは、アクセス権を管理するために IAM ロールを使用して Amazon S3 からオブジェクトを取得する方法を示します。

IAM ロールを作成します。

Amazon S3 に読み取り専用アクセスを付与する IAM ロールを作成します。

IAM ロールを作成するには

  1. IAM コンソールを開きます。

  2. ナビゲーションペインで [Roles]、[Create New Role] の順に選択します。

  3. ロールの名前を入力し、[Next Step] を選択します。この名前は Amazon EC2 インスタンスを起動するときに必要になるため、覚えておいてください。

  4. [Select Role Type] ページの [AWS Service Roles] で、[Amazon EC2] を選択します。

  5. [Set Permissions] ページの [Select Policy Template] で、[Amazon S3 Read Only Access] を選択して、[Next Step] を選択します。

  6. [Review] ページで、[Create Role] を選択します。

EC2 インスタンスを起動して IAM ロールを指定する

Amazon EC2 コンソールまたは AWS SDK for Java を使用して、IAM ロールで Amazon EC2 インスタンスを起動できます。

  • コンソールを使用して Amazon EC2 インスタンスを起動するには、『Amazon EC2 User Guide for Linux Instances』 の「Amazon EC2 Linux インスタンスの開始方法」の指示に従います。

    [Review Instance Launch (インスタンス作成の確認)] ページを開いたら、[Edit instance details (インスタンスの詳細の編集)] を選択します。[IAM ロール] で、前に作成した IAM ロールを選択します。指示にしたがって手順を完了します。

    注記

    インスタンスに接続するには、セキュリティグループとキーペアを作成するか、または既存のものを使用する必要があります。

  • AWS SDK for Java を使用して IAM ロールを使用する Amazon EC2 インスタンスを起動するには、「Amazon EC2 インスタンスの実行」を参照してください。

アプリケーションを作成する

EC2 インスタンスで実行するサンプルアプリケーションを作成してみましょう。まず、チュートリアルファイルを保存するために使用できるディレクトリを作成します (例: GetS3ObjectApp)。

次に、新しく作成したディレクトリに AWS SDK for Java ライブラリをコピーします。AWS SDK for Java を ~/Downloads ディレクトリにダウンロードした場合は、次のコマンドを使用してそれらのライブラリをコピーできます。

cp -r ~/Downloads/aws-java-sdk-{1.7.5}/lib . cp -r ~/Downloads/aws-java-sdk-{1.7.5}/third-party .

新規ファイルを開き、GetS3Object.java と名付け、次のコードを追加します。

import java.io.*; import com.amazonaws.auth.*; import com.amazonaws.services.s3.*; import com.amazonaws.services.s3.model.*; import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; public class GetS3Object { private static String bucketName = "text-content"; private static String key = "text-object.txt"; public static void main(String[] args) throws IOException { AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient(); try { System.out.println("Downloading an object"); S3Object s3object = s3Client.getObject( new GetObjectRequest(bucketName, key)); displayTextInputStream(s3object.getObjectContent()); } catch(AmazonServiceException ase) { System.err.println("Exception was thrown by the service"); } catch(AmazonClientException ace) { System.err.println("Exception was thrown by the client"); } } private static void displayTextInputStream(InputStream input) throws IOException { // Read one text line at a time and display. BufferedReader reader = new BufferedReader(new InputStreamReader(input)); while(true) { String line = reader.readLine(); if(line == null) break; System.out.println( " " + line ); } System.out.println(); } }

新規ファイルを開き、build.xml と名付け、次の行を追加します。

<project name="Get Amazon S3 Object" default="run" basedir="."> <path id="aws.java.sdk.classpath"> <fileset dir="./lib" includes="**/*.jar"/> <fileset dir="./third-party" includes="**/*.jar"/> <pathelement location="lib"/> <pathelement location="."/> </path> <target name="build"> <javac debug="true" includeantruntime="false" srcdir="." destdir="." classpathref="aws.java.sdk.classpath"/> </target> <target name="run" depends="build"> <java classname="GetS3Object" classpathref="aws.java.sdk.classpath" fork="true"/> </target> </project>

変更を加えたプログラムを構築し、実行します。プログラムには認証情報は保存されていません。このため、AWS 認証情報がすでに指定されていない場合、コードによって AmazonServiceException がスローされます。以下に例を示します。

$ ant Buildfile: /path/to/my/GetS3ObjectApp/build.xml build: [javac] Compiling 1 source file to /path/to/my/GetS3ObjectApp run: [java] Downloading an object [java] AmazonServiceException BUILD SUCCESSFUL

EC2 インスタンスへのコンパイルしたプログラムの転送

Secure Copy ( scp ) を使用して、AWS SDK for Java ライブラリとともに Amazon EC2 インスタンスにプログラムを転送します。一連のコマンドは、次のようになります。

scp -p -i {my-key-pair}.pem GetS3Object.class ec2-user@{public_dns}:GetS3Object.class scp -p -i {my-key-pair}.pem build.xml ec2-user@{public_dns}:build.xml scp -r -p -i {my-key-pair}.pem lib ec2-user@{public_dns}:lib scp -r -p -i {my-key-pair}.pem third-party ec2-user@{public_dns}:third-party

注記

使用した Linux ディストリビューションに応じて、ユーザー名は「ec2-user」、「root」、「ubuntu」のいずれかになります。インスタンスのパブリック DNS 名を取得するには、EC2 コンソールを開いて [Description] タブの [Public DNS] の値 (ec2-198-51-100-1.compute-1.amazonaws.com など) を探します。

上記のコマンドでは:

  • GetS3Object.class はコンパイルされたプログラム、

  • build.xml はプログラムを構築して実行するために使用する ant ファイル、

  • lib ディレクトリと third-party ディレクトリは、AWS SDK for Java の対応するライブラリフォルダです。

  • -r スイッチは、scp が AWS SDK for Java ディストリビューションの library ディレクトリと third-party ディレクトリのすべてのコンテンツについて、再帰的なコピーを実行することを示しています。

  • -p スイッチは、ソースファイルがコピー先にコピーされるときに、scp ではソースファイルのアクセス許可が維持されることを示しています。

    注記

    -p スイッチは、Linux, macOS, or Unix でのみ機能します。Windows からファイルをコピーする場合、必要に応じて次のコマンドを使用し、インスタンスでのファイルへのアクセス許可を修正します。

    chmod -R u+rwx GetS3Object.class build.xml lib third-party

EC2 インスタンスでサンプルプログラムを実行する

プログラムを実行するには、Amazon EC2 インスタンスに接続します。詳細については、Amazon EC2 User Guide for Linux Instances の「Linux インスタンスへの接続」を参照してください。

ant がインスタンスで使用できない場合は、次のコマンドを使用してインストールします。

sudo yum install ant

次に、ant を使用して次のようにプログラムを実行します。

ant run

プログラムでは、Amazon S3 オブジェクトのコンテンツがコマンドウィンドウに表示されます。