为什么在运行 Amazon Linux 1 或 Amazon Linux 2 的 EC2 实例上使用 yum 时会遇到错误?

上次更新日期:2020 年 10 月 17 日

为什么在运行 Amazon Linux 1 或 Amazon Linux 2 的 Amazon Elastic Compute Cloud (Amazon EC2) 实例上使用 yum 时会遇到错误?

简短描述

使用 yum 命令的输出消息来确定到底发生了什么错误。常见的错误消息如下:

Connection timed out XXX milliseconds(连接超时 XXX 毫秒) HTTP 错误 403 – 禁止 Could not resolve host: xxxxxxxxx.$awsregion.$awsdomain(无法解析主机:xxxxxxxxx.$awsregion.$awsdomain) HTTP 错误 407 – 需要验证代理身份 解析在 5000 毫秒后超时 解决方法 连接超时 XXX 毫秒

1.验证附加到 EC2 实例的安全组是否允许出站 http/https 流量。

2.验证与 EC2 实例的子网关联的网络 ACL 是否允许通过您的 NACL 的出站 http/https 流量。

下例演示了一个允许出站流量通过端口 80 和 443 的自定义网络 ACL:

Inbound rules
Rule#    Type                    Protocol    Port Range    Source        Allow/Deny
100      Custom TCP Rule         TCP (6)     1024-65535    0.0.0.0/0     ALLOW
101      Custom TCP Rule         TCP (6)     1024-65535    ::/0          ALLOW
*        ALL Traffic             ALL         ALL           ::/0          DENY
*        ALL Traffic             ALL         ALL           0.0.0.0/0     DENY
Outbound rules
Rule #    Type                   Protocol    Port Range    Source       Allow/Deny
100       HTTP (80)              TCP (6)     80            0.0.0.0/0    ALLOW
101       HTTPS (443)            TCP (6)     443           0.0.0.0/0    ALLOW
102       HTTP (80)              TCP (6)     80            ::/0         ALLOW
103       HTTPS (443)            TCP (6)     443           ::/0         ALLOW
*         ALL Traffic            ALL         ALL           ::/0         DENY
*         ALL Traffic            ALL         ALL           0.0.0.0/0    DENY

3.使用以下任意一种方法验证您的 EC2 实例是否具有访问 Amazon Linux 存储库的权限

您的实例位于某个具有互联网网关的公有子网中。有关更多信息,请参阅启用互联网访问。 您的实例位于某个具有 NAT 网关的私有子网中。有关更多信息,请参阅 NAT 网关。 您的实例位于某个具有 NAT 实例的私有子网中。有关更多信息,请参阅 NAT 实例。 您的实例位于某个具有 S3 VPC 终端节点的公有子网或私有子网中。有关更多信息,请参阅 如何在无法访问互联网的情况下在运行 Amazon Linux 1 或 Amazon Linux 2 的 EC2 实例上更新 yum 或安装软件包? 您的实例位于某个具有代理的私有子网中。要将 yum 配置为使用代理,请使用以下参数修改 /etc/yum.conf 文件:
proxy=http://proxy-server-IP-address:proxy_port
proxy_username=proxy-user-name
proxy_password=proxy-password

注意:请将 proxy-portproxy-user-name, 和 proxy-password 替换为您的代理的相应值。

4.使用上述任意一种方法配置好实例后,运行以下 telnet 命令以确认实例可以访问存储库。在以下命令中,请将 us-east-1 替换为您的实例所在的区域。

Amazon Linux 1

telnet repo.us-east-1.amazonaws.com 80

Amazon Linux 2

telnet amazonlinux.us-east-1.amazonaws.com 80
HTTP 错误 403 – 禁止

1.如果您实例的 VPC 中使用了 S3 VPC 终端节点,则请验证附加的策略是否允许对以下资源进行 s3:GetObject API 调用:

Amazon Linux 1:

"arn:aws:s3:::packages.region.amazonaws.com/*"

"arn:aws:s3:::repo.region.amazonaws.com/*"

Amazon Linux 2:

"arn:aws:s3:::amazonlinux.region.amazonaws.com/*"

注意:请将前例中的 Region 替换为您的实例所在的区域。

2.如果您使用代理来访问 Amazon Linux 存储库,请验证子域 .amazonaws.com 是否位于代理配置中的允许列表中。

无法解析主机:xxxxxxxxx.$awsregion.$awsdomain

1.运行以下命令以验证目录 /etc/yum/vars 是否定义了自定义 yum 变量。此目录必须包含变量 awsdomainawsregion。在以下示例命令中,请将 us-east-1 替换为您的实例所在的区域。

$ cat /etc/yum/vars/awsregion
us-east-1

$ cat /etc/yum/vars/awsdomain
amazonaws.com

2.验证实例的 DNS 解析。实例必须解析 Amazon Linux 存储库的域名:

$ dig amazonlinux.us-east-1.amazonaws.com

$ dig repo.us-east-1.amazonaws.com
HTTP 错误 407 – 需要验证代理身份

如果由于 yum 没有代理服务器的相关身份验证凭证,导致您的代理无法完成请求,则会出现这种情况。要将 yum 配置为使用代理,请使用以下参数修改 /etc/yum.conf 文件:

proxy=http://proxy-server-IP-address:proxy_port
proxy_username=proxy-user-name
proxy_password=proxy-password
解析在 5000 毫秒后超时

运行以下命令以验证 /etc/resolv.conf 文件是否具有您的 DNS 服务器的正确 IP:

cat /etc/resolv.conf
nameserver YourDNSIP