web-dev-qa-db-fra.com

Comment puis-je me connecter à Host MySQL à partir de l'instance de menu fixe locale AWS SAM?

J'essaie d'appeler ma fonction Lambda à l'aide de sam local invoke, mais constate qu'elle ne peut pas se connecter à mon hôte MySQL. J'ai essayé d'ajouter --docker-network Host mais il ne peut pas non plus se connecter

Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/docker/api/client.py", line 229, in _raise_for_status
    response.raise_for_status()
  File "/usr/lib/python3.6/site-packages/requests/models.py", line 935, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: http+docker://localhost/v1.35/networks/6ad3bd87e8437e8410145d169a4edf68d1b0247a67257ce7dd1208dac3664c82/connect

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/bin/sam", line 11, in <module>
    load_entry_point('aws-sam-cli==0.5.0', 'console_scripts', 'sam')()
  File "/usr/lib/python3.6/site-packages/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/usr/lib/python3.6/site-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python3.6/site-packages/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python3.6/site-packages/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python3.6/site-packages/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python3.6/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/usr/lib/python3.6/site-packages/click/decorators.py", line 64, in new_func
    return ctx.invoke(f, obj, *args[1:], **kwargs)
  File "/usr/lib/python3.6/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/usr/lib/python3.6/site-packages/samcli/commands/local/invoke/cli.py", line 47, in cli
    docker_network, log_file, skip_pull_image, profile)  # pragma: no cover
  File "/usr/lib/python3.6/site-packages/samcli/commands/local/invoke/cli.py", line 79, in do_cli
    stderr=context.stderr)
  File "/usr/lib/python3.6/site-packages/samcli/commands/local/lib/local_lambda.py", line 80, in invoke
    stdout=stdout, stderr=stderr)
  File "/usr/lib/python3.6/site-packages/samcli/local/lambdafn/runtime.py", line 83, in invoke
    self._container_manager.run(container)
  File "/usr/lib/python3.6/site-packages/samcli/local/docker/manager.py", line 61, in run
    container.create()
  File "/usr/lib/python3.6/site-packages/samcli/local/docker/container.py", line 115, in create
    network.connect(self.id)
  File "/usr/lib/python3.6/site-packages/docker/models/networks.py", line 57, in connect
    container, self.id, *args, **kwargs
  File "/usr/lib/python3.6/site-packages/docker/utils/decorators.py", line 19, in wrapped
    return f(self, resource_id, *args, **kwargs)
  File "/usr/lib/python3.6/site-packages/docker/api/network.py", line 248, in connect_container_to_network
    self._raise_for_status(res)
  File "/usr/lib/python3.6/site-packages/docker/api/client.py", line 231, in _raise_for_status
    raise create_api_error_from_http_exception(e)
  File "/usr/lib/python3.6/site-packages/docker/errors.py", line 31, in create_api_error_from_http_exception
    raise cls(e, response=response, explanation=explanation)
docker.errors.APIError: 400 Client Error: Bad Request ("container cannot be disconnected from Host network or connected to Host network")

J'ai remarqué la dernière ligne: 

docker.errors.APIError: 400 Erreur du client: requête incorrecte ("le conteneur ne peut pas être déconnecté du réseau de l'hôte ou connecté au réseau de l'hôte")

Comment puis-je réparer ça? 

16
Jiew Meng

Je ne peux pas dire pourquoi --docker-network Host génère cette erreur, mais je ne pense pas que vous en ayez besoin. Je peux me connecter à MySQL s'exécutant sur ma machine locale à partir de SAM local, sans aucune substitution de réseau.

Je le fais simplement en utilisant mon adresse IP locale (par opposition à localhost ou 127.0.0.1) pour me connecter à la base de données.

La fonction lambda suivante se connecte parfaitement à mon MySQL local, à condition que j'utilise mon IP locale, comme le révèle un outil comme ipconfig.

'use strict';
var mysql      = require('mysql');
var connection = mysql.createConnection({
  Host     : '192.168.1.6',
  user     : 'mike',
  password : 'password',
  database : 'logtest'
});

module.exports.hello = (event, context, callback) => {

  connection.connect();

  connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
    if (error) throw error;
    console.log('The solution is: ', results[0].solution);
    const response = {
      statusCode: 200,
      body: JSON.stringify({solution: results[0].solution})
    };

    connection.end();

    callback(null, response);    
  });
};

Sortie partielle ipconfig:

Ethernet adapter Local Area Connection 6:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::95c2:495c:7226:8ac2%39
   IPv4 Address. . . . . . . . . . . : 10.251.19.6
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :

Wireless LAN adapter Wireless Network Connection:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::496a:d34d:8380:3b1c%15
   IPv4 Address. . . . . . . . . . . : 192.168.1.6
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 192.168.1.1

Dans ce cas, ma fonction lambda peut se connecter à MySQL en utilisant 10.251.19.6 ou 192.168.1.6.

Minimal exemple ici .

2
Mike Patrick

Vous pouvez vérifier les cas comme suit:

  • Si le port du menu fixe a un mappage.
  • Vérifiez le port du groupe de sécurité AWS.
0
Tiger

Si vous utilisez un Mac, vous devriez pouvoir simplement utiliser un nom d’hôte spécial localement lors du transfert du nom d’hôte au client restant dans le conteneur effectuant l’appel. Il ne cartographiera aucun drapeau --docker-network nécessaire

url = "http://docker.for.mac.localhost:3306"

Ou sur les nouvelles installations de docker https://docs.docker.com/docker-for-mac/release-notes/#docker-community-edition-17120-ce-mac49-2018-01-19

url = "http://docker.for.mac.Host.internal:3306"

Si vous n'êtes pas sur mac et que vous utilisez l'approche --docker-network au démarrage de votre conteneur mysql, il devrait ressembler à ceci.

docker run -d -v "$PWD":/var/lib/mysql -p 3306:3306 \
    --network lambda-local \
    --name mysql \
    mysql

Puis en appelant localement

sam local invoke --docker-network lambda-local

Peut-être avez-vous manqué la première partie? Pourriez-vous indiquer comment vous démarrez le conteneur mysql localement?

0
Ellery