假定IAM角色 - 适用于 PHP 的 AWS 开发工具包
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

假定IAM角色

将 IAM 角色用于 Amazon EC2 实例可变凭证

如果您正在 Amazon EC2 实例上运行应用程序,则提供凭证来调用 AWS 的首选方式是使用 IAM 角色来获取临时安全凭证。

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

使用这些临时凭证(通常称为实例配置文件凭证)可以访问该角色的策略允许的操作和资源。Amazon EC2 将处理所有繁杂的工作,包括向 IAM 服务验证实例身份以安全地代入角色,以及定期刷新检索到的角色凭证。这样,您几乎无需承担任何工作,便可保证应用程序的安全。

注意

并非每个服务都支持实例配置文件凭证和 AWS Security Token Service (AWS STS) 生成的其他临时凭证。要确定您使用的服务是否支持临时凭证,请参阅支持 AWS STS 的 AWS 服务

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

创建一个 IAM 角色并将其分配给 Amazon EC2 实例

  1. 创建 IAM 客户端。

    导入

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

    示例代码

    $client = new IamClient([ 'region' => 'us-west-2', 'version' => '2010-05-08' ]);
  2. 创建 IAM 角色,并为其授予您将使用的操作和资源的权限。

    示例代码

    $result = $client->createRole([ 'AssumeRolePolicyDocument' => 'IAM JSON Policy', // REQUIRED 'Description' => 'Description of Role', 'RoleName' => 'RoleName', // REQUIRED ]);
  3. 创建 IAM 实例配置文件的 Amazon 资源名称 (ARN) 和存储从结果。

    注意

    如果您使用 IAM 控制台而不是AWS SDK for PHP,控制台自动创建实例配置文件,按相应的角色为文件命名。

    示例代码

    $IPN = 'InstanceProfileName'; $result = $client->createInstanceProfile([ 'InstanceProfileName' => $IPN , ]); $ARN = $result['Arn']; $InstanceID = $result['InstanceProfileId'];
  4. 创建 Amazon EC2 客户端。

    导入

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

    示例代码

    $ec2Client = new Ec2Client([ 'region' => 'us-west-2', 'version' => '2016-11-15', ]);
  5. 添加到正在运行或已停止的实例配置文件的 Amazon EC2 实例。使用您的 IAM 角色的实例配置文件名称。

    示例代码

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

有关更多信息,请参阅 Amazon EC2 的 IAM 角色

对 Amazon ECS 任务使用 IAM 角色

通过对 Amazon Elastic Container Service (Amazon ECS) 任务使用 IAM 角色,您可以指定一个任务中的容器可以使用的 IAM 角色。这是管理可供应用程序使用的凭证的策略,与 Amazon EC2 实例配置文件为 Amazon EC2 实例提供凭证的方式相似。

而不是为容器创建和分配 AWS 凭证或使用Amazon EC2实例的角色,您可以将IAM角色,或者使用 ECS 任务定义或RunTask APIoperation.

注意

并非每个服务都支持实例配置文件凭证和 AWS STS 生成的其他临时凭证。要确定您使用的服务是否支持临时凭证,请参阅支持 AWS STS 的 AWS 服务

有关更多信息,请参阅适用于 Amazon EC2 Container Service 任务的 IAM 角色

在另一个 AWS 账户中代入 IAM 角色

当您使用 AWS 账户(账户 A)工作并希望担任另一账户(账户 B)的角色时,您必须首先在账户 B 中创建 IAM 角色。此角色允许您账户(账户 A)中的实体执行账户 B 中的特定操作。教程:使用 IAM 角色委托跨 AWS 账户的访问权限

在账户 B 中创建了角色之后,请记录角色 ARN。当您从账户 A 代入该角色时将会使用此 ARN。您使用与账户 A 中的实体相关联的 AWS 凭证代入角色。

使用您 AWS 账户的凭证创建 AWS STS 客户端。在以下示例中,我们使用了一个凭证配置文件,但您可以使用任何方法。对于新创建的 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 角色或者AssumeRole中的AWS SDK for PHPAPI 参考。

使用具备 Web 身份的 IAM 角色

通过 Web 联合身份验证,客户能够在访问 AWS 资源时使用第三方身份提供商进行身份验证。在您代入具备 Web 身份的角色之前,您必须先创建一个 IAM 角色并配置 Web 身份提供商 (IdP)。有关更多信息,请参阅 创建用于 Web 联合身份验证或 OpenID Connect 联合身份验证的角色(控制台)

创建身份提供商创建用于 Web 身份验证的角色之后,请使用 AWS STS 客户端来对用户进行身份验证。请提供针对您身份的 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'] ] ]);

有关更多信息,请参阅 。AssumeRoleWithWebIdentity 通过基于 Web 的身份提供商进行联合或者AssumeRoleWithWebIdentity中的AWS SDK for PHPAPI 参考。