如何使用 CloudFormation 在不同的 Fargate 任务中通过 Consul 服务器 运行 将 Consul 代理加入 Consul 集群?

How can I join a Consul agent to a Consul cluster via a Consul server running in a different Fargate task with CloudFormation?

我目前是一名实习生,需要托管一个微服务应用程序。我选择结合使用 AWS ECS 和 Fargate 任务来托管一个 Consul Connect Service Mesh,为应用程序提供服务发现、意图、Mtls 等。我的设置如下:

我正在使用 CloudFormation 自动部署该基础设施。

问题:

我需要在一个 Fargate 任务中加入 Consul 代理 运行 到使用 CloudFormation 在另一个 Fargate 任务(服务器的任务)中启动的 Consul 集群。我这样做的问题是我没有找到任何方法来获取 IP 地址以将代理加入集群。

有谁知道我如何在 CloudFormation 中获取 Fargate 任务的 IP 地址或最佳实践方法?

如果我没记错的话,您只能使用 IP、DNS 名称或云元数据将 Consul 代理加入 Consul 集群。第一个和第二个我无法使用 CloudFormation 检索,第三个我发现它可能不可能(我可能是错的,但到目前为止我读到的就是这些)。

我还尝试了 Consul 代理 -ui [...] -join 和 -retry-join 标志,但都没有用。我还尝试使用 Consul 服务器为任务创建一个内部负载均衡器,我从中使用 DNS 名称尝试加入集群,但这也不起作用(我还没有在 AWS 上正确设置负载均衡器,所以我可能做错了)。我尝试使用负载均衡器将流量转发到端口 8500(我认为这是错误的端口),然后使用端口 8301(我认为这是正确的端口)。但是我一直收到消息说那个地址上没有 Consul Cluster。

谁能告诉我如何进行?

提前致谢!

感谢我的一位非常聪明的同事,我发现在 ECS 服务前面放置一个负载均衡器(我之前设置错误)与 Consul Server Fargate 任务解决了我的问题。负载均衡器侦听器应侦听 SERF 端口 8301 tcp_udp 并将流量转发到具有该协议和端口的服务。

  ConsulServerTargetGroup8301:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckEnabled: true
      HealthCheckIntervalSeconds: 30
      UnhealthyThresholdCount: 3
      HealthyThresholdCount: 3
      Name: ConsulServerTargetGroup8301
      Port: 8301
      Protocol: TCP_UDP
      TargetGroupAttributes:
        - Key: deregistration_delay.timeout_seconds
          Value: 60 # default is 300
      TargetType: ip
      VpcId: !Ref VPC

  ConsulServerTargetGroupListener8301:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - TargetGroupArn: !Ref ConsulServerTargetGroup8301
          Type: forward
      Port: 8301
      Protocol: TCP_UDP
      LoadBalancerArn: !Ref ConsulServerLoadbalancer
  
  ConsulServerLoadbalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: ConsulServerLoadbalancer
      IpAddressType: ipv4
      Type: network
      Scheme: internal
      SubnetMappings:
        - SubnetId: !Ref PrivateSubnet1a
        - SubnetId: !Ref PrivateSubnet1b 

然后您可以使用负载均衡器的 DNS 名称将 Consul 代理加入 Consul 集群:

        Command:
        - !Sub >-
            consul agent 
            -ui 
            -data-dir consul/data 
            -advertise '{{ GetPrivateInterfaces | include "network" "${pVPCIpRange}" | attr "address" }}'
            -client 0.0.0.0
            -retry-join ${ConsulServerLoadbalancer.DNSName}