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

Sha*_*awn 6 python amazon-s3 amazon-web-services aws-lambda aws-codecommit

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

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

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

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

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

感谢您的帮助!

Sam*_* vL 5

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

下面的脚本获取 master 分支的所有内容并将其添加到 tar 文件中。之后,您可以随意将其上传到 s3。您可以将其作为 lambda 函数运行,该函数可以在您推送到代码提交时调用。

这适用于当前的lambda python 3.6 环境botocore==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
Run Code Online (Sandbox Code Playgroud)


jay*_*aym 1

看起来LambCI正是你想要的。

在此输入图像描述