如何使用 AWS CLI 代入 IAM 角色?
我想使用 AWS 命令行界面(AWS CLI)代入 AWS Identity and Access Management(AWS IAM)角色。
解决方法
要使用 AWS CLI 代入 IAM 角色并拥有对 Amazon Elastic Compute Cloud(Amazon EC2)实例的只读访问权限,请执行以下操作:
**注意:**如果在执行 AWS CLI 命令时收到错误,请确认您运行的是最新版本的 AWS CLI。
重要信息: 执行命令时,以下步骤会以纯文本形式显示您的凭证(例如密码)。在您代入 IAM 角色后,最佳做法是更改密码。
创建有权代入角色的 IAM 用户
- 借助以下命令,使用 AWS CLI 创建 IAM 用户:
**注意:**将 Bob 替换为您的 IAM 用户名。
aws iam create-user --user-name Bob
- 使用 AWS CLI 创建能够向 Bob 授予权限的 IAM 策略。使用您最喜欢的文本编辑器创建定义 IAM 策略的 JSON 文件。例如,您可以使用在 Linux 中常用的文本编辑器 vim,如下所示:
**注意:**将 example 替换为您自己的策略名称、用户名、角色、JSON 文件名、配置文件名和密钥。
vim example-policy.json
- example-policy.json 文件的内容类似于:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:Describe*", "iam:ListRoles", "sts:AssumeRole" ], "Resource": "*" } ] }
有关创建 IAM 策略的更多信息,请参阅创建 IAM 策略、基于身份的 IAM 策略示例和 IAM JSON 策略参考。
创建 IAM 策略
- 使用以下 aws iam create-policy 命令:
aws iam create-policy --policy-name example-policy --policy-document file://example-policy.json
aws iam create-policy 命令会输出几条信息,包括 IAM 策略的 ARN(Amazon 资源名称),如下所示:
arn:aws:iam::123456789012:policy/example-policy
**注意:**用您自己的账户替换 123456789012。
- 记下输出中的 IAM 策略的 ARN,并使用 attach-user-policy 命令将策略附加到 Bob。然后,使用 list-attached-user-policies 命令检查附加是否到位,如下所示:
aws iam attach-user-policy --user-name Bob --policy-arn "arn:aws:iam::123456789012:policy/example-policy" aws iam list-attached-user-policies --user-name Bob
创建 JSON 文件来定义 IAM 角色的信任关系
- 创建可定义信任关系的 JSON 文件,如下所示:
vim example-role-trust-policy.json
- example-role-trust-policy.json 文件的内容类似于:
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "123456789012" }, "Action": "sts:AssumeRole" } }
借助此信任策略,如果账户 123456789012 的用户和角色允许在其权限策略中执行 sts:AssumeRole 操作,则可以代入此角色。您还可以限制信任关系,这样 IAM 角色便只能由特定的 IAM 用户代入。您可以通过指定类似于 arn:aws:iam::123456789012:user/example-username的主体来完成此操作。有关详细信息,请参阅 AWS JSON 策略要素: 主体。
创建 IAM 角色并附加策略
创建一个 IAM 角色,该角色可由 Bob 代入并对 Amazon Relational Database Service(Amazon RDS)实例具有只读访问权限。由于 IAM 角色由 IAM 用户代入,因此您必须指定一个主体,让此主体允许 IAM 用户代入该角色。例如,类似于 arn:aws:iam::123456789012:root 的主体允许账户的所有 IAM 身份代入该角色。有关更多信息,请参阅创建角色以向 IAM 用户委派权限。
- 创建对 Amazon RDS 数据库实例具有只读访问权限的 IAM 角色。根据您的安全要求将 IAM 策略附加到您的 IAM 角色。
aws iam create-role 命令根据您在上一节中创建的 JSON 文件创建 IAM 角色并定义信任关系。aws iam attach-role-policy 命令将 AWS 托管式策略 AmazonRDSReadOnlyAccess 附加到该角色。您可以根据您的安全要求附加不同的策略(包括托管策略和自定义策略)。aws iam list-attached-role-policies 命令显示附加到 IAM 角色 example-role的 IAM 策略。请参阅以下命令示例:
aws iam create-role --role-name example-role --assume-role-policy-document file://example-role-trust-policy.json aws iam attach-role-policy --role-name example-role --policy-arn "arn:aws:iam::aws:policy/AmazonRDSReadOnlyAccess" aws iam list-attached-role-policies --role-name example-role
**注意:**验证 Bob 是否具有 EC2 实例的只读访问权限并且可以代入 example-role。
- 使用以下命令为 Bob 创建访问密钥:
aws iam create-access-key --user-name Bob
AWS CLI 命令会输出一个访问密钥 ID 和一个秘密访问密钥。请务必记下这些密钥。
配置访问密钥
- 要配置访问密钥,请使用默认配置文件或特定配置文件。要配置默认配置文件,请执行 aws configure。要创建新的特定配置文件,请执行 aws configure --profile example_-_profile-name。在此示例中,默认配置文件配置如下:
aws configure AWS Access Key ID [None]: ExampleAccessKeyID1 AWS Secret Access Key [None]: ExampleSecretKey1 Default region name [None]: eu-west-1 Default output format [None]: json
注意:对于默认区域名称,请指定您的 AWS 区域。
请先确认 AWS CLI 命令已经调用,然后再验证 IAM 用户访问权限。
- 按如下方式执行 aws sts get-caller-identity 命令:
aws sts get-caller-identity
aws sts get-caller-identity 命令会输出三条信息,其中包括 ARN。输出结果类似于 arn:aws:iam::123456789012:user/Bob,可通过此结果验证 AWS CLI 命令是否以 Bob 的身份进行了调用。
- 通过执行以下命令,确认 IAM 用户对 EC2 实例具有只读访问权限且无权访问 Amazon RDS 数据库实例:
aws ec2 describe-instances --query "Reservations[*].Instances[*].[VpcId, InstanceId, ImageId, InstanceType]" aws rds describe-db-instances --query "DBInstances[*].[DBInstanceIdentifier, DBName, DBInstanceStatus, AvailabilityZone, DBInstanceClass]"
aws ec2 describe-instances 命令应向您显示位于 eu-west-1 区域内的所有 EC2 实例。aws rds describe-db-instances 命令必须生成表示“访问被拒绝”的错误消息,因为 Bob 无权访问 Amazon RDS。
代入 IAM 角色
执行以下任一操作:
通过在 ~/.aws/config 文件中创建配置文件来使用 IAM 角色。有关更多信息,请参阅在 AWS CLI 中使用 IAM 角色。
或
通过执行以下操作来代入 IAM 角色:
- 通过执行以下命令获取角色的 ARN:
aws iam list-roles --query "Roles[?RoleName == 'example-role'].[RoleName, Arn]"
- 该命令列出了 IAM 角色,但按角色名称对输出结果进行了筛选。要代入 IAM 角色,请执行以下命令:
aws sts assume-role --role-arn "arn:aws:iam::123456789012:role/example-role" --role-session-name AWSCLI-Session
AWS CLI 命令会输出几条信息。在凭证区块中,您需要 AccessKeyId、SecretAccessKey 与 SessionToken。此示例使用环境变量 RoleAccessKeyID、RoleSecretKey 与 RoleSessionToken。请注意,过期字段的时间戳采用 UTC 时区。时间戳指示 IAM 角色的临时凭证何时到期。如果临时凭证已过期,则必须再次执行 sts:AssumeRole API 调用。
**注意:**您可以使用 DurationSeconds 参数延长 IAM 角色临时凭证的最大会话到期时间。
创建环境变量以代入 IAM 角色并验证访问权限
- 创建三个环境变量来代入 IAM 角色。这些环境变量由以下输出填充:
export AWS_ACCESS_KEY_ID=RoleAccessKeyID export AWS_SECRET_ACCESS_KEY=RoleSecretKey export AWS_SESSION_TOKEN=RoleSessionToken
**注意:**对于 Windows 系统,将此命令中的 export 替换为 set。
- 通过执行以下命令验证您是否代入了 IAM 角色:
aws sts get-caller-identity
AWS CLI 命令应将 ARN 输出为 arn:aws:sts::123456789012:assumed-role/example-role/AWSCLI-Session,而非 arn:aws:iam::123456789012:user/Bob,以此结果验证您是否代入了 example-role。
- 使用以下命令验证您已创建一个具有 Amazon RDS 数据库实例只读访问权限且无权访问 EC2 实例的 IAM 角色:
aws ec2 describe-instances --query "Reservations[*].Instances[*].[VpcId, InstanceId, ImageId, InstanceType]" aws rds describe-db-instances --query "DBInstances[*].[DBInstanceIdentifier, DBName, DBInstanceStatus, AvailabilityZone, DBInstanceClass]"
aws ec2 describe-instances 命令应生成表示“访问被拒绝”的错误消息。aws rds describe-db-instances 命令应返回 Amazon RDS 数据库实例。这将验证分配给 IAM 角色的权限是否正常运行。
- 要返回 IAM 用户,请按如下方式移除环境变量:
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN aws sts get-caller-identity
unset 命令会移除环境变量,aws sts get-caller-identity 命令则会验证您是否以 IAM 用户 Bob的身份返回。
**注意:**对于 Windows 系统,请将环境变量设置为空字符串,以清除其内容,如下所示:
SET AWS_ACCESS_KEY_ID= SET AWS_SECRET_ACCESS_KEY= SET AWS_SESSION_TOKEN=
相关信息
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前