【问题标题】:Instance in public subnet but cfn-init fails over VPC endpoint from private subnet公共子网中的实例,但 cfn-init 从私有子网故障转移 VPC 终端节点
【发布时间】:2021-01-17 15:31:53
【问题描述】:

让我们保持简单。

我有一个 3 PublicSubnet 和 3 PrivateSubnet。有一个堡垒主机,只有一个,分配给一个公共子网。私有子网(全部 3 个)与 CloudFormation VPC 端点链接。现在有趣的是,当我启动堡垒堆栈并尝试通过 cfn-init 做一些事情时,它只是失败了。它尝试连接到链接到上述 VPC 端点的 ENI 的 IP。

如果我:

  • 摆脱上述端点,堡垒瞬间堆积起来。
  • 为端点的 sec-group 添加一个 SecurityGroupIngress 条目,该条目允许来自作为 VPC 的 cidr 的 CidrIp 的所有入口连接,堡垒立即堆叠。

现在!为什么会这样:|。 这没有任何意义。一条经过端点的路由究竟是如何进入与公共子网链接的路由表的?这是公共子网的路由表:

172.36.0.0/16   local   active
0.0.0.0/0       igw-?   active

还有 3 个不同的私有子网路由表

172.36.0.0/16 local
0.0.0.0/0 nat-1 nat-2 nat-3
pl-6ea54007 vpce-s3

(实际上所有 3 个看起来都一样,VPC 有本地,因此有 3 个 nat,因此 nat-1 到 nat-3,这里的端点用于 S3)

再次重申:

  1. 堡垒与公共子网相关联,具有公共 IP 和到 InternetGateway 的路由
  2. 所述 VPCEndpoint 链接到私有子网(非公有)

有什么想法吗?

日志、文件等

用户数据:

          #!/bin/bash -xe
          yum update -y
          yum update -y aws-cfn-bootstrap || true

          trap '/opt/aws/bin/cfn-signal -e 1 --stack ${AWS::StackName} --region ${AWS::Region} --resource Bastion' ERR

          /opt/aws/bin/cfn-init --verbose \
            --stack ${AWS::StackName} \
            --resource Bastion \
            --region ${AWS::Region}

          sleep 1
          /opt/aws/bin/cfn-signal \
            -e 0 \
            --stack ${AWS::StackName} \
            --resource Bastion \
            --region ${AWS::Region}

来自/var/log/cfn-init.log的日志:

2020-10-02 05:18:43,957 [DEBUG] CloudFormation client initialized with endpoint https://cloudformation.eu-central-1.amazonaws.com
2020-10-02 05:18:43,958 [DEBUG] Describing resource Bastion in stack bastion-stack
2020-10-02 05:19:43,958 [WARNING] Timeout of 60 seconds breached
2020-10-02 05:19:43,958 [ERROR] Client-side timeout
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/util.py", line 162, in _retry
    return f(*args, **kwargs)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/util.py", line 231, in _timeout
    raise TimeoutError("Execution did not succeed after %s seconds" % duration)
TimeoutError
2020-10-02 05:19:43,960 [DEBUG] Sleeping for 0.115700 seconds before retrying

现有的 endoints:

【问题讨论】:

  • 如果有不清楚的地方,请告诉我。老实说,我只是想把它带到野外来引起注意。同时也很晚了;-)
  • 您的pl-6ea54007 路线会更具体,因此总会被选中。不确定这是否是您的要求?
  • 用户数据中有什么? cloud-init 日志文件 (/var/log/cloud-init-output.log) 中有什么内容?
  • @Marcin 这个pl-6ea54007 用于 S3 路由。事实上,我确实有 3 个 VPC 端点(一个网关和两个接口类型)链接到私有路由表或私有子网(又链接到这些表)
  • 根据@Marcin 的回答,整个 VPC 都可以访问 CloudFormation 的 VPC 端点。您已经列出了使其工作的方法(配置安全组)——这样做有问题吗?

标签: amazon-web-services amazon-ec2 amazon-cloudformation


【解决方案1】:

所述 VPCEndpoint 链接到私有子网(非公共)

CloudFormation VPC 端点不是这种情况。我认为您将VPC gateway edpoints 与VPC interface endpoints 混淆了。

在您的情况下,当您创建 CloudFormation VPC endpoint 时,您正在创建 VPC 接口端点,但是,您在问题中指的是 pl-6ea54007 路由,该路由用于 VPC 网关端点(可能是 S3)。

所以pl-6ea54007 是针对 VPC 网关端点(我猜是 S3),而不是针对 CloudFormation VPC 端点。 两种端点类型的工作方式不同,并且接口端点不会在任何路由表中创建任何路由。接口终端节点具有 VPC 范围。这意味着任何子网(私有、公共)都可以使用 CloudFormation VPC 终端节点,包括您的堡垒主机。

【讨论】:

  • 我实际上有 3 个端点(上面的答案)。一个用于 CloudFormation,一个用于 S3,最后一个用于 SecretsManager。
  • @kornicameister 那么您能否澄清一下您在写“现在!为什么是:|。这没有任何意义。”时的意思?对我来说,这很有意义,并且完全符合预期。
  • 我想知道为什么现在会发生这种情况。我们实际上是在尝试实现另一种网络设置。我们曾经让每个堆栈定义自己的 cidr 块、子网和 enpdoint。但正如你所说,我们很快就发现无法维护数十个不同的 Cidr 块等等。无论如何,就这一点而言,当这样做时,我们没有遇到这个问题。现在我们有 3 个共享私有子网和一个地方,每个服务的端点都存在并且突然公开放置的 EC2 尝试使用端点?
  • @kornicameister “突然公开放置的 EC2 尝试使用端点?” - 哪个端点? CloudFormation 端点?
  • @kornicameister CloudFromation 是接口端点,而不是网关端点。接口端点具有 VPC 范围。任何子网都会连接到它,无论是私有的还是公共的。
猜你喜欢
  • 2021-06-22
  • 2015-09-27
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多