亚马逊EC2实例无法更新或使用yum

75

我正在使用亚马逊的教程来安装LAMP服务器(链接)。前几个步骤涉及使用yum,但是每一种尝试都会出现同样的信息提示。我在其他一些关于这个问题的最近问题中发现了一些内容,但是它们对我的设置都没有做出任何改变。

以下为该信息提示:

Loaded plugins: priorities, update-motd, upgrade-helper
Could not retrieve mirrorlist http://repo.us-east-1.amazonaws.com/latest/main/mirror.list error was
12: Timeout on http://repo.us-east-1.amazonaws.com/latest/main/mirror.list: (28, 'Connection timed out after 10001 milliseconds')


One of the configured repositories failed (Unknown),
and yum doesn't have enough cached data to continue. At this point the only
safe thing yum can do is fail. There are a few ways to work "fix" this:

 1. Contact the upstream for the repository and get them to fix the problem.

 2. Reconfigure the baseurl/etc. for the repository, to point to a working
    upstream. This is most often useful if you are using a newer
    distribution release than is supported by the repository (and the
    packages for the previous distribution release still work).

 3. Disable the repository, so yum won't use it by default. Yum will then
    just ignore the repository until you permanently enable it again or use
    --enablerepo for temporary usage:

        yum-config-manager --disable <repoid>

 4. Configure the failing repository to be skipped, if it is unavailable.
    Note that yum will try to contact the repo. when it runs most commands,
    so will have to try and fail each time (and thus. yum will be be much
    slower). If it is a very temporary problem though, this is often a nice
    compromise:

        yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true

 Cannot find a valid baseurl for repo: amzn-main/latest

我之前曾经用相同的教程完成了相同的事情,而且没有遇到任何问题,但是那是几个月前的事了。我不知道发生了什么变化,但是由于我的经验有限,我无法弄清楚问题所在。


你尝试过运行 yum clean all 命令吗? - radtek
我遇到了类似(相同?)的问题;我在工作中使用代理。添加 HTTP 和 DNS(UPD 和 TCP)的出站规则解决了这个问题。 - Jubbles
如果您在VPC上有S3端点,则可能会阻止yum。请看下面的答案来解决此问题。 - phill.tomlinson
截至2017年4月12日,这种行为是EC2初始化中已知的问题。AWS支持建议在运行yum命令之前进行“sleep 60”。 - GraduateOfAcmeU
1
AcmeU的毕业生,你能解释一下"sleep 60"是什么意思吗? - Adi
4
据我所知,AWS 不喜欢它的客户。 - Randy L
28个回答

73

看起来主机与yum服务器的通信出了问题。请确保实例具有出站互联网访问权限(检查安全组等)。如果实例位于VPC中且安全组看起来良好,则您可能需要使用NAT设备或附加弹性IP。

祝好运-


4
在创建实例时,我取消了“自动分配公共 IP 地址给您的实例”的选项。 - munna_1
2
除了Chadneal的回答之外,如果您创建了自定义/新的安全组,请检查并配置实例的出站流量。 - Rites
1
检查您的iptables规则是否可能导致问题。 - JasonPlutext
2
没有出站互联网访问 - Kishor Pawar
尽管启用了所有出站IP,但这并不能解决我的问题。我收到以下错误信息:Error: Package: 1:nodejs-16.13.2-3.el7.x86_64 (epel) Requires: libuv >= 1:1.42.0 Installed: 1:libuv-1.39.0-1.amzn2.x86_64 (@amzn2-core) libuv = 1:1.39.0-1.amzn2 Available: 1:libuv-1.23.2-1.amzn2.0.2.i686 (amzn2-core) - openCivilisation
显示剩余4条评论

29
如果您在VPC上有S3端点,则会导致yum失败,因为repo文件存储在S3中。 要解决此问题,请向S3 VPC端点添加以下策略:
{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Principal": "*",
        "Action": "*",
        "Resource": [
            "arn:aws:s3:::repo.eu-west-1.amazonaws.com",
            "arn:aws:s3:::repo.eu-west-1.amazonaws.com/*"
        ]
    }
]
}

将 eu-west-1 替换为您的 S3 端点所在的相关地区代码。


