假设 IAM 角色 - Amazon SDK for PHP
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

假设 IAM 角色

使用 IAM 角色获取 Amazon EC2 实例变量证书

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

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

临时证书,通常称为实例配置文件证书,允许访问角色策略允许的操作和资源。Amazon EC2 负责安全地向 IAM 服务验证实例以代入角色以及定期刷新检索到的角色证书的所有繁琐工作。这样,您几乎无需承担任何工作,便可保证应用程序的安全。有关接受临时安全证书的服务列表,请参阅 IAM 用户指南中的与 IAM 配合使用的Amazon服务

注意

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

有关使用软件开发工具包开发 Amazon EC2 应用程序的更多信息,请参阅软件开发工具包和Amazon工具参考指南中的 A mazon EC2 实例使用 IAM 角色

为 Amazon EC2 实例创建并分配 IAM 角色

  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 实例配置文件并存储结果中的亚马逊资源名称 (ARN)。

    注意

    如果您使用 IAM 控制台代替Amazon SDK for PHP,则控制台会自动创建实例配置文件并将其命名为与其对应的角色相同的名称。

    示例代码

    $IPN = 'InstanceProfileName'; $result = $client->createInstanceProfile([ 'InstanceProfileName' => $IPN , ]); $ARN = $result['Arn']; $InstanceID = $result['InstanceProfileId'];
  4. 创建亚马逊 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 实例亚马逊 EC2 用户指南中的亚马逊 EC2 的 IAM 角色

使用 IAM 角色执行亚马逊 ECS 任务

亚马逊弹性容器服务 (Amazon ECS) 中的任务可以扮演 IAM 角色来进行 Amazon API 调用。这是一种管理要使用的应用程序证书的策略,类似于 Amazon EC2 实例配置文件为 Amazon EC2 实例提供凭证的方式。

您可以将使用临时Amazon证书的 IAM 角色与 ECS 任务定义或 RunTask API 操作相关联,而不必创建长期证书并将其分发到容器或使用 Amazon EC2 实例的角色。

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

在另一个 IAM 中扮演 IAM 角色 Amazon Web Services 账户

当您在Amazon Web Services 账户(账户 A)工作并想在另一个账户(账户 B)中担任角色时,必须先在账户 B 中创建 IAM 角色。此角色允许您的账户(账户 A)中的实体在账户 B 中执行特定操作。有关跨账户访问的更多信息,请参阅教程:使用 IAM 角色委派跨Amazon账户访问权限

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

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

使用具有 Web 身份的 IAM 角色

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

创建身份提供商创建用于 Web 身份验证的角色之后,请使用 Amazon 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'] ] ]);

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

使用个人资料扮演角色

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

您可以通过在中Amazon SDK for PHP定义配置文件来配置为使用 IAM 角色~/.aws/credentials

使用您想要担任的角色的role_arn设置创建新的个人资料。此外,还包括使用有权担任 IAM 角色的证书的另一个个人资料的source_profile设置。有关这些配置设置的更多详细信息,请参阅 AmazonSDK 和工具参考指南中的假定角色证书

例如,在下文中~/.aws/credentialsproject1配置文件设置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 或要代入的配置文件。

以下示例使用文件中定义的project1配置config文件和文件中的default配置credentials文件。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' ]);