AWS Lambda无法通过EC2进行身份验证



我有一个python脚本,它位于EC2实例中,计划每天运行一次。为此,我设置了一个AWS lambda函数来启动实例,并对其进行SSH,然后执行某些命令来运行我的python脚本。我使用Paramiko进行ssh连接,代码在我自己的本地PC上完美工作,但一旦我在AWS上调用该函数,Paramiko就会抛出一个错误,说它无法进行身份验证。我不知道在这里还能做什么,任何帮助都将不胜感激。到目前为止我尝试过的东西:

使用DNS,公共IP,甚至私有IP,但没有任何成功

更改我的EC2实例安全组以允许所有传入网络通过所有协议

设置vpc

我的Lambda函数:

import boto3
import time
import paramiko
from os import path
region = 'ca-central-1'
def lambda_handler(event, context):
ec2 = boto3.resource('ec2', region_name=region)
instance = ec2.Instance('instance_name')
instance.start()
s3 = boto3.client('s3', region_name=region)
bucket_name = 'my_bucket_name'
key_name = 'key.pem'
key_location = path.join('/tmp', key_name)
s3.download_file(bucket_name, key_name, key_location)
time.sleep(45)
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
privkey = paramiko.RSAKey.from_private_key_file(key_location)
ssh.connect(instance.public_dns_name, 22, username='ubuntu', pkey=privkey)
#
## run the py script
#   
ssh.close()

我得到的错误:

Response
{
"errorMessage": "Authentication failed.",
"errorType": "AuthenticationException",
"stackTrace": [
"  File "/var/task/lambda_function.py", line 23, in lambda_handlern    ssh.connect(instance.public_dns_name, 22, username=ec2_username, pkey=privkey)n",
"  File "/opt/python/paramiko/client.py", line 446, in connectn    passphrase,n",
"  File "/opt/python/paramiko/client.py", line 764, in _authn    raise saved_exceptionn",
"  File "/opt/python/paramiko/client.py", line 664, in _authn    self._transport.auth_publickey(username, pkey)n",
"  File "/opt/python/paramiko/transport.py", line 1580, in auth_publickeyn    return self.auth_handler.wait_for_response(my_event)n",
"  File "/opt/python/paramiko/auth_handler.py", line 250, in wait_for_responsen    raise en"
]
}

奇怪的是,我收到了一个身份验证错误,但我为该实例使用了正确的公钥。

以编程方式使用SSH连接到EC2实例以运行命令很容易失败。

以下是其他一些选项。。。

启动脚本

由于您希望在启动实例后立即运行命令,因此只需将命令放入:

/var/lib/cloud/scripts/per-boot/

每当实例启动时,该目录中的任何脚本都会自动运行

然后,您可以在处理完成时sudo shutdown now -h要关闭的实例。

请参阅:当EC2实例完成任务时自动停止-DEV社区

SSM运行命令

AWS Systems Manager运行命令-AWS Systems Manager允许您在一个或多个Amazon EC2实例上运行命令。该命令由安装在实例上的代理执行,因此不需要SSH连接。

Amazon SQS队列

如果您经常在AmazonEC2实例上触发作业,那么常见的架构是:

  • 向Amazon SQS队列发送消息
  • 实例上的程序不断轮询消息的SQS队列
  • 当发现消息时,它会触发对该消息的处理

当大量消息可能到达并且EC2实例持续运行时,这很好。

最新更新