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

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

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

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

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

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

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

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

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

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

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

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

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

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

以下に例を示します。

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

この方法を使用すると、SDK は一時的なAWSIAM ロールに関連付けられたものと同じアクセス許可を持つ認証情報で、Amazon EC2インスタンスをインスタンスプロファイルに追加します。これらの認証情報は一時的なものであり、最終的には期限切れになりますが、InstanceProfileCredentialsProvider定期的に更新されるため、取得済みの認証情報で引き続きAWS。

重要

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

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

チュートリアル: EC2 インスタンスでの IAM ロールの使用

以下のウォークスルーでは、オブジェクトをAmazon S3IAM ロールを使用したアクセスを管理します。

IAM ロールを作成します。

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

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

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

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

  4. リポジトリの []ロールタイプの選択ページの下にある AWS のサービス ロールで SELECT Amazon EC2

  5. リポジトリの []許可を設定ページの下にあるポリシーテンプレートの選択で SELECT Amazon S3読み取り専用アクセス、次に次のステップ

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

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

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

  • を起動するにはAmazon EC2コンソールを使用してインスタンスを起動するには、の使用開始Amazon EC2Linux インスタンス()Amazon EC2Linux インスタンス用ユーザーガイド。

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

    注記

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

  • を起動するにはAmazon EC2を使用して、IAM ロールを使用してAWS SDK for Javaについては、を実行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 コンソールを参照し、パブリック 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 インスタンスに接続します。詳細については、「」を参照してください。Linux インスタンスへの接続()Amazon EC2Linux インスタンス用ユーザーガイド。

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

sudo yum install ant

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

ant run

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