适用于 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 实例提供凭证的方式相似。

您可以将 IAM 角色与 ECS 任务定义或 RunTask API 操作关联,而不是为容器创建和分配 AWS 凭证或使用 Amazon EC2 实例的角色。

注意

并非每个服务都支持实例配置文件凭证和 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 角色或 AWS SDK for PHP API 参考中的 AssumeRole

使用具备 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 的身份提供商进行联合或AWS SDK for PHP API 参考中的 AssumeRoleWithWebIdentity