将此策略添加到“VPC中的S3端点”确切地说。我实际上有一个允许所有资源、所有主体、所有操作的策略。但是,在启动实例时,仍然会超时以安装软件包。 - Evgeny
3
如何配置VPC终端以允许连接到Amazon Linux AMI存储库?请参考以下链接:https://aws.amazon.com/amazon-linux-ami/faqs/#vpc-endpoint。 - ericson.cepeda
请您简要解释或发布一个链接,说明如何编辑此策略?谢谢! - Thomas
谢谢!我挣扎了几个小时,为什么我甚至不能ping yum存储库。添加您的策略解决了这个问题。 - Jeff of Brooklyn
看起来需要允许的资源列表已经发生了变化。请查看AWS的此链接获取详细信息。在我尝试之前,我还需要允许arn:aws:s3:::amazonlinux-2-repos-us-east-1/*,才能使其正常工作。 - Chaos
显示剩余2条评论

19
很多首次使用Amazon EC2的用户都会遇到这个问题。在我的经验中,通常是由于没有在实例的安全组上设置允许的外向连接所导致的。Amazon为配置Amazon Linux实例提供的教程只提到了设置入站连接,因此很容易忘记您从未设置允许的出站连接。简单地允许HTTPHTTPS请求到任何IP地址应该可以解决问题。

我也遇到了同样的问题。我在“出站规则”中添加了对任何IP地址的HTTPHTTPS请求。然后我重新启动了实例,但是仍然出现了相同的错误。您可以在此处查看我的问题:https://dev59.com/VFwY5IYBdhLWcg3wAjw9 - Ajay Kulkarni
2
请纠正我,但在AWS中,安全组是有状态的,这意味着设置入站流量时,出站流量也会执行相同的操作。不过,如果您将其绑定到单个IP地址,则可能无法在出站模式下工作,对吗? - AspiretoCode
3
默认情况下,安全组允许所有出站流量。 - jarmod
2
默认情况下,有一个传出安全组允许所有流量,但如果您自己构建一个新的安全组,例如使用Terraform,除非您明确添加它,否则该默认设置将不会存在。 - CyclingDave
1
@CyclingDave 很有趣,这似乎是 Terraform 特有的功能。当您从任何一个 AWS 控制台、awscli、SDK(我使用的是 boto3)或 CloudFormation 创建一个新的(VPC)安全组时,它会自动填充一个出站规则,允许所有流量、所有协议,到 0.0.0.0/0。 - jarmod
显示剩余3条评论

10

如果您在所在的子网上使用NACL。


快速修复

您将需要打开入站短暂端口以进行此yum update

例如,在下面添加#100 入站规则:

enter image description here

请注意,即使“出站”规则允许所有流量通过,这仍然是必要的。

enter image description here

为什么我们必须这样做?
1. 当yum在像80/443这样的端口上打开出站连接时,它会返回到一个随机的高端口(临时端口)。 2. 网络ACL是无状态的(不像安全组),默认情况下不允许在同一端口上返回连接。

你可以在这里阅读更多。


谢谢!这就是我的问题,我花了很长时间检查和重新检查HTTP/HTTPS连接,结果发现问题竟然是临时端口。 - RichardPBerry

9

我也遇到了同样的问题,与名称解析有关。我使用以下方法进行了更正:

EC2实例没有公共DNS

这是Mat提供的良好解释:

  • 进入console.aws.amazon.com
  • 进入服务 -> VPC
  • 打开您的VPCs
  • 选择连接到您的EC2的您的VPC
  • 编辑概述 ---> 将DNS主机名更改为YES

4

检查您的出站条目是否已从分配的安全组中删除/修改。通常,出站条目设置为“所有流量”并允许任何IP。

在我的情况下,出站被删除了。我再次设置为“所有流量”,它就可以正常工作。


4

我也碰到了同样的问题,解决方法是在 NAT 实例安全组中允许 HTTPS 协议 443 端口入站流量。大部分仓库都使用 HTTPS 协议。请确认您没有遗漏此设置。


2
对我来说也是一样的。我正在跟随acloud.guru的解决方案架构师课程。在这个系列中,他们很少允许入站HTTPS,而且一开始我无法理解为什么我的实例表现与他们不同。我相信该课程是在2019年录制的,那时许多存储库已经更新到了HTTPS协议。 - Ole August Støle

3

只需分配默认安全组和您可能创建的安全组即可解决我的问题。 ;)


完成工作后,请不要忘记删除默认安全组。 - emert117

2

我曾经遇到过同样的问题,结果发现另一个系统管理员决定通过代理路由出站互联网流量。我通过注意到一些奇怪的代理环境设置来发现这个问题,深入挖掘后,在我的/etc/yum.conf文件中发现了一条记录。

注释掉proxy=行,一切恢复正常。

[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
#proxy=http://pos-proxy-in-my-way-of-doing-actual-real-work:666

1
我在使用yum时遇到了与问题描述中完全相同的错误消息。 在我的情况下,我有一个NACL,允许所有出站流量,但将入站流量限制为HTTP / HTTPS,SSH和所有ICMP。 由于NACL是无状态的,尝试运行yum会失败,因为未明确允许yum使用的传入短暂连接被拒绝。

是的,这个实例中的yum会通过端口443发送出站请求,从实例经过SSG、nACL、互联网网关并流向网络。来自网络的yum服务器通过临时端口回复,这意味着入站流量从网络进入VPC,在1024到65535之间的某个位置,然后通过ig、nACL和sg返回。 - Tony Fraser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接