我正在运行以下脚本:
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
尽管如此,还是不行。
答案 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的名称,此问题已解决。
希望我的回答会有所帮助!