2

我正在构建一个 CloudFormation 堆栈。我有

  • PortMappingsECS 容器中的Web 应用程序,具有ContainerPorts 9000 和 9002,映射到HostPorts 80 和 443,以及
  • 一个应用负载均衡AWS::ElasticLoadBalancingV2::LoadBalancerListenerTargetGroup

当我定义 aService时,我只能指定一个负载均衡器元素;虽然LoadBalancers是复数,但文档说只允许使用一个负载均衡器,并且指定两个负载均衡器元素不起作用。那么,如何映射两个端口呢?

这是我的 CloudFormation JSON 的服务部分,只有 HTTPS 部分,它可以工作。它可以扩展为将 HTTP 路由到同一个容器吗?如果没有,最好的解决方案是什么?

"Service": {
  "Type": "AWS::ECS::Service",
  "DependsOn": ["AutoScalingGroup", "HTTPSListener"],
  "Properties": {
    "Cluster": { "Ref": "Cluster" },
    "DesiredCount": { "Ref": "InstanceCount" },
    "LoadBalancers": [
      {
        "TargetGroupArn": { "Ref": "HTTPSTargetGroup" },
        "ContainerName": "nginx",
        "ContainerPort": "9002"
      }
    ],
    "Role": { "Ref": "ServiceRole" },
    "TaskDefinition": { "Ref": "TaskDefinition" }
  }
}

CloudFormation 解决方案将是理想的,但 API 解决方案也很重要。

我可以为 HTTP 创建第二个Service,带有单独的负载均衡器和容器实例,但这既不简单也不经济。

4

2 回答 2

1

我会建议以下选项之一:

a) 在同一负载均衡器的两个不同任务定义中注册任务(容器)作为容器启动过程的一部分,而不是使用 ECS 服务的内置功能。

b) 定义另一个 ECS 服务,每个服务都与自己的目标组相连。两个目标组都与同一个 ALB 相关联。

于 2016-10-29T07:26:22.583 回答
0

部分解决方案是在创建堆栈后通过 API 手动将实例注册到 HTTP 目标组:

autoscaling = boto3.client('autoscaling')
auto_scaling_groups = autoscaling.describe_auto_scaling_groups(AutoScalingGroupNames=[auto_scaling_group_name])
instances = auto_scaling_groups['AutoScalingGroups'][0]['Instances']

elbv2 = boto3.client('elbv2')
for instance in instances:
    elbv2.register_targets(
        TargetGroupArn=http_target_group_arn,
        Targets=[{'Id': instance['InstanceId'], 'Port': instance}]
    )

这不是一个完全可以接受的答案,因为将来自动缩放组创建的实例不会自动注册到 HTTP 目标组。应该可以安装实例来注册它们自己;我会调查的。

于 2016-10-30T13:55:52.260 回答