2017-03-15 104 views
2

我運行下面的腳本時,「密鑰對不存在」錯誤:AWS 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

還是,不起作用。

回答

1

create_instances()中的KeyName參數指的是在AWS中創建KeyPair時給出的名稱。

該名稱通常是「KeyName.pem」。傳遞沒有.pem擴展名的字符串。 create_instances()中的KeyName參數僅預期密鑰對的名稱,而不是實際的密鑰文件。

例如:
如果密鑰文件是myinstance.pem,那麼鍵名是myinstance除非密鑰文件已被重命名。您將能夠從控制檯查看您擁有的所有KeyPairs(可以使用cli和api列出)。

+1

只是爲了進一步解釋...該命令不需要訪問您在磁盤上的密鑰對。相反,它將密鑰對的名稱發送給EC2,然後EC2將訪問已存儲在AWS上的已命名密鑰對,並在啓動實例時使用它。 –

+0

@franklinsijo我擁有KeyPair。但是,我收到這個錯誤。另外,當我創建一個沒有KeyName屬性的實例時,它創建一個。但是,我無法在我的EC2儀表板中找到它:/。 [我也交叉檢查了訪問密鑰和祕密訪問密鑰] – Dawny33

+0

傳遞沒有'.pem'擴展名的參數。 – franklinsijo

0

讓我們來解釋AWS EC2中的「KeyPair」。通常,人們將使用控制檯來生成一個密鑰對,在這裏AWS將爲您提供私鑰,並將公鑰保存到AWS內的密鑰存儲庫中。

啓動EC2實例時,該過程將複製在您的帳戶EC2密鑰對中找到的公鑰並將其放入實例操作系統各自的位置。 (例如〜/ .ssh/authorized_keys)

你不能使用你自己的密鑰「即時」,啓動器不會給你選項(原因見後面)。如果您想使用自己的密鑰,您必須首先將import公鑰帶入回購庫,併爲其指定一個用於EC2的名稱。

請留意,EC2 keypair必須符合AWS標準如下:

  • OpenSSH public key format (the format in ~/.ssh/authorized_keys)
  • Base64 encoded DER format SSH public key file format as specified in
  • RFC4716 Amazon EC2 does not accept DSA keys. Make sure your key generator is set up to create RSA keys.

Supported lengths: 1024, 2048, and 4096.

如果您不能導入你的公鑰到EC2密鑰對回購,必須生成一個新的,是達標。只有成功導入密鑰後,纔可以使用密鑰對啓動實例。

另外,如果你想自動導入你自己的密鑰,你可以使用ec2.client.import_key_pair()來做到這一點。

1

在這種情況下,您正在查看不同的地區。很有可能您創建的實例默認爲region,但密鑰對存在於us-east-1中。

嘗試:

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