我的 AWS Identity and Access Management (IAM) 实体拥有对 Amazon Elastic Compute Cloud (Amazon EC2) 实例的权限。我尝试启动该实例,但它从 Pending(待处理)状态更改为 Stopped(已停止)。
解决方法
确定您的 EC2 实例处于 Stopped(已停止)状态的原因
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
如果您将 Amazon Elastic Block Store (Amazon EBS) 卷连接到 EC2 实例,请检查卷加密。如果您使用 AWS Key Management Service (AWS KMS) 密钥对 EBS 卷进行加密,则可能存在权限问题。调用 StartInstances API 操作的 IAM 主体必须拥有 kms:CreateGrant 权限才能为 Amazon EC2 创建授权。该授权允许 Amazon EC2 使用您的 AWS KMS 密钥解密卷的数据密钥。
EBS 卷向 AWS KMS 发送 GenerateDataKeyWithoutPlaintext API 调用,该调用会创建新的数据密钥并在 AWS KMS 密钥中对其进行加密。AWS KMS 将加密的数据密钥发送到 EBS 卷。然后,该卷将数据密钥附加到实例。数据密钥与实例和 AWS KMS 密钥存在于同一 AWS 账户中。
要确定实例处于 Stopped(已停止)状态的原因,请运行 describe-instances AWS CLI 命令:
aws ec2 describe-instances --instance-id your-instance-id --query "Reservations[*].Instances[*].StateReason"
**注意:**将 your-instance-id 替换为您的实例 ID。
输出示例:
[
[
{
"Message": "Client.InternalError: Client error on launch",
"Code": "Client.InternalError"
}
]
]
前面的错误可能意味着您加密了根卷或其他附加卷。您无权访问 AWS KMS 密钥进行解密。
您还可以筛选 AWS CloudTrail 事件中的事件名称 CreateGrant。
输出示例:
"errorMessage": "User: arn:aws:iam::123456789012:user/test is not authorized to perform: kms:CreateGrant on resource: arn:aws:kms:eu-west-1:123456789012:key/8e3426b8-87b4-434c-ae74-8e63dadf354a"
前面的错误意味着 IAM 主体没有允许 Amazon EC2 解密数据密钥的 CreateGrant 权限。因此,该实例无法启动。
**注意:**如果您使用 AWS 托管式密钥,则仅当主体的 IAM 策略或服务控制策略 (SCP) 中存在显式拒绝时,才会出现此错误。AWS 托管式密钥不需要额外的 IAM 权限即可使用。
查找 AWS KMS 密钥类型
完成以下步骤:
- 打开 Amazon EC2 控制台。
- 在导航窗格中,选择 Instances(实例)。
- 选择实例 ID,然后选择 Storage(存储)。
- 对于 Volume ID(卷 ID),选择加密卷的卷 ID。
- 对于 KMS key ID(KMS 密钥 ID),复制 AWS KMS 密钥 ID。
- 在同一 AWS 区域中打开 AWS KMS 控制台。
- 在导航窗格中,选择 Customer managed keys(客户自主管理型密钥)。然后,搜索步骤 4 中的 AWS KMS 密钥 ID。
- 选择 AWS KMS 密钥 ID。
- 在 Description(描述)下的 General configuration(常规配置)中,记下 AWS KMS 密钥类型。
附加 IAM 策略
将 IAM 策略附加到 IAM 主体,类似于以下示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kms:CreateGrant"
],
"Resource": [
"arn:aws:kms:region:123456789012:key/ExampleKey"
],
"Condition": {
"Bool": {
"kms:GrantIsForAWSResource": true
}
}
}
]
}
kms:GrantIsForAWSResource 条件键确保 IAM 主体仅使用 AWS 资源为 AWS KMS 密钥创建授权。此策略不允许 IAM 主体为另一个 IAM 主体创建授权。要限制对 Amazon EC2 的访问,请使用 kms:ViaService 条件键。
您必须激活通过账户密钥策略添加到 IAM 主体的 IAM 权限,如以下示例所示:
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::123456789012:root"},
"Action": "kms:*",
"Resource": "*"
}
您还可以在密钥策略中添加 IAM 主体,以允许 CreateGrant API 操作。
如果您的 AWS KMS 密钥和 IAM 主体在同一个账户中,则可以在密钥策略中明确包含您的主体。您不需要 IAM 权限即可访问 AWS KMS 密钥。
要通过密钥策略授予显式权限,请在密钥策略中添加以下语句:
{
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/Role_Name"
},
"Effect": "Allow",
"Action": [
"kms:CreateGrant"
],
"Resource": [
"*"
],
"Condition": {
"Bool": {
"kms:GrantIsForAWSResource": true
}
}
}
最佳做法是为执行任务所需的权限授予最低权限。
如果您使用 Amazon EC2 Auto Scaling 组来创建实例,请参阅用于加密卷的必需 AWS KMS 密钥策略。
相关信息
Amazon EBS 加密
实例立即终止