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

3 分钟阅读
0

我在运行 Amazon Linux 1、Amazon Linux 2 或 Amazon Linux 2023 的 Amazon Elastic Compute Cloud (Amazon EC2) 实例上使用 yum 时收到错误。

简短描述

要确定发生的错误,请使用 yum 命令的输出消息。您可能会收到以下常见错误消息之一:

  • “连接超时 ABCD 毫秒”
  • “HTTP 错误 403 - 禁止访问”
  • “无法解析主机:abcdexyz.$awsregion.$awsdomain”
  • “HTTP 错误 407 - 需要代理身份验证”
  • “5000 毫秒后解析超时”

解决方法

连接超时 ABCD 毫秒

要解决此问题,请验证连接到您的实例的安全组是否允许出站 HTTP 或 HTTPS 流量。另请验证与您的实例子网关联的网络访问控制列表(网络 ACL)是否允许出站 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

要访问 Amazon Linux 存储库,您的实例必须根据您的配置使用以下互联网访问设置之一:

  • 对于公有子网中的实例,使用互联网网关
  • 对于私有子网中的实例,使用 NAT 网关NAT 实例
  • 对于公有或私有子网中的实例,使用 Amazon Simple Storage Service (Amazon S3) 虚拟私有云 (VPC) 端点
  • 对于带有代理的私有子网中的实例,在配置文件中添加以下参数以将 yum 配置为使用代理:
    proxy=http://proxy-server-IP-address:proxy_port
    proxy_username=proxy-user-name
    proxy_password=proxy-password
    **注意:**如果您已配置代理并且使用了相同的配置文件,则代理密码将在文件中以纯文本形式显示。将 proxy-port 替换为代理使用的端口,将 proxy-user-name 替换为您的代理用户名,将 proxy-password 替换为您的代理密码。有关详细信息,请参阅 Fedora Project 网站上的将 yum 与代理服务器结合使用。对于 Amazon Linux 1 和 Amazon Linux 2,修改 /etc/yum.conf 文件。对于 Amazon Linux 2023,修改 /etc/dnf/dnf.conf 文件。

配置实例后,运行以下 curl 命令以确保该实例可以访问存储库。

Amazon Linux 2023:

curl -I al2023-repos-us-east-1-de612dc2.s3.dualstack.us-east-1.amazonaws.com

Amazon Linux 1:

curl -I repo.us-east-1.amazonaws.com

Amazon Linux 2:

curl -I amazonlinux.us-east-1.amazonaws.com

**注意:**在前面的命令中,将 us-east-1 替换为您的实例的 AWS 区域。

curl 命令预安装在所有亚马逊机器映像 (AMI) 中。但是,没有凭证就无法访问 Amazon Linux 存储库,而且 curl 命令无法获取 yum 存储库的凭证。当运行 curl 命令时,您会收到一条访问被拒绝的错误消息,类似于以下示例:

$ curl -I amazonlinux.us-east-1.amazonaws.com
HTTP/1.1 403 Forbidden
x-amz-bucket-region: us-east-1
x-amz-request-id: xxxxxxxx
x-amz-id-2: xxxxxxxxxxxxx=
Content-Type: application/xml
Date: Thu, 17 Nov 2022 16:59:59 GMT
Server: AmazonS3

使用 curl 命令测试超时问题是否仍在发生。示例错误消息显示可以访问网络并且不再发生超时问题,

HTTP 错误 403 - 禁止访问

使用 VPC 端点

如果您使用 Amazon S3 VPC 端点,请确保附加的策略允许根据您的 Linux 版本进行 s3:GetObject API 调用。

Amazon Linux 2023:arn:aws:s3:::al2023-repos-region-de612dc2/*

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/arn:aws:s3:::amazonlinux-2-repos-region/

**注意:**在前面的资源中,将 region 替换为您的实例的区域。

有关详细信息,请参阅 Amazon S3 的网关端点

使用代理

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

您使用的是不支持的存储库

您可能会收到以下错误: “错误: 无法下载存储库‘amazonlinux’的元数据: GPG 验证已激活,但 GPG 签名不可用。这可能是错误或者存储库不支持 GPG 验证”。这是一个已知问题,当您在 /etc/yum.repos.d/ 目录下的存储库文件(例如 repository.repo 文件或 /etc/yum.conf)中激活 repo_gpgcheck 时,就会发生这种问题。Amazon Linux 2023 存储库未激活元数据签名。此外,如果您将此配置用于不支持的存储库,则软件包安装或操作系统 (OS) 更新可能会失败。解决方法是打开存储库 repo 文件并将该存储库的 repo_gpgcheck 的值设置为 0。例如,将该值设置为 repo_gpgcheck=0

有关这种情况的详细信息,请参阅 GitHub 网站上的 [Bug] - not able to install/upgrade packages after activating repo_gpgcheck

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

/etc/yum/vars 目录必须包含 awsdomainawsregion 变量。要验证 /etc/yum/vars 目录是否定义了自定义 yum 变量,请运行以下命令:

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

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

**注意:**将 us-east-1 替换为您的实例的区域。

该实例必须解析 Amazon Linux 存储库的域名。要验证您的实例的 DNS 解析,请运行以下命令:

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

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

$ dig al2023-repos-us-east-1-de612dc2

**注意:**将 us-east-1 替换为您的实例的区域。

请注意,通过 169.254.169.253 IPv4 地址和 fd00:ec2::253 IPv6 地址向 Amazon 提供的 DNS 服务器发出的查询成功。通过 VPC IPv4 网络范围基址 + 2 的预留 IP 地址向 Amazon 提供的 DNS 服务器发出的查询也成功。IPv6 地址只能在基于 Nitro 的 EC2 实例上访问。

HTTP 错误 407 - 需要代理身份验证

如果您的代理由于 yum 或 dnf 没有代理服务器的正确身份验证凭证而无法完成请求,就会出现这种问题。要将 yum 或 dnf 配置为使用代理,请使用以下参数修改配置文件:

proxy=http://proxy-server-IP-address:proxy_port
proxy_username=proxy-user-name
proxy_password=proxy-password

**注意:**如果您已配置代理并且使用了相同的配置文件,则代理密码将在文件中以纯文本形式显示。将 proxy-port 替换为代理使用的端口,将 proxy-user-name 替换为您的代理用户名,将 proxy-password 替换为您的代理密码。对于 Amazon Linux 1 和 Amazon Linux 2,修改 /etc/yum.conf 文件。对于 Amazon Linux 2023,修改 /etc/dnf/dnf.conf 文件。

超时问题

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

cat /etc/resolv.conf
nameserver YourDNSIP

要修改 5000 毫秒的默认超时时间,请修改 yum 配置文件中的 timeout 值。有关详细信息,请参阅 die.net 网站上的 yum.conf。对于 Amazon Linux 2023,请更改 /etc/yum.repos.d/amazonlinux.repo 中的 metadata_expire 值以修改超时时间。

要使用 dig 命令检查查询时间,请运行以下命令:

$ dig repo.us-east-1.amazonaws.com | grep time

**注意:**将 us-east-1 替换为您的实例的区域。

AWS 官方
AWS 官方已更新 1 个月前