Wie Automatisieren von Sicheren Lambda-Bereitstellungen von Git

0
202

Lambda hat eine web-basierte text-editor, die Sie haben wahrscheinlich verwendet, bevor Sie für das schreiben Ihrer Funktionen. Es ist ideal für Anfänger lernen Sie die Plattform, aber es ist nicht der beste Weg zu gehen über den Umgang mit updates. Hier ist, wie zu verfolgen Ihre Lambda-Funktionen auf Git.

, Wie CI/CD Für die Lambda Arbeitet

Anstelle des manuellen editor, sollten Sie entwickeln Ihre Funktionen lokal, commit und push-änderungen in einem Git-repo, und haben CodePipeline Griff Gebäudes und die Bereitstellung für Sie.

CodePipeline läuft automatisch, wenn es erkennt änderungen in Ihrer Quelle kontrollieren, und sendet die änderungen über CodeBuild (oder Jenkins) für Gebäude. Dieser Schritt ist optional, und Sie können nicht es verwenden, für Lambda, aber wenn Sie mit so etwas wie Maschinenschrift, müssen Sie diese Etappe. Nach dem Aufbau, werden änderungen, die zu CodeDeploy, die Griffe Bereitstellung.

CodeDeploy wird automatisch aktualisieren Sie Ihre Lambda-Funktionen und push eine neue version. Um den deployment-Prozess glatter ist, kann die Verschiebung der Verkehr allmählich über einen alias, bis 100% des Verkehrs ist in Richtung der neuen Funktion.

Die Verarbeitung der eigentlichen Implementierung, verwendet AWS CodeDeploy ist die Serverlose Anwendung Modell (SAM). SAM ist eine Erweiterung der CloudFormation -, eine Infrastruktur-as-code-service. Es ist im Grunde eine für den Menschen lesbare Daten-Serialisierung language (YAML) – Vorlage, die verwendet wird, um allen die Konfiguration Zusammenhang mit der Bereitstellung von Lambda-Funktionen und Ihre Voraussetzungen, und ist ein wichtiger Teil des seins in der Lage zu implementieren, die nur mithilfe von code.

Einrichten Der Quellcodeverwaltung

Dieser Schritt ist ziemlich einfach. Sie wollen ein neues Projekt erstellen Verzeichnis für alle Ihre code ein, und initialisieren Sie es mit Git. Die SAM-Vorlage gehen an der Wurzel des Verzeichnisses, named template.yml. Jede Funktion wird in einem eigenen Ordner, mit der Wurzel, index.js für jede. Dieser trennt klar alles, und macht es einfacher zu verwalten

Projektordner
|–template.yml
|–Funktion
| |–index.js
|–AnotherFunction
|–index.js

CodePipeline unterstützt Github und BitBucket für die Quellcodeverwaltung. Wenn Sie entweder von diesen, ist alles was Sie tun müssen, ist erstellen Sie einen neuen Zweig für Bereitstellungen (oder verwenden Sie einfach meistern, wenn Sie in Ordnung mit, dass). Wenn Sie einen anderen Dienst, Sie werden wollen, verwenden Sie die AWS-eigenen CodeCommit-source-control als sekundäre repository, schieben ändern, Wann immer Sie möchten, um Aktualisierungen vorzunehmen.

Schreiben einer SAM-Vorlage

Diesen Schritt werden die meisten kompliziert, und die meisten, die auf Ihre spezielle Funktion und deren Anforderungen. Sie müssen erstellen Sie eine SAM-Vorlage, konfigurieren Sie Ihre Lambda-Funktion und alle von Ihr benötigten Ressourcen.

Ein Basis-template wie folgt aussieht:

AWSTemplateFormatVersion: ‘2010-09-09’
Transformieren: AWS::Serverlose-2016-10-31
Beschreibung: Ein AWS-Serverlose Spezifikation template zur Beschreibung Ihrer Funktion
Ressourcen:
HelloWorld:
Typ: AWS::Serverlose::Funktion
Eigenschaften:
Handler: HelloWorld/index.handler
Laufzeit: nodejs8.10

Dies registriert eine Ressource, eine Lambda-Funktion, das läuft auf NodeJS und hat seine handler in HelloWorld/index.js.

Sie können die Bereitstellung anderer Ressourcen von SAM-Vorlage als gut. Zum Beispiel, zu geben, API-Gateway die Berechtigung zum aufrufen der Funktion, und stellen Ihre Funktion zur Ausführung auf einer bestimmten API-Pfad, fügen Sie die folgenden:

AWSTemplateFormatVersion: ‘2010-09-09’
Transformieren: AWS::Serverlose-2016-10-31
Beschreibung: Ein AWS-Serverlose Spezifikation template zur Beschreibung Ihrer Funktion
Ressourcen:
HelloWorld:
Typ: AWS::Serverlose::Funktion
Eigenschaften:
Handler: HelloWorld/index.handler
Laufzeit: nodejs8.10
Veranstaltungen:
HelloWorldApi:
Typ: Api
Eigenschaften:
Pfad: /helloworld
Methode: GET
HelloWorldPermission:
Typ: AWS::Lambda::Zustimmung
Eigenschaften:
Aktion: lambda:InvokeFunction
FunctionName:
Fn::GetAtt:
– HelloWorld
– Arn
AUFTRAGGEBER: apigateway.amazonaws.com
SourceArn:
Fn::Sub: arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:*/*/*/*

Sie brauchen definitiv mehr spezifisch verwendet als was kann hier aufgeführt werden, also für mehr Informationen über SAM Lesen Sie unseren Leitfaden für das arbeiten mit AWS-developer-guides, oder das vollständige schema auf Github.

Sobald Sie eine Vorlage arbeiten, können Sie testen, Bereitstellung von Installation des SAM CLI:

pip installieren aws-sam-cli

Dann, wirst du Paket für Ihr Projekt und speichern der Artefakte in einem S3-bucket:

sam-Paket
–template-Datei template.yml
–Ausgabe-Vorlage-Datei-Paket.yml
–s3-bucket, bucket-Namen

Und Sie führen Sie manuell die Bereitstellung:

sam deploy
–template-Datei-Paket.yml
–stack-Namen sam-Hallo-Welt –
–Funktionen CAPABILITY_IAM

Wenn alles richtig funktioniert, sollten Sie sehen, eine neue CloudFormation-Stacks und einer Anwendung, die im Lambda-Ausdruck mit Ihren Funktionen.

Verpackung und Bereitstellung des Projekt mit CodePipeline

Diese Phase ist nicht optional, auch wenn Sie nicht arbeiten mit einer kompilierten Sprache. Mithilfe der SAM-Vorlage, CodeBuild wird hier verwendet, um zu behandeln, Verpacken Sie das Projekt in etwas, das bereitgestellt werden kann, mit CodeDeploy sehr leicht. Optional können Sie andere Befehle aus, bevor Sie die Verpackung, wie npm ausführen, bauen und npm installieren.

Zunächst benötigen Sie eine Ausführung Rolle, die in der Lage Umgang mit der CloudFormation-updates. Öffnen Sie die IAM-Verwaltungskonsole zum hinzufügen einer neuen Rolle. Wählen Sie “CloudFormation”, wie die Ressource, die diese Rolle verwenden, befestigen Sie dann die “AWSLambdaExecute berechtigungsrichtlinie.

Speichern Sie die Rolle, öffnen Sie es, und fügen Sie die folgenden inline-policy:

{
“Statement”: [
{
“Action”: [
“apigateway:*”,
“codedeploy:*”,
“lambda:*”,
“cloudformation:CreateChangeSet”,
“iam:gab getrole”,
“iam:CreateRole”,
“iam:DeleteRole”,
“iam:PutRolePolicy”,
“iam:AttachRolePolicy”,
“iam:DeleteRolePolicy”,
“iam:DetachRolePolicy”,
“iam:PassRole”,
“s3:GetObject”,
“s3:GetObjectVersion”,
“s3:GetBucketVersioning”
],
“Ressource”: “*”,
“Effect”: “Allow”
}
],
“Version”: “2012-10-17”
}

Erstellen Sie eine neue pipeline aus dem CodePipeline Konsole. Wählen Sie die Standard-Einstellungen erstellen einer neuen service-Rolle. Diese wird automatisch konfiguriert werden.

Für die source-control-Stufe ein, wählen Sie Ihren source-control-Typ, repo -, und release-Zweig.

Für die build-Phase, werden Sie wollen, erstellen Sie ein neues Projekt in CodeBuild. Die Standard-Konfiguration ist in Ordnung, wählen Sie einfach Amazon Linux 2 als build operating system, und wählen Sie die standard-Laufzeit und standard-Bild.

Die wichtigste Sache, die Sie brauchen, um codePipeline ist Ihre buildspec.yml-Datei, abgelegt im root Ihres Projekt-Verzeichnis. Dies konfiguriert CodeBuild mit dem Befehle, die es braucht, um laufen. Die folgende Konfiguration ist ein Beispiel für die Installation von Typoskript, alle NPM-Pakete, läuft npm run bauen, und dann packt Sie alles für CloudFormation.

version: 0.2
Phasen:
installieren:
runtime-Versionen:
nodejs: 10
Befehle:
– npm install-g typescript
bauen:
Befehle:
– echo Bauen begann auf `Datum`
– npm-Installation
– npm run bauen
– export-EIMER=Typoskript-lambda
– aws cloudformation-Paket –template-Datei template.yml –s3-bucket $BUCKET – –Ausgabe-Vorlage-Datei outputtemplate.yml
Artefakte:
Typ: zip
Dateien:
– Vorlage.yml
– outputtemplate.yml

Sie werden wahrscheinlich brauchen, dies zu ändern, um Ihr Projekt anpassen.

Sobald das erledigt ist, können Sie konfigurieren Sie die Letzte Stufe. Anstatt CodeDeploy obwohl, wir werden CloudFormation verwenden, um aktualisieren Sie die Dinge direkt, wie alle der Verpackung passiert in der build-phase sowieso. Wählen Sie “CloudFormation”, wie die Bereitstellung provider, und legen Sie die action-Modus “erstellt oder ersetzt eine Reihe ändern.” Geben Sie einen neuen Namen ein, und ändern Sie set-Namen.

Für die Vorlage ein, wählen Sie “BuildArtifact,” und geben Sie in outputtemplate.yml aus dem vorherigen Schritt. Hinzufügen “- Funktion IAM”, um die Möglichkeiten, und wählen Sie die service-Rolle, die Sie manuell erstellt haben.

Klicken Sie auf “Erstellen” und Ihre pipeline sollte ohne Fehler ausgeführt. Jedoch, die CloudFormation der Bühne sorgt eine Gruppe ändern, das ist wie eine Vorschau der änderungen. Die tatsächliche Bereitstellung der änderungen, die wir brauchen, um ausführen die änderung festgelegt.

Klicken Sie auf “Bearbeiten” auf der erstellten pipeline. Unter “Bereitstellen” klicken Sie auf “Bearbeiten” und klicken Sie auf “Aktion Hinzufügen Gruppe”, nachdem die bereits angelegten Aktion. Wenn Sie erstellen die neue Aktion vor, den es wird nicht funktionieren.

Wählen Sie “CloudFormation” als Anbieter. Wählen Sie “BuildArtifact” als input-Artefakt. Für den action-Modus und ändern Sie set-Namen, geben Sie in die gleichen Werte, die Sie erstellt haben, für die erste Bereitstellung in Aktion.

Klicken Sie auf “Speichern”, und Sie werden zurück gebracht werden, um die pipeline-Hauptbildschirm zu gelangen. Klicken Sie auf “Version Ändern”, um manuell die pipeline erneut. Es sollte nun abgeschlossen, und die änderungen sollten sichtbar sein in der Lambda-Konsole.

Wenn Sie Fehler, es ist ziemlich leicht auf die Spur, wie Sie können klicken Sie auf “Mehr Details” neben der Fehlermeldung in CodePipeline. Es ist wahrscheinlich, dass Sie entweder einen fehlgeschlagenen build, eine unvollständige SAM Vorlage oder Unzureichende Berechtigungen für CodeBuild oder CloudFormation.

Wenn Sie änderungen an Ihrer Quelle kontrollieren, es sollte erkannt werden, indem CodePipeline, und starten Sie diesen ganzen Prozess wieder von vorne.