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' 选项传递给客户端构造函数。这允许改SDK用缓存的实例配置文件凭证。有关详细信息,请参阅 AWS SDK for PHP 版本 3 的配置

有关使用开发亚马逊EC2应用程序的更多信息SDKs,请参阅AWS SDKs和工具参考指南中的为亚马逊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. 创建亚马逊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 ]);

有关更多信息,请参阅亚马逊EC2用户指南EC2中的亚马逊IAM角色

使用IAM角色完成 Amazon ECS 任务

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

您可以将使用临时 AWS 证书的角色与ECS任务定义或RunTaskAPI操作关联起来,而不必为容器创建和分配长期证书,也无需使用 Amazon EC2 实例的IAM角色。

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

在另一个IAM角色中扮演角色 AWS 账户

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

在账户 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角色AssumeRole AWS SDK for PHP API参考资料。

使用具有 Web 身份的IAM角色

Web 联合身份验证允许客户在访问 AWS 资源时使用第三方身份提供商进行身份验证。必须先创建角色并配置 Web 身份提供商 (IdP),然后才能使用网络身份代入IAM角色。有关更多信息,请参阅 创建用于 Web 联合身份验证或 OpenID Connect 联合身份验证的角色(控制台)

创建身份提供商为您的 Web 身份创建角色后,使用 AWS STS 客户端对用户进行身份验证。 ProviderId 为你的身份提供和,ARN为具有用户权限的IAM角色提供角色。 webIdentityToken

示例代码

$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联合” 或 AssumeRoleWithWebIdentity“ AWS SDK for PHP API参考资料”。

代入角色与配置文件

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

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

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

例如,在下面的 ~/.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,f SDK or 将从文件中PHP加载配置config文件。设置后AWS_SDK_LOAD_NONDEFAULT_CONFIG,将从~/.aws/config和SDK加载配置文件~/.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' ]);