EC2 实例无法通过 s3 网关端点访问 amazon-linux repos(例如 amazon-linux-extras install docker)

EC2 instance can't access amazon-linux repos (eg amazon-linux-extras install docker) through s3 gateway endpoint

我遇到了 s3 端点问题。当我的实例初始化时,它们无法安装 docker。详情:

我的 ASG 实例位于具有发布子网和私有子网的 VPC 中。适当的路由和 EIP/NAT 全部缝合在私有子网中的 up.Instances 有 outbooundd 0.0.0.0/0 路由到各自 public 子网中的 NAT。 public 子网的 NACL 允许互联网流量进出,私有子网周围的 NACL 允许来自 public 子网的流量进出,出入互联网的流量(以及来自 s3 cidrs 的流量进出)。我希望它完全锁定。

Amazon EC2 instance can't update or use yum

另一个 s3 分辨率问题:

https://blog.saieva.com/2020/08/17/aws-s3-endpoint-gateway-access-for-linux-2-amis-resolving-http-403-forbidden-error/

我试过:

  S3Endpoint:
Type: 'AWS::EC2::VPCEndpoint'
Properties:
  PolicyDocument:
    Version: 2012-10-17
    Statement:
      - Effect: Allow
        Principal: '*'
        Action:
          - 's3:GetObject'
        Resource: 
          - 'arn:aws:s3:::prod-ap-southeast-2-starport-layer-bucket/*'
          - 'arn:aws:s3:::packages.*.amazonaws.com/*'
          - 'arn:aws:s3:::repo.*.amazonaws.com/*'
          - 'arn:aws:s3:::amazonlinux-2-repos-ap-southeast-2.s3.ap-southeast-2.amazonaws.com/*'
          - 'arn:aws:s3:::amazonlinux.*.amazonaws.com/*'
          - 'arn:aws:s3:::*.amazonaws.com'
          - 'arn:aws:s3:::*.amazonaws.com/*'
          - 'arn:aws:s3:::*.ap-southeast-2.amazonaws.com/*'
          - 'arn:aws:s3:::*.ap-southeast-2.amazonaws.com/'
          - 'arn:aws:s3:::*repos.ap-southeast-2-.amazonaws.com'
          - 'arn:aws:s3:::*repos.ap-southeast-2.amazonaws.com/*'
          - 'arn:aws:s3:::repo.ap-southeast-2-.amazonaws.com'
          - 'arn:aws:s3:::repo.ap-southeast-2.amazonaws.com/*'
  RouteTableIds:
    - !Ref PrivateRouteTableA
    - !Ref PrivateRouteTableB   
  ServiceName: !Sub 'com.amazonaws.${AWS::Region}.s3'
  VpcId: !Ref BasicVpc
  VpcEndpointType: Gateway

(如你所见,非常绝望)ECR 接口端点需要第一条规则从 s3 拉取图像层,所有其他规则都是尝试到达 amazon-linux-extras repos .

以下是我通过使用 SSM 端点连接会话管理器重新创建的初始化时发生的行为:

https://aws.amazon.com/premiumsupport/knowledge-center/connect-s3-vpc-endpoint/

我无法安装或更新

root@ip-10-0-3-120 bin]# yum install docker -y

加载的插件:extras_suggestions、langpacks、优先级、update-motd 无法检索镜像列表 https://amazonlinux-2-repos-ap-southeast-2.s3.ap-southeast-2.amazonaws.com/2/core/latest/x86_64/mirror.list 错误是 14: HTTPS 错误 403 - 禁止

配置的存储库之一失败(未知), 并且 yum 没有足够的缓存数据来继续。此时唯一 yum 可以做的安全事情就是失败。有几种方法可以“解决”这个问题:

 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. Run the command with the repository temporarily disabled
        yum --disablerepo=<repoid> ...

 4. Disable the repository permanently, 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>
    or
        subscription-manager repos --disable=<repoid>

 5. 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

找不到有效的基础url 回购:amzn2-core/2/x86_64

不能:

amazon-linux-extras install docker

