

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

# AWS SDK for PHP バージョン 3 を使用して IAM ロールを引き受ける
<a name="guide_credentials_assume_role"></a>

## IAM ロールによる Amazon EC2 インスタンス変数の認証情報の取得
<a name="instance-profile-credentials"></a>

Amazon EC2 インスタンスでアプリケーションを実行している場合、 を呼び出すための認証情報を提供するには、[IAM ロール](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)を使用して一時的なセキュリティ認証情報を取得 AWS することをお勧めします。

IAM ロールを使用すると、アプリケーションで認証情報の管理について気にする必要がなくなります。Amazon EC2 インスタンスのメタデータサーバーから一時認証情報を取得することで、インスタンスはロールを「継承」できます。

一時認証情報 (**インスタンスプロファイルの認証情報**とも呼ばれます) は、ロールのポリシーで許可されているアクションとリソースへのアクセスを可能にします。IAM サービスに対してインスタンスを安全に認証してロールを継承すること、および取得したロールの認証情報を定期的に更新することの細かい段取りはすべて Amazon EC2 によって処理されます。これにより、ユーザーはほとんど何もしなくてもアプリケーションの安全性が保たれます。一時的なセキュリティ認証情報を受け入れるサービスのリストについては、*IAM ユーザーガイド*の「[IAM と連携するAWS サービス](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)」を参照してください。

**注記**  
メタデータサービスから毎回取得することを回避するために、`Aws\CacheInterface` のインスタンスをクライアントコンストラクタの `'credentials'` オプションとして渡すことができます。これにより、SDK はキャッシュされているインスタンスプロファイルの認証情報を代わりに使用します。詳細については、「[AWS SDK for PHP バージョン 3 の設定](guide_configuration.md)」を参照してください。

