连接 Elastic Beanstalk 实例的 SSH

360

我刚刚注册了亚马逊的新弹性 Beanstalk 服务,但我不知道如何 SSH 到 Beanstalk 实例。因为 Beanstalk 是代表我生成实例的,所以我没有私钥。


那么,一旦我最终成功登录,我该如何进入推送git存储库的文件夹? - Evolve
2
以上的答案似乎有些过时。亚马逊现在有一个很好的文档,告诉你该如何操作。请按照上面的建议来创建密钥对。然后按照这个链接:<br><br> http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.ec2connect.html 祝你好运! - Jordan Michael Rushing
5
好的,如果您正在使用 ELB CLI 的新版本 V3,您可以执行 eb ssh - Sharoon Thomas
17个回答

603

我发现这是一个2步骤的过程。这假设你已经设置了密钥对来访问相关地区的EC2实例。

配置安全组

  1. 在AWS控制台中,打开EC2标签。

  2. 选择相关地区并单击安全组。

  3. 如果您在该地区启动了Elastic Beanstalk实例,则应该有一个名为elasticbeanstalk-default的安全组。

  4. 编辑安全组以添加SSH访问规则。以下内容将仅允许从特定IP地址进行入站访问。

SSH | tcp | 22 | 22 | 192.168.1.1/32

配置Elastic Beanstalk应用程序的环境

  1. 如果您还没有创建密钥对,请在EC2选项卡下的安全组中单击“密钥对”创建一个。
  2. 在AWS控制台中打开Elastic Beanstalk选项卡。
  3. 选择相关地区。
  4. 选择相关的环境。
  5. 选择左侧窗格中的“配置”。
  6. 选择“安全性”。
  7. 在“EC2密钥对:”下,在现有密钥对字段中选择密钥对的名称。

如果在这些步骤之后,您发现健康状态设置为降级

输入图像描述

那是正常的,它只意味着EC2实例正在更新。稍等几秒钟,它就会恢复正常。

输入图像描述

一旦实例重新启动,您需要从AWS控制台EC2实例选项卡或通过API获取主机名。然后,您应该能够ssh到服务器上。

$ ssh -i path/to/keypair.pub ec2-user@ec2-an-ip-address.compute-1.amazonaws.com

注意:如果要将密钥对添加到环境配置中,必须关闭实例的终止保护,因为Beanstalk将尝试终止当前实例并使用KeyPair启动新实例。

注意:如果有什么问题无法正常工作,请检查Beanstalk应用程序/环境中的“事件”选项卡,并找出出了什么问题。


48
这个答案比其他任何答案的投票数多两倍,技术上严谨,并且非常清晰。它有什么问题吗?为什么没有被接受? - user1311390
7
如果您按照上述说明操作仍然出现“Permission denied (publickey)”错误,可能是因为以下原因:如果您的EB设置启动了多个EC2实例,则必须检查哪一个获得了与其关联的密钥对。只能使用具有密钥对的实例进行SSH连接。您可以检查EC2实例菜单中的属性来找到它们的信息。 - Per Quested Aronsson
28
这里可能更改了界面。对我来说,第二个部分的第4步和第5步稍有不同。我必须选择相关的环境以打开其仪表板,然后在左侧选择“配置”。然后点击“实例”旁边的设置齿轮图标,会出现服务器设置页面。我可以从下拉菜单中选择一个EC2密钥对,这很方便。虽然如此,感谢您提供的好答案! - Dallin
14
使用ssh命令时,您需要指定私钥(.pem)文件和user_name@public_dns_name(不是公钥,因为答案通过.pub扩展名意味着公钥)。对于Amazon Linux,默认的用户名是ec2-user。对于RHEL5,用户名通常为root,但可能为ec2-user。对于Ubuntu,用户名是ubuntu。对于SUSE Linux,用户名是root。否则,请与您的AMI提供商进行核实。 - Yacc
6
此设置已移至“配置”下的“安全”选项卡中(因此在步骤6中,请选择“安全”而不是“实例”)。 - delucasvb
显示剩余12条评论

151

Elastic beanstalk CLI v3现在支持使用命令eb ssh进行直接SSH。例如:

eb ssh your-environment-name

没有必要费时费力地设置安全组或查找EC2实例地址。

还有一个很酷的技巧:

eb ssh --force

这将暂时强制将端口22对0.0.0.0开放,并保持该端口一直开放,直到您退出。这融合了一些最佳答案的好处,而没有麻烦。您可以暂时授予其他人访问权限以进行调试等操作。当然,您仍需要将他们的公钥上传到主机以使其能够访问。一旦您这样做了(并且只要您在eb ssh内部),其他人就可以

