如何让我所有的AWS EC2实例从git / codecommit拉取代码?

8
我正在使用AWS CodeCommit,它看起来像是一个简化版的git。
如果所有这些EC2实例都有相同的角色标签,我该如何完成此操作?
我不想做任何花哨的事情,我只想指定一个标签,点击一个按钮,所有具有该标签的EC2实例都会从CodeCommit拉取。我想从我的本地计算机上执行此操作。
我知道我需要在每个EC2服务器中放置访问CodeCommit的SSH密钥并安装git(我将将其制作成AMI)。我只是不确定如何“触发”每个EC2机器进行git拉取?是否有AWS命令可用?
我不是一个dev ops人员,只知道基本的linux和php。
2个回答

13

对于使用 IAM 角色启动的 EC2 实例,您甚至不需要内置 SSH 密钥。Git 可以从 EC2 实例元数据获取 CodeCommit 凭据。使用最新的 AWS CLI 包和以下内容在 ~/.gitconfig 中创建一个基于 Linux 的 AMI:

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

启动附带IAM角色的实例,然后您就可以克隆CodeCommit存储库而无需进行任何其他设置。
如果您想基于标签在一组EC2实例上运行git命令,则可能需要查看CapistranoCapify-EC2
更新: 如果您愿意使用AWS OpsWorks从CodeCommit部署,则有一篇最近的博客文章介绍如何做到这一点。 您还可以使用OpsWorks通过Capistrano在实例之间运行任意命令

我希望在我提出这个问题的时候就有这个答案。最终,我使用了Fabric在我的EC2集群上运行git clone命令。 - Hard worker
1
如果有人尝试这个过程并且遇到了“找不到默认配置文件”的问题,请尝试使用''指定一个空白配置文件。您的配置文件可能/应该存储在EC2实例上的环境变量$AWS_DEFAULT_PROFILE中。 - scrowler
2
@RobbieAverill 你可以完全省略 --profile default 这一部分(正如你所说,如果没有默认配置文件,则将其设置为默认值是无效的)。 - Tom Wadley

4
使用AWS托管服务,最接近的是CodeDeploy。通过它,您可以通过命令行或Web控制台编排EC2实例的部署。但是,CodeDeploy目前只从S3或GitHub拉取构件。到目前为止,CodeCommit似乎完全与其他相关的Amazon服务(如CodePipeline和CodeDeploy)隔离,因此不是一个好选择。但是,当然,亚马逊的路线图是将所有这些服务集成在一起(不这样做是没有意义的)。因此,现在,您最好使用GitHub而不是CodeCommit。

但是,考虑到您没有使用 GitHub,那么您需要在代码库和 CodeDeploy 之间使用一个 CI(持续集成)解决方案,从源代码获取代码,可能进行构建或运行测试,将其推送到 S3 并告知 CodeDeploy。例如,有 CodeShip 可以完成此操作,并与许多外部服务集成。或者您甚至可以拥有自己的 CI 服务器,如 Jenkins,为您执行 "粘合" 角色。(Jenkins 可能是最灵活的,因为它是开源的,可能有适用于所有功能的插件。)

因此,简单分解一下,您的工作流程可能如下:

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

(实际上,CodeDeploy不会将代码推送到EC2实例。相反,每个EC2实例必须运行代理程序,定期轮询CodeDeploy服务器,以了解是否有新内容可在本地应用。无论如何,CodeDeploy协调并从代理程序获取反馈,因此它就像在CodeDeploy方面100%活动,在实例方面100%被动一样工作。)

最为“干净”的AWS解决方案是CodeCommit -> CodePipeline -> CodeDeploy,或者仅使用CodeCommit -> CodeDeploy,但这些服务目前尚未完全集成。
在您的情况下,现在最简单可行的解决方案是Github -> CodeDeploy。除此之外,其他任何解决方案都需要一些中间步骤,比如我提供的示例(CodeShipJenkins等)。

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