本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
代入 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 实例
-
创建 IAM 客户端。
导入
require 'vendor/autoload.php'; use Aws\Iam\IamClient;
示例代码
$client = new IamClient([ 'region' => 'us-west-2', 'version' => '2010-05-08' ]);
-
创建 IAM 角色,并为其授予您将使用的操作和资源的权限。
示例代码
$result = $client->createRole([ 'AssumeRolePolicyDocument' => 'IAM JSON Policy', // REQUIRED 'Description' => 'Description of Role', 'RoleName' => 'RoleName', // REQUIRED ]);
-
创建 IAM 实例配置文件,并存储结果的 Amazon 资源名称 (ARN)。
注意
如果您使用 IAM 控制台代替 AWS SDK for PHP,则控制台会自动创建实例配置文件,并为其指定与其对应的角色相同的名称。
示例代码
$IPN = 'InstanceProfileName'; $result = $client->createInstanceProfile([ 'InstanceProfileName' => $IPN , ]); $ARN = $result['Arn']; $InstanceID = $result['InstanceProfileId'];
-
创建 Amazon EC2 客户端。
导入
require 'vendor/autoload.php'; use Aws\Ec2\Ec2Client;
示例代码
$ec2Client = new Ec2Client([ 'region' => 'us-west-2', 'version' => '2016-11-15', ]);
-
将实例配置文件添加到正在运行或已停止的 Amazon EC2 实例。使用您的 IAM 角色的实例配置文件名称。
示例代码
$result = $ec2Client->associateIamInstanceProfile([ 'IamInstanceProfile' => [ 'Arn' => $ARN, 'Name' => $IPN, ], 'InstanceId' => $InstanceID ]);
有关更多信息,请参阅《Amazon EC2 用户指南》中的适用于 Amazon EC2 的 IAM 角色。
使用 Amazon ECS 任务的 IAM 角色
亚马逊弹性容器服务 (Amazon ECS) 中的任务可以扮演 IAM 角色来调 AWS 用 API。这是管理供应用程序使用的凭证的策略,与 Amazon EC2 实例配置文件为 Amazon EC2 实例提供凭证的方式相似。
您可以将使用临时 AWS 证书的 IAM 角色与 ECS 任务定义或 RunTask
API 操作相关联,而不必为容器创建和分配长期证书,也无需使用 Amazon EC2 实例的角色。
有关使用容器任务可以代入的 IAM 角色的更多信息,请参阅 Amazon ECS 开发人员指南中的任务 IAM 角色主题。有关在任务定义中以 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 角色或 AWS SDK for PHP API 参考AssumeRole中。
使用具备 Web 身份的 IAM 角色
Web 联合身份验证允许客户在访问 AWS 资源时使用第三方身份提供商进行身份验证。在您代入具备 Web 身份的角色之前,您必须先创建一个 IAM 角色并配置 Web 身份提供商 (IdP)。有关更多信息,请参阅 创建用于 Web 联合身份验证或 OpenID Connect 联合身份验证的角色(控制台)。
创建身份提供商并为您的 Web 身份创建角色后,使用 AWS 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'] ] ]);
有关更多信息,请参阅 “通过基于 Web 的身份提供商进行AssumeRoleWithWebIdentity联合” 或 AssumeRoleWithWebIdentity“ AWS SDK for PHP API 参考”。
代入角色与配置文件
在 ~/.aws/credentials
中定义配置文件
您可以通过在中定义配置文件 AWS SDK for PHP 来将配置为使用 IAM 角色~/.aws/credentials
。
使用将代入的角色的 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' ]);