2

Je construis une pile CloudFormation. JeComment mapper les deux ports 80 et 443 d'un ELB au même conteneur ECS?

  • une application web dans un conteneur ECS qui a PortMappings pour ContainerPort s 9000 et 9002, mis en correspondance avec HostPort s 80 et 443, et
  • un équilibreur de charge de l'application (AWS::ElasticLoadBalancingV2::LoadBalancer) avec Listener s et TargetGroup s pour HTTP sur le port 80 et HTTPS sur le port 443

Lorsque je définis un Service, je ne peux spécifier qu'un élément d'équilibreur de charge; Bien que LoadBalancers soit au pluriel, la documentation indique qu'un seul équilibreur de charge est autorisé et que la spécification de deux éléments d'équilibrage de charge ne fonctionne pas. Comment, alors, cartographier les deux ports?

Voici la partie service de mon JSON CloudFormation avec seulement les parties HTTPS, qui fonctionne. Peut-il être étendu pour router HTTP vers le même conteneur? Si non, quelle est la meilleure solution? Une solution CloudFormation serait idéale, mais une solution API serait également intéressante.

Je pourrais créer un second Service pour HTTP, avec un équilibreur de charge séparé et des instances de conteneur, mais cela ne serait ni simple ni économique.

+0

Utilisez-vous le port 80 uniquement pour la redirection vers HTTPS? – Andreas

+0

Jusqu'à présent, oui, une façon de faire la redirection dans CloudFormation ou l'API AWS serait intéressante. Il serait préférable de conserver la redirection dans le conteneur, car le conteneur est utilisé dans d'autres contextes. –

Répondre

1

Je suggère une de ces options:

a) Enregistrement de la tâche (conteneur) à deux définitions de tâches différentes de la même équilibreur de charge dans le cadre du processus de démarrage du conteneur au lieu d'utiliser la construction en fonction de la Service ECS.

b) Définition d'un autre service ECS, chacun d'entre eux étant connecté à son propre groupe cible. Les deux groupes cibles liés avec le même ALB.

+0

Y at-il un moyen de faire l'un ou l'autre de ces qui ne nécessite pas une seconde instanciation du conteneur? –

+0

Oui, l'option a) ne nécessite pas une seconde instanciation du conteneur. Mais vous avez déjà répondu à la question vous-même déjà. :) – Andreas

+0

Une solution qui utilisait uniquement CloudFormation, l'enregistrement de l'hôte mis à jour automatiquement avec les groupes cibles (sans script sur l'hôte), ou les deux, serait meilleure que la mienne. J'ai essayé une solution à deux services avant de poster, mais elle a démarré différents conteneurs pour chaque groupe cible. Pouvez-vous fournir des détails sur la façon de ne pas le faire? –

0

Une solution partielle consiste à enregistrer les cas avec le groupe cible HTTP manuellement via l'API après que la pile est créé:

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}] 
    ) 

Cela ne veut pas une réponse tout à fait acceptable puisque les instances créées par le groupe de l'échelle automatique en le futur ne serait pas automatiquement enregistré avec le groupe cible HTTP. Il devrait être possible de forcer les instances à s'enregistrer elles-mêmes; Je vais regarder dans cela.