无法使用密钥对创建 EC2 实例以进行 ssh 访问

无法使用密钥对创建 EC2 实例以进行 ssh 访问

我正在尝试在 AWS 上启动一个安装了 Docker 的新 EC2 实例。稍后我需要通过 SSH 进入此实例。我可以毫无问题地创建它:

docker-machine create --driver amazonec2 --amazonec2-region=eu-central-1 machine-ec2

这将创建一个新机器以及一个密钥对。问题是它不会下载我稍后需要的 .pem 文件以便通过 ssh 进入它。

因此,我尝试使用现有密钥对创建一台新机器。我创建了一个密钥对,然后下载它,将其复制到我的 ./ssh/aws 文件夹并运行:

docker-machine create --driver amazonec2 --amazonec2-keypair-name=machine-aws-keypair --amazonec2-ssh-keypath=~/.ssh/aws/ --amazonec2-region=eu-central-1 machine-ec2

这给了我错误:

Error creating machine: Error in driver during machine creation: unable to create key pair: open ~/.ssh/aws/: no such file or directory
equally: docker-machine create --driver amazonec2 --amazonec2-keypair-name=machine-aws-keypair --amazonec2-ssh-keypath=~/.ssh/aws/nameofmykeyfile.pem --amazonec2-region=eu-central-1 machine-ec2

是我做错了什么还是 AWS 的问题?我认为是前者... 有什么办法可以解决这个问题吗?非常感谢您的帮助。提前致谢!

编辑:当通过终端创建新实例时,知道如何获取我的 privatekey.pem 就足够了……

答案1

我创建了一个密钥对,然后下载它,将其复制到我的 ./ssh/aws 文件夹并运行:

此路径表示(当前目录)ssh下的文件夹.

无法创建密钥对:打开 ~/.ssh/aws/:没有此文件或目录

此路径表示位于(您的主目录).ssh下的文件夹。 尝试将密钥放入 ~/.ssh/aws/ 中,看看是否有帮助。~

答案2

如果密钥对不存在(在所需的 AWS 区域中),可以使用 aws-cli 创建

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/create-key-pair.html

例如,假设您的 AWS 凭证已启用,并且您的 IAM 权限允许创建密钥对:


KEY_NAME=your-unique-name

export AWS_DEFAULT_REGION=us-west-2
export AWS_KEYPAIR_NAME="${KEY_NAME}-${AWS_DEFAULT_REGION}"
export AWS_SSH_KEYPATH="${HOME}/.aws"

aws ec2 create-key-pair \
    --key-name "${AWS_KEYPAIR_NAME}" \
    --query "KeyMaterial" \
    --output text > \
    "${AWS_SSH_KEYPATH}"/"${AWS_KEYPAIR_NAME}.pem"

chmod 400 "${AWS_SSH_KEYPATH}"/"${AWS_KEYPAIR_NAME}.pem"

ssh-keygen -y -f \
    "${AWS_SSH_KEYPATH}"/"${AWS_KEYPAIR_NAME}.pem" > \
    "${AWS_SSH_KEYPATH}"/"${AWS_KEYPAIR_NAME}.pub"

然而,也许最好的做法是允许 docker-machine 管理 ssh 密钥,而不是试图指示它使用特定密钥。这可以以更安全的方式隔离对每台机器的访问,并减轻用户管理 ssh 密钥的负担。

通用 ssh 密钥的一个优点是能够使用并行 ssh。一个简单的替代方法是使用 bash 循环。(例如,我不知道 capistrano 的解决方案。)例如,假设几台机器有一个通用的机器名前缀和一个数字后缀:

machine_prefix="my-machines"
for n in $(seq 1 6);
do
  docker-machine ssh "${machine_prefix}-00$n" 'echo $(hostname)'
done

https://github.com/dazza-codes/docker-machine-ec2/blob/master/ec2_spinup.sh#L87-L94例如,创建具有通用机器名称前缀的机器(假设 docker-machine 是首选解决方案,而不是 docker swarm、AWS Batch、AWS Labmda、k8s 等)。

答案3

留给未来遇到同样问题的读者:

因此,AWS 使用命令行创建实例时实际上会创建一个密钥对并将其下载到本地计算机。

要找到它的位置,可以:

列出所有 docker-machinesdocker-machine ls 检查 EC2 实例的机器docker-machine inspect machinename

这会给你类似的东西:

{
    "ConfigVersion": 3,
    "Driver": {
        "IPAddress": "3.124.195.229",
        "MachineName": "machine-ec2",
        "SSHUser": "xxx",
        "SSHPort": xxx,
        "SSHKeyPath": "pathtokey/id_rsa",
        "StorePath": "/Users/username/.docker/machine",
        ....


}

要通过 ssh 进入 EC2 实例,请执行以下操作:

ssh -i "pathtokey/id_rsa" ubuntu@endpointofyourec2instance

你应该参加。

相关内容