如何连接到 Elastic Load Balancer 后面的特定实例

Posted

技术标签:

【中文标题】如何连接到 Elastic Load Balancer 后面的特定实例【英文标题】:How to connect to specific instance behind Elastic Load Balancer 【发布时间】:2016-01-01 05:00:01 【问题描述】:

我正在通过 Elastic Beanstalk 部署我的应用程序,它会创建 Elastic 负载均衡器并将我的所有实例都放在它后面(3 个或更多)。

有没有办法直接联系这些实例?我想在每个实例上触发一个特定的命令(git pull 命令与我的远程仓库中的最新代码同步)。

我有来自php SDK 的实例的 IP 地址和公共 DNS 列表,但由于防火墙规则将 IP 地址的来源限制为端口 80 上的弹性负载均衡器 IP,我似乎无法直接访问它们.

有办法解决吗?

附: SSH 端口似乎对所有流量都开放,但我怎样才能创建一个触发器呢?我希望创建一个 PHP 脚本,通过远程 repo 上的 webhook 自动执行此操作。

【问题讨论】:

【参考方案1】:

我强烈建议您在所有部署中使用带有 git 集成的 EB CLI,无论多么小。这很棒,因为您可以使用 eb use YOUR_ENV 将 git 分支映射到环境,然后当您运行 eb deploy 并检查该分支时,它将部署到该环境。

要确保多台服务器提取正确的代码并且一切都按预期工作,需要做很多工作。如果服务器正在启动但还没有为 SSH 做好准备,因此您的脚本跳过了它并且它没有获取新代码怎么办?

另外,当新服务器启动但它使用旧应用程序时会发生什么,因为那是 EB 中的内容?你可以让你的 kickstart 做一个 git pull 但是当你还没有准备好推送时会发生什么,一个新的服务器启动并且单独使用新代码?

我可能不费吹灰之力就可以再找到 5 个边缘案例。看看eb deploy,你会很高兴的。

【讨论】:

嗨,这可以用 AWS php sdk 完成吗?我问是因为这个东西在客户端机器上运行,需要从管理区域的页面执行 这是从命令行运行的,可能有 SDK 工具,但我对此表示怀疑。您可以使用 exec() 之类的东西从 php 中触发它。运行它的服务器应该有一个独立的代码库,这样你就可以从 git 中提取然后部署。它看起来像exec("cd /path/to/code && git pull && eb deploy")。我质疑客户端从基于 Web 的工具部署的用例,并建议工程师处理它,但你可能有你的理由。【参考方案2】:

您需要设置一个 CI(或制作一个简单的 Web 服务)并在您的存储库中创建一个 Webhook。您的 CI 需要获取 Elastic Beanstalk 环境下的所有实例,然后通过 SSH 调用 git pull

或者,只需通过 .ebxensions 脚本在所有实例中创建一个 cron 作业。

我认为在 Elastic Beanstalk 中运行 git pull 以将您的应用程序与您的 git 存储库同步并不是一个好的做法。因为,它误用了 Application Version 语义。有时,您无法从 应用程序版本 确定您的实例中的应用程序版本。最好在 Elastic Beanstalk 中创建一个新的 Application Version 来部署新的应用程序版本。

如果你在 Github 中托管你的 repo,你可以查看CodeDeploy。

【讨论】:

嗨,谢谢您的回答.. 我会尝试更多地研究 CI 和 SSH.. 关于 CodeDeploy 我也想到了这一点,但后来我在亚马逊博客上读到“CodeDeploy 是针对直接管理其 EC2 实例的客户,而不是使用 AWS Elastic Beanstalk 等应用程序管理服务的客户”。我实际上正在使用 AWS Elastic Beanstalk,它并没有说明您在使用 beantalk 时应该使用什么(我绝对可以上传新的应用程序版本,但这对于像这里或那里的一行代码这样的小修复来说太麻烦了,简单的错误修复)[1] goo.gl/nEVcwU “我绝对可以上传新的应用程序版本,但是对于小修复来说太麻烦了” - 但那你的应用程序的一个新版本,所以你应该这样做.如果您不想这样做,那么您可能不应该使用 Beanstalk 或 CodeDeploy。而是手动部署,并使用 Fabric 或类似工具通过 SSH 推送更新。

以上是关于如何连接到 Elastic Load Balancer 后面的特定实例的主要内容,如果未能解决你的问题,请参考以下文章

Elastic Load Balancing 非终止 SSL 连接上的代理协议

无法从 Elastic Beanstalk Docker 连接到 RDS

将现有 RDS 连接到 Elastic Beanstalk

将 ElastiCache 连接到 Elastic Beanstalk 实例

无法连接到 Elastic Beanstalk 上的 ActionCable

Amazon AWS Elastic Beanstalk - 连接到 mongodb