

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 适用于 PHP 的 AWS SDK 版本 3 假设一个 IAM 角色
<a name="guide_credentials_assume_role"></a>

## 将 IAM 角色用于 Amazon EC2 实例可变凭证
<a name="instance-profile-credentials"></a>

如果您在 Amazon EC2 实例上运行应用程序，则提供用于调用的证书的首选方法 AWS 是使用 I [AM 角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)获取临时安全证书。

使用 IAM 角色时，无需担心应用程序的凭证管理。它们允许实例通过从 Amazon EC2 实例的元数据服务器中检索临时凭证来“代入”角色。

这些临时凭证通常称为**实例配置文件凭证**，允许访问该角色的策略允许的操作和资源。Amazon EC2 将处理为 IAM 服务对实例进行安全身份验证以代入角色的所有调查工作，并定期刷新检索到的角色凭证。这样，您几乎无需承担任何工作，便可保证应用程序的安全。有关接受临时安全凭证的服务列表，请参阅 *IAM 用户指南*中的[使用 IAM 的AWS 服务](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。

**注意**  
要避免每次都击中元数据服务，可将 `Aws\CacheInterface` 的实例作为 `'credentials'` 选项传递给客户端构造函数。这样，开发工具包便可改用缓存的实例配置文件凭证。有关详细信息，请参阅 [适用于 PHP 的 AWS SDK 版本 3 的配置](guide_configuration.md)。

有关使用开发 Amazon EC2 应用程序的更多信息 SDKs，请参阅*AWS SDKs 和工具参考指南*中的[为 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 控制台代替 适用于 PHP 的 AWS SDK，则控制台会自动创建实例配置文件，并为其指定与其对应的角色相同的名称。  
 **示例代码**   

   ```
   $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 ECS) 中的任务可以扮演 IAM 角色来调 AWS 用 API。这是管理供应用程序使用的凭证的策略，与 Amazon EC2 实例配置文件为 Amazon EC2 实例提供凭证的方式相似。

您可以将使用临时 AWS 证书的 IAM 角色与 ECS 任务定义或 `RunTask` [API](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-ecs-2014-11-13.html#runtask) 操作相关联，而不必为容器创建和分配长期证书，也无需使用 Amazon EC2 实例的角色。

有关使用容器任务可以代入的 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。当您代入账户 A 中的角色时，您将使用此 ARN。您使用账户 A 中与您的实体关联的 AWS 证书代入该角色。

使用您的凭据创建 AWS STS 客户端 AWS 账户。在以下示例中，我们使用了一个凭证配置文件，但您可以使用任何方法。对于新创建的 AWS STS 客户端，请调用 assume-role 并提供一个自定义的 sessionName。从结果中检索新的临时凭证。默认情况下，凭证有效期为一个小时。

 **示例代码** 

```
$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']
    ]
]);
```

有关更多信息，请参阅[使用 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html)或 适用于 PHP 的 AWS SDK API 参考[AssumeRole](https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-sts-2011-06-15.html#assumerole)中。

## 使用具备 Web 身份的 IAM 角色
<a name="using-an-iam-role-with-web-identity"></a>

Web 联合身份验证允许客户在访问 AWS 资源时使用第三方身份提供商进行身份验证。在您代入具备 Web 身份的角色之前，您必须先创建一个 IAM 角色并配置 Web 身份提供商 (IdP)。有关更多信息，请参阅 [创建用于 Web 联合身份验证或 OpenID Connect 联合身份验证的角色（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html)。

[创建身份提供商](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc.html)并[为您的 Web 身份创建角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html)后，使用 AWS STS 客户端对用户进行身份验证。 ProviderId 为你的身份提供 webIdentityToken 和，为用户提供权限的 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']
    ]
]);
```

有关更多信息，请参阅 “[通过基于 Web 的身份提供商进行AssumeRoleWithWebIdentity联](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)“ 适用于 PHP 的 AWS SDK API 参考”。

## 代入角色与配置文件
<a name="assume-role-with-profile"></a>

### 在 `~/.aws/credentials` 中定义配置文件
<a name="assume-role-profile-credentials-file"></a>

您可以通过在中定义配置文件 适用于 PHP 的 AWS SDK 来将配置为使用 IAM 角色`~/.aws/credentials`。

使用将代入的角色的 `role_arn` 设置来创建新的配置文件。还需要包含另一配置文件的 `source_profile` 设置，以及有权代入 IAM 角色的凭证。有关这些配置设置的更多详细信息，请参阅《工具参考指南》*AWS SDKs 和《工具参考指南*》中的代入[角色凭证](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`，则适用于 PHP 的 SDK 会从 `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` 构造函数运行时（如以下代码段所示），将使用与 `default` 配置文件关联的凭证来代入 `project1` 配置文件中定义的角色。

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