Amazon EC2 での IAM ロールを使用した AWS リソースへのアクセスの許可 - AWS SDK for Java 1.x

( AWS SDK for Java v1) end-of-support の今後の を発表しましたAWS SDK for Java v2 に移行することをお勧めします。日付、その他の詳細、移行方法については、リンク先の発表内容を参照してください。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon EC2 での IAM ロールを使用した AWS リソースへのアクセスの許可

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

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

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

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

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

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

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

  4. AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 環境変数が設定されていて、セキュリティマネージャーが変数にアクセスするアクセス権限を持っている場合、Amazon EC2 コンテナサービスを介して配信される認証情報。

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

  6. 環境またはコンテナからのウェブアイデンティティトークンの認証情報。

デフォルトのプロバイダチェーンのインスタンスプロファイル認証情報ステップは、アプリケーションを 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 ロールを作成します。

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

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

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

  4. [ロールタイプの選択] ページの [AWS のサービス ロール] で、[Amazon EC2] を選択します。

  5. [許可を設定] ページの [ポリシーテンプレートの選択] で、[Amazon S3 読み取り専用アクセス] を選択して、[次のステップ] を選択します。

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

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

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

  • コンソールを使用して Amazon EC2 インスタンスを起動するには、Amazon EC2 Linux インスタンス用ユーザーガイドの Amazon EC2 Linux インスタンスの開始方法の指示に従います。

    [Review Instance Launch (インスタンス作成の確認)] ページを開いたら、[Edit instance details (インスタンスの詳細の編集)] を選択します。[IAM role] (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 final String bucketName = "text-content"; private static final 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 {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 (Amazon EC2) を使用して、 ライブラリとともに AWS SDK for Java インスタンスにプログラムを転送します。一連のコマンドは、次のようになります。

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] (パブリック 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、または Unix でのみ機能します。Windows からファイルをコピーする場合、必要に応じて次のコマンドを使用し、インスタンスでのファイルへのアクセス許可を修正します。

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

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

プログラムを実行するには、Amazon EC2 インスタンスに接続します。詳細については、Amazon EC2 Linux インスタンス用ユーザーガイドの Linux インスタンスへの接続を参照してください。

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

sudo yum install ant

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

ant run

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