如何使用Lambda将AWS CodeCommit推送到S3?

问题描述 投票:6回答:3

Python是我的首选语言,但Lambda支持的任何语言都可以。 - 所有AWS架构 -

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

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

我试图利用GitPython,但它不起作用,因为Lambda没有在基础Lambda AMI上安装Git,而GitPython依赖它。

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

感谢您的帮助!

python amazon-web-services amazon-s3 aws-lambda aws-codecommit
3个回答
3
投票

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

1
投票

看起来像LambCI确实你想要的。

enter image description here


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.