2017-07-24 2 views
1

Je migre une partie de l'infrastructure de la société pour laquelle je travaille vers Amazon ECS et je suis bloqué pour essayer de connecter le conteneur de mon serveur au conteneur de la base de données.AWS ECS ne lie pas mes conteneurs

Voici comment je l'ai mis sur ma tâche:

{ 
    "requiresAttributes": [ 
    { 
     "value": null, 
     "name": "com.amazonaws.ecs.capability.docker-remote-api.1.17", 
     "targetId": null, 
     "targetType": null 
    }, 
    { 
     "value": null, 
     "name": "com.amazonaws.ecs.capability.logging-driver.syslog", 
     "targetId": null, 
     "targetType": null 
    }, 
    { 
     "value": null, 
     "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18", 
     "targetId": null, 
     "targetType": null 
    }, 
    { 
     "value": null, 
     "name": "com.amazonaws.ecs.capability.ecr-auth", 
     "targetId": null, 
     "targetType": null 
    } 
    ], 
    "taskDefinitionArn": "arn:aws:ecs:us-east-1:9621234232917455:task-definition/ecv-server:12", 
    "networkMode": "bridge", 
    "status": "ACTIVE", 
    "revision": 12, 
    "taskRoleArn": null, 
    "containerDefinitions": [ 
    { 
     "volumesFrom": [], 
     "memory": 500, 
     "extraHosts": null, 
     "dnsServers": [], 
     "disableNetworking": null, 
     "dnsSearchDomains": null, 
     "portMappings": [], 
     "hostname": "db", 
     "essential": true, 
     "entryPoint": null, 
     "mountPoints": [ 
     { 
      "containerPath": "/var/lib/postgresql/data", 
      "sourceVolume": "dbdata", 
      "readOnly": null 
     } 
     ], 
     "name": "db", 
     "ulimits": null, 
     "dockerSecurityOptions": null, 
     "environment": [ 
     { 
      "name": "POSTGRES_PASSWORD", 
      "value": "jmbrito" 
     }, 
     { 
      "name": "POSTGRES_USER", 
      "value": "jmbrito" 
     } 
     ], 
     "links": [], 
     "workingDirectory": null, 
     "readonlyRootFilesystem": null, 
     "image": "postgres", 
     "command": null, 
     "user": null, 
     "dockerLabels": null, 
     "logConfiguration": { 
     "logDriver": "syslog", 
     "options": null 
     }, 
     "cpu": 0, 
     "privileged": null, 
     "memoryReservation": null 
    }, 
    { 
     "volumesFrom": [], 
     "memory": 400, 
     "extraHosts": null, 
     "dnsServers": [], 
     "disableNetworking": null, 
     "dnsSearchDomains": null, 
     "portMappings": [], 
     "hostname": "redis", 
     "essential": true, 
     "entryPoint": null, 
     "mountPoints": [ 
     { 
      "containerPath": "/data", 
      "sourceVolume": "redisdata", 
      "readOnly": null 
     } 
     ], 
     "name": "redis", 
     "ulimits": null, 
     "dockerSecurityOptions": null, 
     "environment": [], 
     "links": null, 
     "workingDirectory": null, 
     "readonlyRootFilesystem": null, 
     "image": "redis:3.2-alpine", 
     "command": [ 
     "redis-server" 
     ], 
     "user": null, 
     "dockerLabels": null, 
     "logConfiguration": { 
     "logDriver": "syslog", 
     "options": null 
     }, 
     "cpu": 0, 
     "privileged": null, 
     "memoryReservation": null 
    }, 
    { 
     "volumesFrom": [], 
     "memory": 600, 
     "extraHosts": null, 
     "dnsServers": null, 
     "disableNetworking": null, 
     "dnsSearchDomains": null, 
     "portMappings": [ 
     { 
      "hostPort": 80, 
      "containerPort": 3000, 
      "protocol": "tcp" 
     } 
     ], 
     "hostname": null, 
     "essential": true, 
     "entryPoint": [], 
     "mountPoints": [], 
     "name": "server", 
     "ulimits": null, 
     "dockerSecurityOptions": null, 
     "environment": [ 
     { 
      "name": "RAILS_ENV", 
      "value": "production" 
     } 
     ], 
     "links": [ 
     "db:db", 
     "redis:redis" 
     ], 
     "workingDirectory": "/usr/src/app", 
     "readonlyRootFilesystem": null, 
     "image": "MY DOCKER LINK IN ECR", 
     "command": [ 
     "sh", 
     "deploy/init.sh" 
     ], 
     "user": null, 
     "dockerLabels": null, 
     "logConfiguration": { 
     "logDriver": "syslog", 
     "options": null 
     }, 
     "cpu": 0, 
     "privileged": null, 
     "memoryReservation": null 
    } 
    ], 
    "placementConstraints": [], 
    "volumes": [ 
    { 
     "host": { 
     "sourcePath": null 
     }, 
     "name": "dbdata" 
    }, 
    { 
     "host": { 
     "sourcePath": null 
     }, 
     "name": "redisdata" 
    } 
    ], 
    "family": "ecv-server" 
} 

Comme vous pouvez le voir je configurer correctement mon champ de liens et lorsque je tente de se connecter en utilisant le nom comme la connexion à la DB hôte ou les Redis hôtes il ne le trouve pas.

J'ai essayé d'utiliser les adresses VPC pour me connecter aux autres conteneurs et cela a fonctionné. Le seul problème est que pour le faire j'ai préféré me fixer les adresses dans le VPC (comme le réglage 172.13.0.2 comme db) parce que quand je ne l'ai pas défini, le système obtient l'adresse par ordre de connexion.

J'espère que vous avez compris la question.

Merci.

Répondre

1

Je ne pense pas que cette définition de tâche fonctionnera comme vous le souhaitez. Lorsque vous placez trois conteneurs dans une même définition de tâche, elle demande à ECS de toujours déployer ces trois conteneurs ensemble sur la même machine, chaque fois qu'elle déploie la tâche. Par conséquent, si vous déployez un service dont le nombre souhaité est trois pour cette tâche, vous obtiendrez trois conteneurs d'applications, trois conteneurs postgres et trois conteneurs Redis. Les trois conteneurs d'applications auront trois piles de persistance de données isolées. Le conteneur d'application A ne parlera qu'avec postgres A et redis A, tandis que le conteneur d'application B ne parlera qu'avec postgress B et redis B, de sorte que chaque conteneur d'application aura des données incohérentes qui ne seront pas répliquées entre elles.

L'exécution de plusieurs conteneurs dans une définition de tâche est en réalité uniquement destinée aux conteneurs sidecar tels qu'un proxy inverse ou un cache temporaire, ou similaire. Pour la couche de persistance, ma recommandation ici serait d'utiliser Amazon RDS pour vos postgres, et Amazon Elasticache pour vos redis. De cette façon, toutes vos tâches peuvent partager les mêmes postgres et les mêmes redis, et vous aurez également beaucoup moins d'administration à vous soucier en utilisant ces services Amazon.