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?
In addition to changes in the template. yaml file, AWS SAM also uses the Docker CLI to build container images.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With