SDK を使用して Amazon EC2 アプリケーションを開発する方法の詳細については、*AWS SDK およびツールリファレンスガイド*の「[Amazon EC2 インスタンス用の IAM ロールの使用](https://docs.aws.amazon.com/sdkref/latest/guide/access-iam-roles-for-ec2.html)」を参照してください。

### IAM ロールの作成と Amazon EC2 インスタンスへの割り当て
<a name="create-and-assign-an-iam-role-to-an-ec2-instance"></a>

1. IAM クライアントを作成します。

    **インポート** 

   ```
   require 'vendor/autoload.php';
   
   use Aws\Iam\IamClient;
   ```

    **サンプルコード** 

   ```
   $client = new IamClient([
       'region' => 'us-west-2',
       'version' => '2010-05-08'
   ]);
   ```

1. 使用するアクションとリソースへのアクセス許可を持つ IAM ロールを作成します。

    **サンプルコード** 

   ```
   $result = $client->createRole([
       'AssumeRolePolicyDocument' => 'IAM JSON Policy', // REQUIRED
       'Description' => 'Description of Role',
       'RoleName' => 'RoleName', // REQUIRED
   ]);
   ```

1. IAM インスタンスプロファイルを作成し、結果の Amazon リソースネーム (ARN) を保存します。
**注記**  
の代わりに IAM コンソールを使用すると AWS SDK for PHP、コンソールによってインスタンスプロファイルが自動的に作成され、対応するロールと同じ名前が付けられます。  
 **サンプルコード**   

   ```
   $IPN = 'InstanceProfileName';
   
   $result = $client->createInstanceProfile([
       'InstanceProfileName' => $IPN ,
   ]);
   
   $ARN = $result['Arn'];
   $InstanceID =  $result['InstanceProfileId'];
   ```

1. Amazon EC2 クライアントを作成します。

    **インポート** 

   ```
   require 'vendor/autoload.php';
   
   use Aws\Ec2\Ec2Client;
   ```

    **サンプルコード** 

   ```
   $ec2Client = new Ec2Client([
       'region' => 'us-west-2',
       'version' => '2016-11-15',
   ]);
   ```

1. 実行中または停止中の Amazon EC2 インスタンスにインスタンスプロファイルを追加します。IAM ロールのインスタンスプロファイル名を使用します。

    **サンプルコード** 

   ```
    $result = $ec2Client->associateIamInstanceProfile([
       'IamInstanceProfile' => [
           'Arn' => $ARN,
           'Name' => $IPN,
       ],
       'InstanceId' => $InstanceID
   ]);
   ```

詳細については、*Amazon EC2 ユーザーガイド*の「[Amazon EC2 の IAM ロール](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)」を参照してください。

## Amazon ECS タスク用の IAM ロールの使用
<a name="ecs-credentials"></a>

Amazon Elastic Container Service (Amazon ECS) のタスクは、 AWS API コールを行う IAM ロールを引き受けることができます。これにより、Amazon EC2 インスタンスプロファイルから Amazon EC2 インスタンスに認証情報を提供する場合と同じような方法で、アプリケーションで使用する認証情報を管理できます。

長期 AWS 認証情報を作成してコンテナに配布したり、Amazon EC2 インスタンスのロールを使用する代わりに、一時的な認証情報を使用する IAM ロールを ECS タスク定義または `RunTask` [API](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-ecs-2014-11-13.html#runtask) オペレーションに関連付けることができます。

コンテナタスクが引き受けることができる IAM ロールの使用方法の詳細については、*Amazon ECS 開発者ガイド*の「[タスク IAM ロール](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)」トピックを参照してください。タスク定義で `taskRoleArn` 形式のタスク IAM ロールを使用する例については、*Amazon ECS 開発者ガイド*の「[タスク定義の例](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/firelens-example-taskdefs.html)」も参照してください。

## 別の で IAM ロールを引き受ける AWS アカウント
<a name="assuming-an-iam-role-in-another-aws-account"></a>

( AWS アカウント アカウント A) で作業し、別のアカウント (アカウント B) でロールを引き受ける場合は、まずアカウント B で IAM ロールを作成する必要があります。このロールにより、アカウント (アカウント A) のエンティティがアカウント B で特定のアクションを実行できるようになります。クロスアカウントアクセスの詳細については、[「チュートリアル: IAM ロールを使用して AWS アカウント間でアクセスを委任する](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)」を参照してください。

アカウント B にロールを作成した後、ロールの ARN を記録します。この ARN は、アカウント A からロールを引き受けるときに使用します。ロールを引き受けるには、アカウント A のエンティティに関連付けられた AWS 認証情報を使用します。

の認証情報を使用して AWS STS クライアントを作成します AWS アカウント。以下では認証情報プロファイルを使用しますが、任意の方法を使用できます。新しく作成した AWS STS クライアントで assume-role を呼び出し、カスタム sessionName を提供します。結果から新しい一時認証情報を取得します。認証情報の有効期間は 1 時間です。

 **サンプルコード** 

```
$stsClient = new Aws\Sts\StsClient([
    'profile' => 'default',
    'region' => 'us-east-2',
    'version' => '2011-06-15'
]);

$ARN = "arn:aws:iam::123456789012:role/xaccounts3access";
$sessionName = "s3-access-example";

$result = $stsClient->AssumeRole([
      'RoleArn' => $ARN,
      'RoleSessionName' => $sessionName,
]);

 $s3Client = new S3Client([
    'version'     => '2006-03-01',
    'region'      => 'us-west-2',
    'credentials' =>  [
        'key'    => $result['Credentials']['AccessKeyId'],
        'secret' => $result['Credentials']['SecretAccessKey'],
        'token'  => $result['Credentials']['SessionToken']
    ]
]);
```

詳細については、 AWS SDK for PHP API リファレンス[の「IAM ロール](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html)または [AssumeRole](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-sts-2011-06-15.html#assumerole) の使用」を参照してください。

## ウェブ ID がある IAM ロールの使用
<a name="using-an-iam-role-with-web-identity"></a>

Web Identity フェデレーションを使用すると、お客様は AWS リソースにアクセスするときに認証にサードパーティーの ID プロバイダーを使用できます。ウェブ ID があるロールを継承できるようになるには、その前に IAM ロールを作成してウェブ ID プロバイダー (dP) を設定する必要があります。詳細については、「[ウェブ ID または OpenID Connect フェデレーション用のロールを作成する (コンソール)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html)」を参照してください。

[ID プロバイダーを作成し](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc.html)、[ウェブ ID のロールを作成したら](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html)、 AWS STS クライアントを使用してユーザーを認証します。ID の webIdentityToken と ProviderId、およびユーザーのアクセス許可を持つ IAM ロールのロールの ARN を提供します。

 **サンプルコード** 

```
$stsClient = new Aws\Sts\StsClient([
    'profile' => 'default',
    'region' => 'us-east-2',
    'version' => '2011-06-15'
]);

$ARN = "arn:aws:iam::123456789012:role/xaccounts3access";
$sessionName = "s3-access-example";
$duration = 3600;

$result = $stsClient->AssumeRoleWithWebIdentity([
      'WebIdentityToken' => "FACEBOOK_ACCESS_TOKEN",
      'ProviderId' => "graph.facebook.com",
      'RoleArn' => $ARN,
      'RoleSessionName' => $sessionName,
]);

 $s3Client = new S3Client([
    'version'     => '2006-03-01',
    'region'      => 'us-west-2',
    'credentials' =>  [
        'key'    => $result['Credentials']['AccessKeyId'],
        'secret' => $result['Credentials']['SecretAccessKey'],
        'token'  => $result['Credentials']['SessionToken']
    ]
]);
```

詳細については、 AWS SDK for PHP API リファレンスの[AssumeRoleWithWebIdentity — ウェブベースの ID プロバイダーを介したフェデレーション](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity.html)」または[AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-sts-2011-06-15.html#assumerolewithwebidentity)」を参照してください。

## プロファイルのあるロールを継承する
<a name="assume-role-with-profile"></a>

### `~/.aws/credentials` でプロファイルを定義する
<a name="assume-role-profile-credentials-file"></a>

でプロファイルを定義することで、IAM ロールを使用する AWS SDK for PHP ように を設定できます`~/.aws/credentials`。

継承するロールの `role_arn` 設定を持つ新しいプロファイルを作成します。また、IAM ロールを継承するアクセス許可を持つ認証情報のあるプロファイルの `source_profile` 設定を含めます。これらの設定について詳しくは、*AWS SDK およびツールリファレンスガイド*の「[ロールの継承の認証情報](https://docs.aws.amazon.com/sdkref/latest/guide/feature-assume-role-credentials.html)」を参照してください。

たとえば、以下の `~/.aws/credentials` では、`project1` プロファイルが `role_arn` を設定し、`default` プロファイルを認証情報のソースとして指定して、そのプロファイルに関連付けられているエンティティがロールを引き継ぐことができることを確認しています。

```
[project1]
role_arn = arn:aws:iam::123456789012:role/testing
source_profile = default
role_session_name = OPTIONAL_SESSION_NAME

[default]
aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID
aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY
aws_session_token= YOUR_AWS_SESSION_TOKEN
```

`AWS_PROFILE` 環境変数を設定するか、サービスクライアントをインスタンス化する際に `profile` パラメーターを使用することで、`project1` で特定されたロールは、`default` プロファイルをソース認証情報を使用して継承されます。

次のスニペットは、`S3Client` コンストラクタでの `profile` パラメーターの使用方法を示しています。`S3Client` には、`project1` プロファイルに関連付けられたロールに関連する権限が付与されます。

```
$s3 = new Aws\S3\S3Client([
    'region' => 'us-east-1',
    'version' => '2006-03-01',
    'profile' => 'project1'
]);
```

### `~/.aws/config` でプロファイルを定義する
<a name="assume-role-profile-config-file"></a>

`~/.aws/config` ファイルには、継承するプロファイルを含めることもできます。環境変数 `AWS_SDK_LOAD_NONDEFAULT_CONFIG` を設定すると、SDK for PHP は `config` ファイルからプロファイルをロードします。`AWS_SDK_LOAD_NONDEFAULT_CONFIG` を設定すると、SDK は `~/.aws/config` と `~/.aws/credentials` の両方からプロファイルをロードします。`~/.aws/credentials` のプロファイルは最後にロードされ、`~/.aws/config` から同じ名前でロードされたプロファイルよりも優先されます。どちらの場所からロードされたプロファイルも、`source_profile` または引き受けるプロファイルとして使用できます。

次の例では、`config` ファイルに定義されている `project1` プロファイルと `credentials` ファイル内の `default` プロファイルを使用しています。`AWS_SDK_LOAD_NONDEFAULT_CONFIG` も設定されています。

```
# Profile in ~/.aws/config.

[profile project1]
role_arn = arn:aws:iam::123456789012:role/testing
source_profile = default
role_session_name = OPTIONAL_SESSION_NAME
```

```
# Profile in ~/.aws/credentials.

[default]
aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID
aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY
aws_session_token= YOUR_AWS_SESSION_TOKEN
```

次のスニペットが表示されている `S3Client` コンストラクタを実行すると、`project1` プロファイルで定義されたロールは、`default` プロファイルに関連付けられた認証情報を使用して引き継がれます。

```
$s3 = new Aws\S3\S3Client([
    'region' => 'us-east-1',
    'version' => '2006-03-01',
    'profile' => 'project1'
]);
```