繁体   English   中英

AWS Lambda 无法使用 EC2 进行身份验证

[英]AWS Lambda Unable to authenticate with EC2

我有一个 python 脚本,它位于 EC2 实例中,计划每天运行一次。 to do this, I'm setting up an AWS lambda function to start the instance, SSH into it, and execute certain commands to run my python script. 我将 Paramiko 用于我的 ssh 连接,并且代码在我自己的本地 PC 上完美运行,但是一旦我在 AWS 上调用 function,paramiko 会抛出一个错误,说它无法进行身份验证。 我不确定在这里还能做什么,任何帮助将不胜感激。 到目前为止我尝试过的事情:

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

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

设置一个 vpc

我的 Lambda function:

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_handler\n    ssh.connect(instance.public_dns_name, 22, username=ec2_username, pkey=privkey)\n",
    "  File \"/opt/python/paramiko/client.py\", line 446, in connect\n    passphrase,\n",
    "  File \"/opt/python/paramiko/client.py\", line 764, in _auth\n    raise saved_exception\n",
    "  File \"/opt/python/paramiko/client.py\", line 664, in _auth\n    self._transport.auth_publickey(username, pkey)\n",
    "  File \"/opt/python/paramiko/transport.py\", line 1580, in auth_publickey\n    return self.auth_handler.wait_for_response(my_event)\n",
    "  File \"/opt/python/paramiko/auth_handler.py\", line 250, in wait_for_response\n    raise e\n"
  ]
}

奇怪的是,我遇到了身份验证错误,但我使用的是正确的公钥。

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

这里有一些其他的选择......

启动脚本

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

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

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

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

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

SSM 运行命令

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

亚马逊 SQS 队列

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM