AWS Boto3"密钥对不存在"给出确切路径时出错

时间:2017-03-15 10:23:30

标签: amazon-web-services amazon-ec2 boto3

我正在运行以下脚本:

from __future__ import print_function

import paramiko
import boto3


#print('Loading function')

paramiko.util.log_to_file("/tmp/Dawny.log")

# List of EC2 variables
region = 'us-east-1'
image = 'ami-<>'
keyname = '<>.pem'

ec2 = boto3.resource('ec2')


instances = ec2.create_instances(ImageId=image, MinCount=1, MaxCount=1, InstanceType = 't2.micro', KeyName=keyname)

instance = instances[0]
instance.wait_until_running()

instance.load()

print(instance.public_dns_name)



def lambda_handler(event, context):
    instances = ec2.create_instances(ImageId=image, MinCount=1, MaxCount=1, InstanceType = 't2.micro', KeyName=keyname)

    instance = instances[0]
    instance.wait_until_running()

    instance.load()

    print(instance.public_dns_name)

当我运行它时,我收到此错误:

botocore.exceptions.ClientError: An error occurred (InvalidKeyPair.NotFound) when calling the RunInstances operation: The key pair '<>.pem' does not exist

即使我将完整路径添加到密钥对,boto3也会给出同样的错误。 另外,我也尝试了这个:https://stackoverflow.com/a/34410564/4993513

尽管如此,还是不​​行。

5 个答案:

答案 0 :(得分:2)

KeyName中的create_instances()参数是指在AWS中创建KeyPair时为KeyPair指定的名称。

名称通常为&#34; KeyName。pem&#34;。传递不带.pem扩展名的字符串。 KeyName中的create_instances()参数只需要密钥对的名称,而不是实际的密钥文件。

例如:
如果密钥文件为myinstance.pem,则KeyName将为myinstance,除非密钥文件已重命名。您将能够从控制台查看您拥有的所有KeyPairs(也可以使用cli和api列出)。

答案 1 :(得分:1)

让我们解释一下&#34; KeyPair&#34;在AWS EC2中。通常,人们将使用控制台生成密钥对,之后AWS将为您提供私钥,并将公钥保存到AWS内的密钥存储库中。

启动EC2实例时,该过程将复制您的帐户EC2密钥对中的公钥,并将其放在实例OS各自的位置。 (例如〜/ .ssh / authorized_keys)

您无法使用自己的密钥&#34;即时启动&#34;,启动器不会为您提供选项(原因会在后面显示)。如果您想使用自己的密钥,则必须先将import公钥放入仓库并为其指定一个用于EC2的名称。

请注意,ec2 keypair 必须符合AWS标准,如下所示:

  
      
  • OpenSSH公钥格式(〜/ .ssh / authorized_keys中的格式)
  •   
  • Base64编码的DER格式
  • 中指定的SSH公钥文件格式   
  • RFC4716 Amazon EC2不接受DSA密钥。确保你的钥匙   生成器设置为创建RSA密钥。
  •   
     

支持的长度:1024,2048和4096。

如果您无法将公钥导入EC2密钥对回购,则必须生成符合要求的新密钥。只有在成功导入密钥后,您才可以使用密钥对启动实例。

此外,如果您想自动导入自己的密钥,可以使用ec2.client.import_key_pair()来执行此操作。

答案 2 :(得分:1)

在这种情况下,您正在寻找不同的区域。您很可能是在默认region中创建实例,但us-east-1中存在密钥对。

尝试:

ec2 = boto3.resource('ec2', region_name=region)

答案 3 :(得分:1)

在部署新实例之前,您必须先创建密钥对

keyPairResponse =ec2Client.create_key_pair(KeyName=keyPairName)

然后就可以部署了。不要忘记保存您的密钥字符串。

keyresponse['KeyMaterial']

答案 4 :(得分:0)

我遇到了同样的问题,实际上我已经在我的AWS账户中创建了一个用户,但是在CLI中,我使用了另一个区域,而不是我通常使用的区域。问题是我正在使用默认区域的KeyPair。 ,因此当我提供不带.pem扩展名的名称时,会出现错误InvalidKeyPair。我所做的是我创建了另一个特定于我在CLI中提到的区域的KeyPair。我使用了没有.pem扩展名的KeyPair的名称,此问题已解决。

希望我的回答会有所帮助!