Catalog is not reachable. Try again later.

目录位于 https://amazonlinux-2-repos-ap-southeast-2.s3.ap-southeast-2.amazonaws.com/2/extras-catalog-x86_64-v2.json, https://amazonlinux-2-repos-ap-southeast-2.s3.ap-southeast-2.amazonaws.com/2/extras-catalog-x86_64.json 追溯(最近一次通话): 文件“/usr/lib/python2.7/site-packages/amazon_linux_extras/software_catalog.py”,第 131 行,在 fetch_new_catalog 中 请求 = url打开(url) 文件“/usr/lib64/python2.7/urllib2.py”,第 154 行,在 urlopen return opener.open(url, 数据, 超时) 文件“/usr/lib64/python2.7/urllib2.py”,第 435 行,打开 响应 = meth(请求,响应) 文件“/usr/lib64/python2.7/urllib2.py”,第 548 行,在 http_response 中 'http'、请求、响应、代码、消息、hdrs) 文件“/usr/lib64/python2.7/urllib2.py”,第 473 行,错误 return self._call_chain(*参数) 文件“/usr/lib64/python2.7/urllib2.py”,第 407 行,在 _call_chain 中 结果=函数(*参数) 文件“/usr/lib64/python2.7/urllib2.py”,第 556 行,在 http_error_default 中 引发 HTTPError(req.get_full_url(), code, msg, hdrs, fp) HTTPError:HTTP 错误 403:禁止

我错过了什么陷阱吗?我很困在这里。我熟悉基本的 VPC 网络、NACL 和 VPC 端点(我至少使用过的那些),我遵循了故障排除(尽管我已经按照概述进行了所有设置)。

我觉得 s3 政策是这里的问题或镜像列表。 如果您愿意阅读所有内容,非常感谢! 想法?

从它的外观来看,您很清楚自己要达到的目标。 即使你说它不是 NACL,我还是会再检查一次,因为有时人们很容易忽略一些小问题。考虑以下摘自 this AWS troubleshooting article 的代码片段,并确保您在相应区域的规则中具有正确的 S3 CIDR:

Make sure that the network ACLs associated with your EC2 instance's subnet allow the following: Egress on port 80 (HTTP) and 443 (HTTPS) to the Regional S3 service. Ingress on ephemeral TCP ports from the Regional S3 service. Ephemeral ports are 1024-65535. The Regional S3 service is the CIDR for the subnet containing your S3 interface endpoint. Or, if you're using an S3 gateway, the Regional S3 service is the public IP CIDR for the S3 service. Network ACLs don't support prefix lists. To add the S3 CIDR to your network ACL, use 0.0.0.0/0 as the S3 CIDR. You can also add the actual S3 CIDRs into the ACL. However, keep in mind that the S3 CIDRs can change at any time.

你的 S3 端点策略第一眼看起来不错,但你是对的,很可能是策略或端点配置一般是原因,所以我会再检查一次也是。

我之前观察到的另一件事是,根据您使用的 AMI 和您的 VPC 设置(DHCP 选项集、DNS 等),有时 EC2 实例无法在 yum 配置中正确设置它的默认区域。请检查 awsregionawsdomain 文件是否存在于 /etc/yum/vars 目录中,它们的内容是什么。在您的用例中,awsregion 应该具有:

$ cat /etc/yum/vars/awsregion
ap-southeast-2

您可以检查实例上的 DNS 解析是否正常工作:

dig amazonlinux.ap-southeast-2.amazonaws.com

如果 DNS 似乎工作正常,您可以比较输出中的 IP 是否位于您在 NACL 中允许的范围内。

编辑:

再看一遍,这行比应有的要严格一些: arn:aws:s3:::amazonlinux-2-repos-ap-southeast-2.s3.ap-southeast-2.amazonaws.com/*

根据文档,它应该是这样的:

arn:aws:s3:::amazonlinux-2-repos-ap-southeast-2/*

你好@nick https://whosebug.com/users/9405602/nick --> 这些是编写 'answer' 的极好的建议,因为解决问题对其他人很有价值,加上评论中的字符数限制。

肯定是政策的问题


sh-4.2$ cat /etc/yum/vars/awsregion
ap-southeast-2sh-4.2$

挖掘:


sh-4.2$ dig amazonlinux.ap-southeast-2.amazonaws.com

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> amazonlinux.ap-东南-2.amazonaws.com ;;全局选项:+cmd ;;得到答案: ;; ->>HEADER<<- 操作码:QUERY,状态:NOERROR,id:598 ;;标志:qr rd ra;查询:1,答案:2,权限:0,附加:1

;;选择伪部分: ; EDNS:版本:0,标志:; UDP:4096 ;;问题部分: ;amazonlinux.ap-东南-2.amazonaws.com。在一个

;;答案部分: amazonlinux.ap-东南-2.amazonaws.com。 278 IN CNAME s3.dualstack.ap-东南-2.amazonaws.com。 s3.dualstack.ap-东南-2.amazonaws.com。 2 在 A 52.95.134.91

;;查询时间:4 毫秒 ;;服务器:10.0.0.2#53(10.0.0.2) ;;时间:9 月 20 日星期一 00:03:36 UTC 2021 ;;接收到的消息大小:112


让我们检查一下 NACL:

NACL 出站规则描述:100 所有流量所有所有0.0.0.0/0
允许 101 所有流量 全部 全部 52.95.128.0/21
允许 150 所有流量 全部 全部 3.5.164.0/22
允许 200 所有流量 全部 全部 3.5.168.0/23
允许 250 所有流量 全部 全部 3.26.88.0/28
允许 300 所有流量 全部 全部 3.26.88.16/28
允许 所有流量 所有 所有 0.0.0.0/0
拒绝

NACL INBOUND RULES 入站规则说明:100 All tr​​affic All All 10.0.0.0/24 允许 150 所有流量 全部 全部 10.0.1.0/24 允许 200 所有流量 全部 全部 10.0.2.0/24 允许 250 所有流量 全部 全部 10.0.3.0/24 允许 400 所有流量 全部 全部 52.95.128.0/21
允许 450 所有流量 全部 全部 3.5.164.0/22
允许 500 所有流量 全部 全部 3.5.168.0/23
允许 550 所有流量 全部 全部 3.26.88.0/28
允许 600 所有流量 全部 全部 3.26.88.16/28
允许 所有流量 所有 所有 0.0.0.0/0
拒绝

SO -----> '52.95.134.91' 由规则 101 出站和 400 入站捕获,因此在 NACL 方面看起来不错。 (未来的人解决问题,这是你应该寻找的)

关于那些 CIDR 块,部署脚本从当前列表中提取它们,并使用 jq 为 ap-southeast-2 提取 s3 块,并将它们作为参数传递给 CF 部署。

关于如何为他人做到这一点的文档: https://docs.aws.amazon.com/general/latest/gr/aws-ip-ranges.html#aws-ip-download

另一个注意事项,您可能会注意到 0.0.0.0/0,我意识到(对于其他正在寻找的人请注意)这使得其他规则变得多余,我只是在 'in case' 中摆弄(并删除 -> pub 子网)。 私有子网出站流量 0.0.0.0/0 被路由到 public 个子网中的相应 NAT。我将为我的 public 子网添加出站并在某个时候删除此规则。

子网划分 atm 很简单: 10.0.0.0/16 发布一个:10.0.0.0/24 酒吧 b:10.0.1.0/24 私有:10.0.2.0/24 私人 b : 10.0.3.0/24

所以将重新引入 pub a 和 b 块的规则,以便我可以删除 0.0.0.0/0 上的允许


我现在确定这是政策。

我只是点击操作将控制台中的策略修改为 'full access' 以破解并取得成功。

我的猜测是镜像列表很难确定明确允许的内容,所以即使我撒了网,我也没有捕获到所需的桶。但我不太了解 aws 镜像的工作原理,所以这是一个猜测。

我可能不想要超级宽容的策略,所以这不是真正的修复,但它确认了问题所在。