

 AWS SDK for Java 1.x は 2025 年 12 月 31 日にend-of-supportしました。新しい機能、可用性の向上、セキュリティ更新のために、[AWS SDK for Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/home.html) に移行することをお勧めします。

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

# Amazon EC2 での IAM ロールを使用した AWS リソースへのアクセスの許可
<a name="java-dg-roles"></a>

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

このトピックでは、Amazon EC2 で実行されている Java SDK アプリケーションで IAM ロールを使用する方法について説明します。IAM インスタンスの詳細については、「Linux インスタンス用 Amazon EC2 ユーザーガイドの [IAM Roles for Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)」を参照してください。

## デフォルトプロバイダチェーンと EC2 インスタンスプロファイル
<a name="default-provider-chain"></a>

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

1. Java のシステムプロパティ: `aws.accessKeyId` と `aws.secretKey`。

1. システム環境変数: `AWS_ACCESS_KEY_ID` と `AWS_SECRET_ACCESS_KEY`。

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

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

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

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

デフォルトのプロバイダチェーンの*インスタンスプロファイル認証情報*ステップは、アプリケーションを Amazon EC2 インスタンスで実行する場合にのみ使用できます。Amazon EC2 インスタンスを使用する場合にもっとも使い方が簡単でセキュリティに優れた方法です。また、[InstanceProfileCredentialsProvider](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/auth/InstanceProfileCredentialsProvider.html) インスタンスを直接クライアントコンストラクタに渡して、デフォルトプロバイダーチェーン全体を経ることなく、インスタンスプロファイル認証情報を取得することもできます。

例:

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

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

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

クライアントコンストラクタが認証情報プロバイダチェーンを使用して証明書を見つけられない場合、[AmazonClientException](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/AmazonClientException.html) がスローされます。

## ウォークスルー: EC2 インスタンスでの IAM ロールの使用
<a name="roles-walkthrough"></a>

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

### IAM ロールを作成します。
<a name="java-dg-create-the-role"></a>

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

1. [[IAM コンソール]](https://console.aws.amazon.com/iam/home) を開きます。

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

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

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

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

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

### EC2 インスタンスを起動して IAM ロールを指定する
<a name="java-dg-launch-ec2-instance-with-instance-profile"></a>

Amazon EC2 コンソールまたは AWS SDK for Java を使用して、IAM ロールで Amazon EC2 インスタンスを起動できます。
+ コンソールを使用して Amazon EC2 インスタンスを起動するには、Amazon EC2 Linux インスタンス用ユーザーガイドの [Amazon EC2 Linux インスタンスの開始方法](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html)の指示に従います。

  [**Review Instance Launch (インスタンス作成の確認)**] ページを開いたら、[**Edit instance details (インスタンスの詳細の編集)**] を選択します。[**IAM role**] (IAM ロール) で、前に作成した IAM ロールを選択します。指示にしたがって手順を完了します。
**注記**  
そのインスタンスに接続するには、セキュリティグループとキーペアを作成するか、または既存のものを使用する必要があります。
+ AWS SDK for Java を使用して IAM ロールを使用する Amazon EC2 インスタンスを起動するには、[Amazon EC2 インスタンスの実行](run-instance.md)を参照してください。

### アプリケーションを作成する
<a name="java-dg-remove-the-credentials"></a>

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 インスタンスへのコンパイルしたプログラムの転送
<a name="java-dg-transfer-compiled-program-to-ec2-instance"></a>

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 コンソール](https://console.aws.amazon.com/ec2/home)を開き、[**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` が `library` ディストリビューションの `third-party` ディレクトリと AWS SDK for Java ディレクトリのすべてのコンテンツについて、再帰的なコピーを実行することを示しています。
+ `-p` スイッチは、ソースファイルがコピー先にコピーされるときに、`scp` ではソースファイルのアクセス許可が維持されることを示しています。
**注記**  
この `-p` スイッチは、Linux、macOS、または Unix でのみ機能します。Windows からファイルをコピーする場合、必要に応じて次のコマンドを使用し、インスタンスでのファイルへのアクセス許可を修正します。

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

### EC2 インスタンスでサンプルプログラムを実行する
<a name="java-dg-run-the-program"></a>

プログラムを実行するには、Amazon EC2 インスタンスに接続します。詳細については、Amazon EC2 Linux インスタンス用ユーザーガイドの [Linux インスタンスへの接続](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstances.html)を参照してください。

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

```
sudo yum install ant
```

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

```
ant run
```

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