I am writing this lambda function that uses paramiko.SSHClient() to connect to an EC2 instance that is located in the same Account / VPC / subnet.
The connection method is using the old user and password authentication method (no pass key involved) because the EC2 prohibits other authentication methods.
The method call goes as follows:
c = paramiko.SSHClient()
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
c.connect(server, port, username=username, password=password, pkey=None)
It works without any error when I run the Python code from my own machine. But when I deploy the code to Lambda, it gives me "[Error 16] Device or resource busy".
[ERROR] OSError: [Errno 16] Device or resource busy
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 36, in lambda_handler
c.connect(server, port, username=username, password=password, pkey=None)
File "/var/task/paramiko/client.py", line 377, in connect
to_try = list(self._families_and_addresses(hostname, port))
File "/var/task/paramiko/client.py", line 202, in _families_and_addresses
addrinfos = socket.getaddrinfo(
File "/var/lang/lib/python3.12/socket.py", line 963, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):END RequestId: ....
The messagem doesn´t seem to be a network error, but rather an OS Error (as the message implies).
It seems to me that when the error raises, the SSHClient hasn´t started the connection processes yet so, it suggests a memory or IO issue inside the lambda machines.
I´ve checked basic stuff (Security Groups, Outbound rules, permissions, etc.) and they are all OK. Also, if I change the "server" parameter and give them a fake server, the message is still the same. So it shows the message is not related to socket connection, but to OS resource.
I´m writing on my Linux machine. But the compilation is done on a CI/CD resource where I have no access. But it´s another Linux machine. And the deploy is applied through Terraform.
If that is the case then I would recommend to package paramiko using Docker. You can create a layer with paramiko and its dependencies. You can test this works locally by using the Lambda runtime interface emulator.