2

CloudFormation 스택을 구축 중입니다. 나는이있는 ECS 컨테이너두 포트 80과 443을 ELB에서 동일한 ECS 컨테이너로 매핑하는 방법은 무엇입니까?

  • 웹 응용 프로그램을 PortMappingsContainerPort의 9000 및 9002, HostPort의 80 및 443에 매핑하고,
  • 에 대한 Listener들과 TargetGroup의를 사용하여 응용 프로그램 부하 분산 (AWS::ElasticLoadBalancingV2::LoadBalancer) 포트 80의 HTTP 및 포트 443의 HTTPS에 대해

Service을 정의하면 하나의로드 밸런서 요소 만 지정할 수 있습니다. LoadBalancers은 복수이지만 설명서에서는 하나의로드 균형 조정기 만 허용되며 두 개의로드 균형 조정기 요소를 지정하면 작동하지 않습니다. 그런 다음 어떻게 두 포트를 매핑합니까?

다음은 동작하는 HTTPS 부분 만 사용하는 CloudFormation JSON의 서비스 부분입니다. 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을 만들 수 있지만 단순하지만 경제적이지 않습니다.

+0

HTTPS로 리디렉션 할 때만 포트 80을 사용하고 있습니까? – Andreas

+0

지금까지는 CloudFormation 또는 AWS API에서 리디렉션을 수행하는 방법에 관심이있었습니다. 컨테이너가 다른 컨텍스트에서 사용되기 때문에 컨테이너에서 리디렉션을 유지하는 것이 가장 좋습니다. –

답변

1

내가 다음 옵션 중 하나 제안 :

가) 컨테이너 부팅 프로세스의 일부로 같은 부하 분산의 두 개의 서로 다른 작업 정의에서 작업 (컨테이너)를 등록 대신의 기능에 빌드를 사용하여 ECS 서비스.

b) 각각 자신의 대상 그룹과 연결된 다른 ECS 서비스를 정의합니다. 두 대상 그룹 모두 동일한 ALB와 연결됩니다. 스택 만든 후

+0

컨테이너의 두 번째 인스턴스화가 필요하지 않은 이들 중 하나를 수행하는 방법이 있습니까? –

+0

예, 옵션 a)에는 컨테이너의 두 번째 인스턴스화가 필요하지 않습니다. 그러나 당신은 이미 이미 자신에게 질문에 답했습니다. :) – Andreas

+0

CloudFormation 만 사용하거나 대상 그룹 (호스트에서 스크립팅하지 않음)으로 호스트 등록을 자동으로 업데이트 한 솔루션 또는 둘 다 내 것보다 낫습니다. 게시하기 전에 두 가지 서비스 솔루션을 시도했지만 각 대상 그룹마다 다른 컨테이너를 시작했습니다. 그렇게하지 않는 방법에 대해 자세히 설명해 주시겠습니까? –

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 대상 그룹에 등록되지 않습니다. 인스턴스를 조작하여 스스로 등록 할 수 있어야합니다. 나는 그것을 들여다 볼 것이다.