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好趕,謝謝! 我更新了片段 –