我如何告诉我所有的 AWS EC2 实例从 git/codecommit 中提取?

How do I tell all my AWS EC2 instances to pull from git / codecommit?

我正在使用 AWS CodeCommit,它似乎是 git 的精简版。

如果所有这些 EC2 实例都具有相同的角色标签,我该如何实现?

我不想做任何花哨的事情,我只想指定一个标签,单击一个按钮,所有带有该标签的 EC2 实例将用于 CodeCommit。我想在我的本地机器上执行此操作。

我知道我需要将 SSH 密钥放入我的每台 EC2 服务器中以访问 CodeCommit,并在每台服务器上安装 git(我会将其烘焙到 AMI 中)。我只是不确定如何 "trigger" 每台 EC2 机器进行 git 拉取?有AWS命令吗?

我不是开发人员,只知道基本的 linux 和 php。

最接近 AWS 托管服务的是 CodeDeploy。有了它,您可以通过命令行或 Web 控制台在 EC2 实例中编排部署。但是到目前为止,CodeDeploy 只是从 S3GitHub 中提取工件。到目前为止,CodeCommit 似乎与其他相关的亚马逊服务完全隔离,例如 CodePipelineCodeDeploy,所以好像不是一个好的选择。但是,当然,亚马逊的路线图是整合所有这些(不这样做是没有意义的)。所以,现在,你最好使用 GitHub 而不是 CodeCommit.

但是,考虑到您没有使用 GitHub,那么您需要一个 CI(持续集成) 存储库和 CodeDeploy 之间的解决方案,从源代码中提取代码,可能构建或 运行ning 测试,将其推送到 S3 和告诉 CodeDeploy 这件事。 CodeShip, for example, which can do that, and integrates with a lot of external services. Or you could even have your own CI server, like Jenkins 正在为您扮演 "glue" 的角色。 (Jenkins 可能是最灵活的,因为它是开源的并且可能有适用于所有内容的插件。)

所以,稍微分解一下,您的工作流程将是这样的:

  • 将代码推送到您的存储库;
  • 只要有事件发生(某个分支上的提交,或者新标签,它应该是可配置的),你的 CI 拉它,运行 无论你想要或需要什么(构建、测试、打包),并将其推送到 S3(通常作为 tarball 文件);
  • 根据您的设置方式,您的 CI 告诉 Code Deploy 将其部署到您的 EC2 实例,或者它只是告诉它有一个可用的新版本,并允许您随时通过 Web 控制台上的 CLI 手动触发部署。

(实际上,CodeDeploy 不会将代码推送到 EC2 个实例。相反,每个 EC2 实例必须 运行 一个定期汇集 CodeDeploy 服务器的代理,以便知道是否有新的东西要在本地应用。无论如何,CodeDeploy 协调并从代理那里获得反馈,所以它的工作方式就好像它在 CodeDeploy 端是 100% 活跃的,在实例端是 100% 被动的。)

最 "clean" AWS 解决方案是 CodeCommit -> CodePipeline -> CodeDeploy,或者 CodeCommit -> CodeDeploy,但这些服务现在还没有完全集成。

对于您的情况,目前最简单可行的解决方案是 Github -> CodeDeploy。任何与此不同的东西都需要一些中间步骤,比如我提供的示例(CodeShipJenkins 等)。

对于使用 IAM 角色启动的 EC2 实例,您甚至不必内置 SSH 密钥。 Git 可以从 EC2 实例元数据中获取 CodeCommit 凭证。使用最新的 AWS CLI 包和 ~/.gitconfig 中的以下行烘焙基于 Linux 的 AMI:

[credential]
    helper = !aws --profile default codecommit credential-helper $@
    UseHttpPath = true

启动附加了 IAM 角色的实例,然后您无需任何设置即可克隆您的 CodeCommit 存储库。

如果您想要 运行 git 基于标签跨 EC2 实例队列的命令,您可能需要查看 Capistrano and Capify-EC2

更新: 如果您愿意使用 AWS OpsWorks 从 CodeCommit 进行部署,则可以使用 Capistrano recent blog article about how to do that. You can also use OpsWorks to run arbitrary commands 跨实例。