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?
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 .
Vous pouvez vérifier les cas comme suit:
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?