3

Python是我的首选语言,但是任何由Lambda支持的语言都可以。 - 所有AWS架构 -如何使用Lambda将AWS CodeCommit推送到S3?

我在S3中有Prod,Beta和Gamma分支和相应的文件夹。我正在寻找一种方法让Lambda响应CodeCommit触发器,并基于触发它的分支,克隆回购并将文件放入适当的S3文件夹中。

  • S3://例-文件夹/应用/生产
  • S3://例-文件夹/应用/β
  • S3://例-文件夹/应用/伽玛

我试图利用GitPython,但它不起作用,因为Lambda没有安装基于Lambda AMI的Git,并且GitPython依赖于它。

我也浏览了Boto3文档,并且只有保管任务可用;它无法返回项目文件。

谢谢你的帮助!

回答

1

不幸的是,目前CodeCommit没有上传存储库S3存储的API。但是,如果您愿意尝试使用CodePipeline,则可以将AWS CodePipeline配置为使用AWS CodeCommit存储库中的分支作为代码的源代码阶段。通过这种方式,当您在CodePipeline中对选定的跟踪分支进行更改时,该分支顶端的存储库存档将传送到您的CodePipelie存储桶。有关CodePipeline的更多信息,请参考以下链接: http://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-simple-codecommit.html

1

latest版本boto3 codecommit包括方法get_differencesget_blob。 您可以使用这两种方法获取codecommit存储库的所有内容(至少,如果您对保留.git历史记录不感兴趣)。

下面的脚本获取主分支的所有内容并将其添加到tar文件中。之后,您可以随意将其上传至s3。 您可以将其作为lambda函数运行,当您推送到codecommit时可以调用它。

这适用于当前lambda python 3.6 environmentbotocore==1.5.89 boto3==1.4.4

import boto3 
import pathlib 
import tarfile 
import io 
import sys 


def get_differences(repository_name, branch="master"): 
    response = codecommit.get_differences(
     repositoryName=repository_name, 
     afterCommitSpecifier=branch, 
    ) 
    differences = [] 
    while "nextToken" in response: 
     response = codecommit.get_differences(
      repositoryName=repository_name, 
      afterCommitSpecifier=branch, 
      nextToken=response["nextToken"] 
     ) 
     differences += response.get("differences", []) 
    else: 
     differences += response["differences"] 
    return differences 


if __name__ == "__main__": 
    repository_name = sys.argv[1] 
    codecommit = boto3.client("codecommit") 
    repository_path = pathlib.Path(repository_name) 
    buf = io.BytesIO() 
    with tarfile.open(None, mode="w:gz", fileobj=buf) as tar: 
     for difference in get_differences(repository_name): 
      blobid = difference["afterBlob"]["blobId"] 
      path = difference["afterBlob"]["path"] 
      mode = difference["afterBlob"]["mode"] # noqa 
      blob = codecommit.get_blob(
       repositoryName=repository_name, blobId=blobid) 
      tarinfo = tarfile.TarInfo(str(repository_path/path)) 
      tarinfo.size = len(blob["content"]) 
      tar.addfile(tarinfo, io.BytesIO(blob["content"])) 
    tarobject = buf.getvalue() 
    # save to s3 
+0

对不起,不应'afterCommitSpecifier ='master''与'afterCommitSpecifier = branch'在'get_differences'取代? – RomaValcer

+0

@RomaValcer好赶,谢谢! 我更新了片段 –