ssh ec2-user@ec2-xx-xxx-xxx-xx.compute-1.amazonaws.com

2
我刚刚自己安装了CLI v3,它工作得非常好。另外要说明的是,你可以通过在命令后添加环境来指定环境,例如 eb ssh production。你还可以使用设置选项来设置特定的环境,例如 eb ssh production --setup - jmera
1
嗯,不是所有人都拥有在~/.ssh目录下的私钥,这需要你已经有了私钥。如果你没有私钥,你仍然需要创建并下载一个,并在EB中进行设置。 - Jorge Orpinel Pérez
在Windows系统中,除了上述的操作步骤之外,我还需要通过“ssh-keygen -f aws-eb.pub -m "PEM" -e > aws-eb.pem”命令添加一个PEM文件。 - VectorVictor
2
这曾经是最好的解决方案,但 EB CLI 对 SSH 的处理方式存在两个问题。首先,它会向全世界开放22号端口。其次,如果SSH会话不正常终止,则22号端口将保持打开状态。现在,Amazon SSM 是更好的选择。 - Zags

55

关于在2013年8月使用linux客户端和简单的AWS Beanstalk安装(单个EC2实例)的经验如下(基于上面的社区Wiki):

配置安全组

  1. 在AWS控制台中,选择EC2进入EC2仪表板
  2. 通过单击左侧面板中的“实例”并选择要连接的实例(在我的情况下只有一个 - 称为默认环境),查找您的EC2实例所属的安全组。详细信息显示在页面底部-您应该看到安全组字段-记下名称-在我的情况下是“awsweb...”。
  3. 从左侧面板中选择安全组。
  4. 选择awsweb...安全组,详细信息应显示在页面底部
  5. 选择入站选项卡,并从“创建新规则”下拉列表中选择SSH。插入您要连接的本地计算机的IP地址/CIDR,例如192.168.0.12/32,然后单击“添加规则”和“应用规则更改”。

创建公私钥对

  1. 从EC2仪表板中选择左侧面板的密钥对
  2. 单击“密钥对”(顶部),然后输入名称,例如myname-key-pair-myregion或任何有效的密钥名称。
  3. 确认,然后接受浏览器下载的私钥,将其保存到您的主目录或任何您喜欢的位置。确保该目录仅对您具有写权限。

