Lambda中的Paraminko连接失败

时间:2018-08-20 16:34:46

标签: python amazon-web-services amazon-ec2 paramiko

我有一个Lambda函数,该函数在放置S3对象之后调用。它连接到另一个EC2实例并运行bash脚本。我已经确认了bash脚本,并且lambda函数之外的Python代码可以正常工作。包装它会产生我无法弄清楚的错误。附加到lambda的角色似乎已附加了所有必需的EC2和S3必需的策略。也没有将VPC附加到lambda函数。

代码:

import boto3
import botocore
import paramiko

def lambda_handler(event, context):
    s3_client = boto3.client('s3')
    s3_client.download_file('mycluster', 'keys/ec2box.pem', 
    '/tmp/ec2box.pem')

    k = paramiko.RSAKey.from_private_key_file('/tmp/ec2box.pem')
    c = paramiko.SSHClient()
    c.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    c.connect(hostname='99.99.9999', username='centos', pkey=k)

    commands = [
        "cd /home/dir1/;chmod +x file.sh;nohup ./file.sh > logs/program"
    ]
    for command in commands:
        print
        "Executing {}".format(command)
        stdin, stdout, stderr = c.exec_command(command)
        print
        stdout.read()
        print
        stderr.read()

    return
    {
        'message': "Script execution completed. See Cloudwatch logs for complete output"
    }

我的错误

[Errno 110] Connection timed out: error
Traceback (most recent call last):
File "/var/task/pythonprogram.py", line 17, in lambda_handler
c.connect(hostname='99.99.9999', username='centos', pkey=k)
File "/var/task/paramiko/client.py", line 338, in connect
retry_on_signal(lambda: sock.connect(addr))
File "/var/task/paramiko/util.py", line 279, in retry_on_signal
return function()
File "/var/task/paramiko/client.py", line 338, in <lambda>
retry_on_signal(lambda: sock.connect(addr))
File "/usr/lib64/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
error: [Errno 110] Connection timed out

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

弄清楚了,说实话,这很明显,但希望对Googler有帮助。查看您要SSH连接的EC2实例的安全组,并确保它实际上已打开。我的被​​锁得很紧,我所要做的就是添加一个新的TCP入站规则以允许所需的流量。

答案 1 :(得分:0)

通过lambda连接到EC2支持为连接的lambda指定--vpc-config。来自ec2的子网和安全组必须在lambda的vpc-config配置参数中指定,如下所示-

--vpc-config SubnetIds=subnet-7cX8eX37,subnet-1X3fX935,SecurityGroupIds=secrgp-l-pocinstance,secgrp-x-geninstance

您也可以使用用户界面来执行此操作。 (请向下滚动)

enter image description here

将这些设置与AWS目标资源相同后,您尝试在lambda内部访问。连接应该正常工作。

希望有帮助!