【问题标题】:AWS Boto3 "Key pair does not exist" error when giving exact path给出确切路径时出现 AWS Boto3“密钥对不存在”错误
【发布时间】:2017-08-06 00:35:41
【问题描述】:

我正在运行以下脚本:

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

还是不行。

【问题讨论】:

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


    【解决方案1】:

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

    keyPairResponse =ec2Client.create_key_pair(KeyName=keyPairName)
    

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

    keyresponse['KeyMaterial']
    

    【讨论】:

      【解决方案2】:

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

      希望我的回答对你有帮助!

      【讨论】:

        【解决方案3】:

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

        试试:

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

        【讨论】:

          【解决方案4】:

          让我们解释一下 AWS EC2 中的“KeyPair”。通常,人们会使用控制台生成一个密钥对,AWS 之后会给你私钥,并将公钥保存到你在 AWS 内部的密钥存储库中。

          启动 EC2 实例时,该过程将复制在您的账户 EC2 密钥对中找到的公钥,并将其放入实例操作系统的相应位置。 (例如 ~/.ssh/authorized_keys)

          您不能“即时”使用自己的密钥,启动器不会为您提供选项(原因稍后会显示)。如果您想使用自己的密钥,您必须首先将您的公钥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()来做。

          【讨论】:

            【解决方案5】:

            create_instances() 中的 KeyName 参数指的是在 AWS 中创建密钥对时赋予密钥对的名称。

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

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

            【讨论】:

            • 只是为了进一步解释......该命令不需要访问您在磁盘上的密钥对。相反,它将密钥对的名称发送到 EC2,然后 EC2 将访问已存储在 AWS 上的命名密钥对,并将在启动实例时使用。
            • @franklinsijo 我确实拥有密钥对。然而,我收到了这个错误。此外,当我创建一个没有 KeyName 属性的实例时,它会创建一个。但是,我在我的 EC2 仪表板中找不到它:/。 [我还交叉检查了访问密钥和秘密访问密钥]
            • 传递不带.pem 扩展名的参数。
            猜你喜欢
            • 2018-10-12
            • 2020-03-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-12-11
            • 2012-11-08
            • 2020-07-23
            • 1970-01-01
            相关资源
            最近更新 更多