代入 IAM 角色 - AWS SDK for PHP

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

代入 IAM 角色

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

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

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

这些临时凭证通常称为实例配置文件凭证,允许访问该角色的策略允许的操作和资源。Amazon EC2 将处理为 IAM 服务对实例进行安全身份验证以代入角色的所有调查工作,并定期刷新检索到的角色凭证。这样,您几乎无需承担任何工作,便可保证应用程序的安全。有关接受临时安全凭证的服务列表,请参阅 IAM 用户指南中的使用 IAM 的 AWS 服务

注意

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

有关使用 SDK 来开发 Amazon EC2 应用程序的更多信息,请参阅 AWS SDK 和工具参考指南中的使用适用于 Amazon EC2 实例的 IAM 角色

创建 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 ]);

有关更多信息,请参见适用于 Linux 实例的 Amazon EC2 用户指南中的 Amazon EC2 的 IAM 角色

使用 Amazon ECS 任务的 IAM 角色

Amazon Elastic Container Service (Amazon ECS) 中的任务可以代入 IAM 角色来进行 AWS API 调用。这是管理供应用程序使用的凭证的策略,与 Amazon EC2 实例配置文件为 Amazon EC2 实例提供凭证的方式相似。

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

有关使用容器任务可以代入的 IAM 角色的更多信息,请参阅 Amazon ECS 开发人员指南中的任务 IAM 角色主题。有关在任务定义中以 taskRoleArn 形式使用任务 IAM 角色的示例,另请参阅 Amazon ECS 开发人员指南中的示例任务定义

在另一个 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'] ] ]);

有关更多信息,请参阅 AWS SDK for PHP API 参考中的使用 IAM 角色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'] ] ]);

有关更多信息,请参阅 AWS SDK for PHP API 参考中的 AssumeRoleWithWebIdentity—通过基于 Web 的身份提供商进行联合身份验证AssumeRoleWithWebIdentity

代入角色与配置文件

~/.aws/credentials 中定义配置文件

通过在 ~/.aws/credentials 中定义配置文件,可以配置 AWS SDK for PHP 以使用 IAM 角色。

使用将代入的角色的 role_arn 设置来创建新的配置文件。还需要包含另一配置文件的 source_profile 设置,以及有权代入 IAM 角色的凭证。有关这些配置设置的更多详细信息,请参阅 AWS SDK 和工具参考指南中的代入角色凭证

例如,在下面的 ~/.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 中定义配置文件

~/.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' ]);