Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I connect to host MySQL from AWS SAM local docker instance?

Tags:

I am trying to invoke my Lambda function using sam local invoke but find that it cannot connect to my host MySQL. I tried adding --docker-network host but it also cannot connect

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") 

I noticed the last line:

docker.errors.APIError: 400 Client Error: Bad Request ("container cannot be disconnected from host network or connected to host network")

How do I fix this?

like image 703
Jiew Meng Avatar asked Jul 21 '18 13:07

Jiew Meng


People also ask

Does AWS Sam use Docker?

In addition to changes in the template. yaml file, AWS SAM also uses the Docker CLI to build container images.

What is Sam local?

A new service called SAM Local enables them to build and test applications locally with the familiar SAM tool. Now, in addition to using the SAM command-line tool to build and deploy applications, developers can test this code using the command sam local.

What does Sam local start API do?

Allows you to run your serverless application locally for quick development and testing. When you run this command in a directory that contains your serverless functions and your AWS SAM template, it creates a local HTTP server that hosts all of your functions.


1 Answers

I can't say why --docker-network host produces this error, but I don't think you need it. I can connect to MySQL running on my local machine from within SAM local, without any network overrides.

I do this by simply using my local IP (as opposed to localhost or 127.0.0.1) to connect to the database.

The following lambda function connects to my local MySQL just fine, provided I use my local IP, as revealed a tool like 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);       }); }; 

Partial ipconfig output:

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 

In this case, my lambda function can connect to local MySQL using 10.251.19.6 or 192.168.1.6.

Minimal example here.

like image 136
Mike Patrick Avatar answered Oct 16 '22 03:10

Mike Patrick