

# 排查 IAM 和 Amazon EC2 问题
<a name="troubleshoot_iam-ec2"></a>

以下信息可帮助您排查与 Amazon EC2 相关的 IAM 问题。

**Topics**
+ [当尝试启动实例时，我没有在 Amazon EC2 控制台的 **IAM 角色**列表中看到该角色](#troubleshoot_iam-ec2_missingrole)
+ [我的实例的凭证适用于错误的角色](#troubleshoot_iam-ec2_wrongrole)
+ [当时尝试调用 `AddRoleToInstanceProfile` 时，发生 `AccessDenied` 错误](#troubleshoot_iam-ec2_access-denied-adding-role)
+ [Amazon EC2：在我尝试使用角色启动实例时，出现 `AccessDenied` 错误](#troubleshoot_iam-ec2_access-denied-launch)
+ [我无法访问我的 EC2 实例的临时安全凭证](#troubleshoot_iam-ec2_no-keys)
+ [IAM 树形子目录中 `info` 文档的错误意味着什么？](#troubleshoot_iam-ec2_errors-info-doc)

## 当尝试启动实例时，我没有在 Amazon EC2 控制台的 **IAM 角色**列表中看到该角色
<a name="troubleshoot_iam-ec2_missingrole"></a>

请检查以下事项：
+ 如果您以 IAM 用户身份登录，请验证您是否有调用 `ListInstanceProfiles` 的权限。有关使用角色所需权限的信息，请参阅 [在 Amazon EC2 中使用角色所需的权限](id_roles_use_switch-role-ec2.md#roles-usingrole-ec2instance-permissions)。有关为用户添加权限的信息，请参阅 [管理 IAM 策略](access_policies_manage.md)。

  如果您无法修改自己的权限，您必须联系可以使用 IAM 的管理员来更新您的权限。
+ 如果您使用 IAM CLI 或 API 创建角色，则请验证以下内容：
  + 您已创建实例配置文件，并将角色添加到该实例配置文件。
  + 您对角色和实例配置文件使用相同的名称。如果角色和实例配置文件的名称不同，则无法在 Amazon EC2 控制台中看到正确的角色名称。

  Amazon EC2 控制台的 **IAM 角色**列表列明了实例配置文件的名称，而不是角色名称。您必须选择包含所需角色的实例配置文件的名称。有关实例配置文件的详细信息，请参阅 [使用实例配置文件](id_roles_use_switch-role-ec2_instance-profiles.md)。
**注意**  
如果您使用 IAM 控制台创建角色，则不需要使用实例配置文件。对于您在 IAM 控制台中创建的每个角色，使用与角色相同的名称创建实例配置文件，而且角色将自动添加到实例配置文件。一个实例配置文件只能包含一个 IAM 角色，不能提高该限制。

## 我的实例的凭证适用于错误的角色
<a name="troubleshoot_iam-ec2_wrongrole"></a>

最近可能替换了实例配置文件中的角色。如果是，您的应用程序需要等待下一次自动计划的凭证轮换，然后才能使用您的角色的凭证。

要强制进行更改，您必须[取消关联实例配置文件](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIamInstanceProfile.html)，然后再次[关联实例配置文件](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIamInstanceProfile.html)；您也可以停止并重新启动实例。

## 当时尝试调用 `AddRoleToInstanceProfile` 时，发生 `AccessDenied` 错误
<a name="troubleshoot_iam-ec2_access-denied-adding-role"></a>

如果您以 IAM 用户身份发出请求，请验证您拥有以下权限：
+ `iam:AddRoleToInstanceProfile` 对匹配实例配置文件 ARN (例如 `arn:aws:iam::999999999999:instance-profile/ExampleInstanceProfile`) 的资源执行操作的权限。

有关使用角色所需权限的更多信息，请参阅 [怎样入门？](id_roles_use_switch-role-ec2.md#roles-usingrole-ec2instance-get-started)。有关为用户添加权限的信息，请参阅 [管理 IAM 策略](access_policies_manage.md)。

## Amazon EC2：在我尝试使用角色启动实例时，出现 `AccessDenied` 错误
<a name="troubleshoot_iam-ec2_access-denied-launch"></a>

请检查以下事项：
+ 发布不包含实例配置文件的实例。这样做可以帮助您确认问题的范围在 Amazon EC2 实例的 IAM 角色中。
+ 如果您以 IAM 用户身份发出请求，请验证您拥有以下权限：
  + 对通配符资源 ("\$1") 执行 `ec2:RunInstances` 操作的许可
  + `iam:PassRole` 对匹配角色 ARN (例如 `arn:aws:iam::999999999999:role/ExampleRoleName`) 的资源执行操作的权限。
+ 调用 IAM `GetInstanceProfile` 操作，确认您正使用有效的实例配置文件名称或有效的实例配置文件 ARN。有关更多信息，请参见[通过 Amazon EC2 实例使用 IAM 角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UsingIAM.html#UsingIAMrolesWithAmazonEC2Instances)。
+ 调用 IAM `GetInstanceProfile` 操作，确认实例配置文件中包含角色。空的实例配置文件将发生 `AccessDenied` 错误，运行失败。有关创建角色的更多信息，请参阅 [IAM 角色创建](id_roles_create.md)。

有关使用角色所需权限的更多信息，请参阅 [怎样入门？](id_roles_use_switch-role-ec2.md#roles-usingrole-ec2instance-get-started)。有关为用户添加权限的信息，请参阅 [管理 IAM 策略](access_policies_manage.md)。

## 我无法访问我的 EC2 实例的临时安全凭证
<a name="troubleshoot_iam-ec2_no-keys"></a>

要访问 EC2 实例上的临时安全凭证，您必须首先使用 IAM 控制台创建角色。然后，您使用该角色启动 EC2 实例并检查运行中的实例。有关更多信息，请参阅 [使用 IAM 角色向在 Amazon EC2 实例上运行的应用程序授予权限](id_roles_use_switch-role-ec2.md) 中的**怎样入门？**。

如果您仍然无法访问 EC2 实例上的临时安全凭证，请检查以下内容：
+ 您能否访问实例元数据服务 (IMDS) 的其他部分？ 如果不能，请检查确认没有阻止向 IMDS 发送请求的防火墙规则。

  ```
  [ec2-user@domU-12-31-39-0A-8D-DE ~]$ GET http://169.254.169.254/latest/meta-data/hostname; echo
  ```
+ 是否存在 IMDS 的 `iam` 子树？ 如果不存在，请调用 EC2 `DescribeInstances` API 操作或者使用 `aws ec2 describe-instances` CLI 命令，验证您的实例是否具有与其关联的 IAM 实例配置文件。

  ```
  [ec2-user@domU-12-31-39-0A-8D-DE ~]$ GET http://169.254.169.254/latest/meta-data/iam; echo
  ```
+ 检查 IAM 子树中的 `info` 文档是否指示发生错误。如果发生错误，请参阅 [IAM 树形子目录中 `info` 文档的错误意味着什么？](#troubleshoot_iam-ec2_errors-info-doc) 来了解更多信息。

  ```
  [ec2-user@domU-12-31-39-0A-8D-DE ~]$ GET http://169.254.169.254/latest/meta-data/iam/info; echo
  ```

## IAM 树形子目录中 `info` 文档的错误意味着什么？
<a name="troubleshoot_iam-ec2_errors-info-doc"></a>

### `iam/info` 文档指示 `"Code":"InstanceProfileNotFound"`
<a name="troubleshoot_iam-ec2_errors-info-doc-profile-not-found"></a>

您的 IAM 实例配置文件已经被删除，Amazon EC2 无法再为您的实例继续提供凭证。您必须将有效的实例配置文件附加到您的 Amazon EC2 实例。

如果存在具有该名称的实例配置文件，请检查是该实例配置文件没有被删除还是以相同名称创建了另一个配置文件：

1. 调用 IAM `GetInstanceProfile` 操作，获取 `InstanceProfileId`。

1. 调用 Amazon EC2 `DescribeInstances` 操作，获取实例的 `IamInstanceProfileId`。

1. 验证 IAM 操作的 `InstanceProfileId` 与 Amazon EC2 操作的 `IamInstanceProfileId` 是否匹配。

如果两个 ID 不同，那么附加至实例的实例配置文件将失去效力。您必须将有效的实例配置文件附加到该实例。

### `iam/info` 文档指示成功，但指示 `"Message":"Instance Profile does not contain a role..."`。
<a name="troubleshoot_iam-ec2_errors-info-doc-no-role"></a>

这意味着已经通过 IAM `RemoveRoleFromInstanceProfile` 操作从实例配置文件删除了该角色。您可以使用 IAM `AddRoleToInstanceProfile` 操作为实例配置文件附加一个角色。您的应用程序需要等到下一次更新才能获得适用于该角色的凭证。

要强制进行更改，您必须[取消关联实例配置文件](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIamInstanceProfile.html)，然后再次[关联实例配置文件](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIamInstanceProfile.html)；您也可以停止并重新启动实例。

### `iam/security-credentials/[role-name]` 文档指示 `"Code":"AssumeRoleUnauthorizedAccess"`
<a name="troubleshoot_iam-ec2_errors-info-doc-unauthorized-access"></a>

Amazon EC2 没有担任角色的许可。担任该角色的权限受制于该角色附属的信任策略，如下例所示。请使用 IAM `UpdateAssumeRolePolicy` API 更新信任策略。

------
#### [ JSON ]

****  

```
{"Version":"2012-10-17",		 	 	 "Statement": [{"Effect": "Allow","Principal": {"Service": ["ec2.amazonaws.com"]},"Action": ["sts:AssumeRole"]}]}
```

------

您的应用程序需要等到下一次自动更新才能获得适用于该角色的凭证。

要强制进行更改，您必须[取消关联实例配置文件](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIamInstanceProfile.html)，然后再次[关联实例配置文件](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIamInstanceProfile.html)；您也可以停止并重新启动实例。