将公私钥对与Elastic Beanstalk EC2服务器相关联

  1. 要向Elastic Beanstalk EC2实例添加公私钥对,请执行以下操作:Services-> Elastic Beanstalk-> My App-> Default Environment会带您进入默认环境(其中您上传应用程序)
  2. 单击左侧面板上的“配置”,然后单击与“实例”关联的齿轮/齿轮
  3. 显示一个名为“服务器”的页面
  4. 从EC2密钥对中选择预构建的密钥对,然后保存
  • 出现警告消息,请重新保存。
  • 使用SSH连接AWS EC2实例

    1. 在终端会话中切换到包含您的私钥(.pem文件)的目录。
    2. 如果您尝试过几次,那么可能需要处理 .ssh/known_hosts,如果有此类文件,则重命名它。否则,您可能会收到关于主机标识已更改的错误消息。
    3. 执行:ssh -i ./myname-key-pair-my-region.pem ec2-user@ec2-some-address.us-west-2.compute.amazonaws.com

    祝好运


    4
    对于ssh命令,您需要指定私钥(.pem)文件和user_name@public_dns_name。对于Amazon Linux,默认用户名为ec2-user。对于RHEL5,用户名通常为root,但可能是ec2-user。对于Ubuntu,用户名是ubuntu。对于SUSE Linux,用户名是root。否则,请与您的AMI提供商进行确认。(来源:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html) - Yacc
    这个问题有最好的解释来添加密钥对部分。但我喜欢使用eb-cli来做SSH部分,因为它更简单。不过,我也点赞了这个回答。 - Nick

    36

    我也在尝试这个。

    1. 进入您的弹性Beanstalk服务选项卡
    2. 在应用程序概述中,选择操作-->编辑配置
    3. 在现有密钥对框中添加一个密钥名称(与同一区域中的EC2选项卡中显示的名称相同),然后点击“应用更改”

    服务将被重新启动,因此可以冲杯咖啡等待5分钟。

    在同一区域的EC2选项卡上,您将看到新的运行实例。使用第3步添加的密钥以ec2-user身份ssh连接到公共DNS名称,例如: ssh ec2-user@ec2-xx-xxx-xx-xxx.compute-1.amazonaws.com


    5
    加上 "ec2-user" 部分是我的问题... 这应该与上面的答案合并 ;). - Kirill Fuchs

    33

    'Instance Actions' 菜单中有一个方便的 'Connect' 选项,专门用于 EC2 实例。它将给出确切的 SSH 命令,以及正确的实例网址。Jabley 的整体说明是正确的。


    30

    以上答案有些过时。

    首先创建密钥对,然后将其附加到弹性 Beanstalk 环境。

    创建密钥对的步骤

    1. 登录 AWS
    2. 服务 -> EC2
    3. 在左侧的 NETWORK & SECURITY 下选择密钥对
    4. 选择创建新的密钥对,输入密钥名称并单击创建。 该密钥将自动下载到您的系统。

    将创建的密钥对附加到 Elastic Beanstalk 环境的步骤

    1. AWS -> 服务 -> 弹性 Beanstalk

    2. 选择您的环境,然后单击左侧的配置。

    3. 在配置概述中,从安全性中选择修改。

    4. 在虚拟机权限下选择我们创建的密钥对。

    5. 单击保存,然后单击保存配置。

    这需要一些时间才能反映到您的 EC2 实例上。


    10
    Amazon发布了一种更好的通过SSM(简单系统管理器)SSH到实例的方法。SSM中的Session Manager工具允许您仅使用AWS API密钥进行SSH。它比常规SSH更好,因为:
    • 不需要打开22号端口。
    • 它会记录SSH会话日志。
    • 不需要共享SSH密钥。凭据与IAM用户绑定,就像应该做的那样。
    • 它可以与没有公共IP地址且位于私有子网中的实例一起使用。

    设置您的弹性Beanstalk环境以允许通过AWS SSM进行SSH

    以下步骤需要每个环境执行一次。

    1. 进入Elastic Beanstalk > ENVIRONEMNT_NAME > Configuration > Security, 找到“IAM instance profile”(默认为“aws-elasticbeanstalk-ec2-role”)。在第二步中这将是ROLE_NAME。

    2. 进入IAM > Roles > ROLE_NAME。在权限下添加“AmazonSSMManagedInstanceCore”。

    3. 进入Systems Manager > Session Manager > Preferences > Edit。启用“Run As Support”,并将“Run As Default User”设置为“ec2-user”(或您的Elastic Beanstalk服务器的默认用户)。

    请注意,IAM更改可能需要一些时间(约10分钟)才能传播。如果您已完成AWS设置并收到“TargetNotConnected”错误,则等待10-15分钟后重试。

    使用AWS SSM进行SSH

    设置完毕后,现在有三种选项可供您如何SSH进入实例:

    1. 通过AWS Web控制台。转到AWS Systems Manager > Session Manager > Start Session。选择您想要SSH连接的机器。这将在您的浏览器中启动一个SSH终端。

    2. 使用AWS CLI。请参阅下面的“AWS CLI设置”说明。

    3. 使用eb-ssm。 eb-ssm是一个命令行工具,可以替换EB CLI命令eb ssh。它通过包装AWS CLI并在您的EB CLI配置上进行附加来完成此操作。请注意,eb-ssm还需要执行下面的“AWS CLI设置”步骤

    AWS CLI设置

    如果您想要使用AWS CLI或eb-ssm从终端进行SSH,请执行以下步骤。这些步骤需要每台计算机执行一次。

    1. 安装 AWS CLI:https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html

    2. 安装 Session Manager 插件:https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html


    免责声明:我是 eb-ssm 的主要作者。


    以下是一些先决条件的清单,供参考,列出了上述答案中设置部分的一些项目:https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-prerequisites.html - undefined

    9

    5

    在Mac上,您可以使用brew安装CLI:

    brew install awsebcli
    

    通过命令行工具,您可以使用以下命令进行ssh连接:

    eb ssh environment-name
    

    还可以执行其他操作。这假定您已经添加了一个安全组,该安全组允许从您的IP地址进行ssh连接。


    4

    您需要直接使用EC2实例的公共IP地址进行连接。您不能使用Elastic Beanstalk URL进行连接。

    您可以在EC2控制台中查找实例IP地址。

    您还需要确保端口22已打开。默认情况下,EB CLI在ssh连接完成后关闭端口22。您可以调用eb ssh -o以在ssh会话完成后保持端口打开。

    警告:您应该知道,Elastic Beanstalk随时可能替换您的实例。任何Elastic Beanstalk实例上的状态都无法保证。最好仅将ssh用于测试和调试目的,因为您修改的任何内容都可能随时消失。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接