3

Python ist meine bevorzugte Sprache, aber jede von Lambda unterstützt wird tun. - Alle AWS-Architektur -Wie kann ich AWS CodeCommit mit Lambda an S3 senden?

Ich habe Prod, Beta und Gamma Zweige und entsprechende Ordner in S3. Ich bin auf der Suche nach einer Methode, mit der Lambda auf einen CodeCommit-Trigger reagieren kann und basierend auf dem Branch, der den Trigger ausgelöst hat, den Repo klont und die Dateien in den entsprechenden S3-Ordner legt.

  • S3: // Beispiel-Ordner/Programme/Zubehör
  • S3: // Beispiel-Ordner/Programme/Beta
  • S3: // Beispiel-Ordner/Programme/Gamma

Ich habe versucht, GitPython zu verwenden, aber es funktioniert nicht, da Lambda Git nicht auf der Basis von Lambda AMI installiert hat und GitPython davon abhängt.

Ich habe auch die Boto3-Dokumente durchgesehen und es sind nur Aufgaben für die Aufbewahrung verfügbar; Es ist nicht möglich, die Projektdateien zurückzugeben.

Vielen Dank für die Hilfe!

Antwort

0

Sieht aus wie LambCI tut genau das, was Sie wollen.

enter image description here

1

leider derzeit CodeCommit nicht über eine API auf das Repository S3 Eimer hochladen. Wenn Sie jedoch CodePipeline ausprobieren möchten, können Sie AWS CodePipeline so konfigurieren, dass eine Verzweigung in einem AWS CodeCommit-Repository als Quellcode für Ihren Code verwendet wird. Wenn Sie in CodePipeline Änderungen an Ihrem ausgewählten Verfolgungszweig vornehmen, wird auf diese Weise ein Archiv des Repositorys an der Spitze dieses Zweigs an Ihren CodePipelie-Bucket übermittelt. Weitere Informationen über CodePipeline entnehmen Sie bitte folgenden Link: http://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-simple-codecommit.html

1

Die latest Version des boto3 codecommit umfasst die Methoden get_differences und get_blob. Sie können den gesamten Inhalt eines Codecommit-Repositorys mit diesen beiden Methoden abrufen (zumindest, wenn Sie nicht daran interessiert sind, den .git-Verlauf beizubehalten).

Das folgende Skript nimmt den gesamten Inhalt des Master-Zweigs und fügt es zu einer TAR-Datei hinzu. Danach könntest du es auf s3 hochladen, wie es dir gefällt. Sie können dies als eine Lambda-Funktion ausführen, die aufgerufen werden kann, wenn Sie auf Codecommit drücken.

Dies funktioniert mit dem aktuellen lambda python 3.6 environment. 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 
+0

Sorry, sollte nicht 'afterCommitSpecifier = 'master'' mit' afterCommitSpecifier = branch' in 'get_differences' ersetzt werden? – RomaValcer

+0

@RomaValcer guten Fang, danke! Ich habe das Snippet aktualisiert –

Verwandte Themen