簡體   English   中英

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

[英]How can I push AWS CodeCommit to S3 using Lambda?

Python是我的首選語言,但Lambda支持的任何語言都可以。 - 所有AWS架構 -

我在S3中有Prod,Beta和Gamma分支以及相應的文件夾。 我正在尋找一種方法讓Lambda響應CodeCommit觸發器並基於觸發它的分支,克隆repo並將文件放在適當的S3文件夾中。

  • S3://例-文件夾/應用/生產
  • S3://例-文件夾/應用/β
  • S3://例-文件夾/應用/伽瑪

我試圖利用GitPython,但它不起作用,因為Lambda沒有在基礎Lambda AMI上安裝Git,而GitPython依賴它。

我還瀏覽了Boto3文檔,只有監管任務可用; 它無法返回項目文件。

感謝您的幫助!

最新版本的boto3 codecommit包括方法get_differencesget_blob 您可以使用這兩種方法獲取codecommit存儲庫的所有內容(至少,如果您對保留.git歷史記錄不感興趣)。

下面的腳本獲取主分支的所有內容並將其添加到tar文件中。 之后你可以把它上傳到s3。 您可以將其作為lambda函數運行,可以在推送到codecommit時調用它。

這適用於當前的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

看起來像LambCI完全是你想要的。

在此輸入圖像描述

不幸的是,目前CodeCommit沒有用於將存儲庫上傳到S3存儲桶的API。 但是,如果您願意嘗試使用CodePipeline,則可以將AWS CodePipeline配置為使用AWS CodeCommit存儲庫中的分支作為代碼的源階段。 這樣,當您在CodePipeline中對所選跟蹤分支進行更改時,該分支頂端的存儲庫存檔將傳遞到您的CodePipelie存儲桶。 有關CodePipeline的更多信息,請參閱以下鏈接: http ://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-simple-codecommit.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM