Eine Pipeline für Lambda mit AWS CodeStar erstellen

Keine Kommentare

Im ersten Teil dieser Serie haben wir uns angesehen, wie wir das Alexa Skills Kit nutzen können, um einen Alexa Skill zu erstellen. In diesem Teil erstellen wir eine Deployment Pipeline für die Lambda Funktion, die die Funktionalität unseres Skills ausmacht. Dazu werden wir AWS CodeStar nutzen, denn durch CodeStar bekommen wir einerseits eine komplette Pipeline erzeugt und wir erhalten bereits Boilerplate Code in unserer Lambda, um direkt in die Entwicklung unseres Alexa Skills einzusteigen. Die Deployment Pipeline können wir dann in dem für uns erstellten CloudFormation Template nach unseren Wünschen anpassen.

Die Pipeline wäre für eine einfache Lambda nicht unbedingt nötig. Man könnte auch die Kommandozeile nutzen, um die Lambda zu deployen oder sie manuell per Zip-Datei in der AWS Konsole hochladen. Wenn das Projekt jedoch größer wird und mehrere Personen an der Lambda arbeiten, ist es von Vorteil, wenn z.B. Unit-Tests per CodeBuild ausgeführt werden und man auch mehrere Stages für Produktion und Development einrichten kann.

CodeStar Projekt erstellen

Eines gleich vorneweg: Wir müssen das CodeStar Projekt in der Region “EU (Ireland)” erstellen, weil wir sonst als Trigger der Lambda nicht das Alexa Skills Kit auswählen können.

AWS CodeStar Startseite

Wir erstellen in CodeStar ein neues Projekt.

CodeStar Service Roller erstellen

Wir werden aufgefordert, für CodeStar eine neue Rolle anzulegen, sodass CodeStar in der Lage ist, weitere Ressourcen wie die Lambda oder ein CodeCommit Repo zu erstellen. Wir können das einfach mit “Yes, create role” bestätigen.

Alexa Skill als Codestar Template

Im nächsten Dialog wählen wir das CodeStar Template. Dazu suchen wir links im Suchfeld nach “Alexa” und wählen dann den “Fact Skill” aus. Dieser bietet uns schon etwas Boilerplate Code innerhalb der Lambda und konfiguriert die Lambda Trigger entsprechend unserer Bedürfnisse. Man könnte auch einen der anderen Alexa Skill Templates nutzen und würde einfach einen anderen Boilerplate Code in der Lambda bekommen.

Codestar Repository wählen

Dann wählen wir den Projektnamen “WebsiteNavigator” und nutzen AWS CodeCommit für unser Git-Repository.

CodeStar Review

Anschließend sehen wir, wie die Pipeline aussehen wird, was wir mit einem Klick auf “Create Projekt” wohlwollend hinnehmen.

Codestar Repository URL kopieren

Im nächsten Dialog sehen wir bereits die URL für unser Repository am unteren Ende. Die Konfiguration einer IDE können wir überspringen durch einen Klick auf “Skip”.

CodeStar Pipeline Fortschritt

Das war auch schon Alles. In den nächsten Minuten wird unsere Deployment Pipeline das erste Mal durchlaufen und unsere Lambda wird erzeugt und mit dem Boilerplate Code initialisiert. Wir können dem Status der Pipeline zusehen, wenn wir im Dashboard des CodeStar Projektes nach unten scrollen. Alternativ können wir in der linken Navigationsleiste auch auf den Punkt “Pipeline” klicken und sehen dort noch ein paar mehr Details.

Wenn die Pipeline durchgelaufen ist und alle Boxen grün sind, können wir uns einmal die Lambda anschauen, die für uns angelegt wurde. Wir wechseln dazu auf den AWS Service “Lambda” im Hauptmenü.

Codestar Lambda umbenennen

Die Lambda hat einen etwas kryptischen Namen, aber den können wir noch anpassen. Leider sind die Einstellungen für die Lambda noch nicht optimal. Zum Beispiel läuft die Lambda standardmäßig mit Node.js 4.3, obwohl es schon die neuere Version 8.10 gibt. Dies und andere Sachen werden wir noch kurz anpassen.

Die template.yml anpassen

Wir klonen uns nun das neu erstellte CodeCommit Repository mit dem Befehl:
git clone https://git-codecommit.eu-west-1.amazonaws.com/v1/repos/WebsiteNavigator

Damit das funktioniert, müssen wir zuerst die AWS CLI und unsere Credentials richtig eingerichtet haben. Hier nochmal der Link mit einer Anleitung: https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up.html

Wenn wir uns den Code dann ansehen, ist alles noch recht übersichtlich:

Codestar Alexa Template Struktur

Wir öffnen nun die template.yml, um die Einstellungen für die Lambda anzupassen.

template.yml
AWSTemplateFormatVersion: 2010-09-09
Transform:
- AWS::Serverless-2016-10-31
- AWS::CodeStar
 
Parameters:
  ProjectId:
    Type: String
    Description: AWS CodeStar projectID used to associate new resources to team members
 
Resources:
  AlexaSkillFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10      Timeout: 10      FunctionName: website-navigator      Role:
          Fn::ImportValue:
              !Join ['-', [!Ref 'ProjectId', !Ref 'AWS::Region', 'LambdaTrustRole']]
      Events:
          AlexaSkillEvent:
                Type: AlexaSkill

Was wir hier sehen, ist ein CloudFormation Template, das Codestar für uns erzeugt hat. Es ist mit dem Serverless Application Model, kurz SAM, geschrieben. Die Befehle sind ein wenig kompakter gegenüber den normalen CloudFormation Befehlen. Dieses Template definiert unsere Lambda Funktion als Resource und konfiguriert als Trigger das Event mit dem Typ “AlexaSkill”. Dadurch wird unsere Lambda mit dem Alexa Skill Kit Trigger erstellt. Weitere Infos zu SAM gibt es hier: https://github.com/awslabs/serverless-application-model

Wir ändern den Wert für die Runtime von nodejs4.3 auf nodejs8.10 und fügen die Werte Timeout: 10 und FunctionName: website-navigator hinzu.

Warum ändern wir die Werte? Mit Node 8.10 haben wir mehr ES6 Features, die uns beim Programmieren das Leben etwas leichter machen. Das Timeout von 10 Sekunden ist notwendig, da wir Requests zu externen Servern machen werden und dafür Promises nutzen. Wenn die Promises resolved werden, erzeugen wir die Antwort für Alexa. Bei zu geringem Timeout (der Default sind 3 Sekunden) könnte unsere Lambda-Funktion sonst Gefahr laufen, vorzeitig beendet zu werden, ohne dass eine Antwort an Alexa gesendet wurde. Der FunctionName benennt unsere kryptische Lambda Funktion einfach um.

Wenn wir den Code einchecken und pushen, geht unsere Pipeline wieder los und die Lambda Funktion wird aktualisiert.

Lambda Übersicht neuer Name

Nach der Aktualisierung hat unsere Funktion in der Liste der Lambda Funktionen den erwarteten Namen.

Damit ist unsere Pipeline komplett. Im nächsten Schritt werden wir die Lambda anpassen und die Logik für unseren Alexa Skill implementieren.

Bei Fragen oder Anregungen freue ich mich über einen Kommentar.

René Bohrenfeldt

René Bohrenfeldt ist seit mehr als 10 Jahren in der Software-Entwicklung tätig und fokussiert sich dabei hauptsächlich auf Frontend-Technologien. Bei der codecentric AG setzt er als IT-Consultant sowohl sein Entwicklungs-Know-how als auch seine Kommunikationsstärke als PO und Moderator ein.
Darüber hinaus engagiert sich der studierte Betriebswirt unternehmerisch und ist Mitgründer einer Busvermietung in Berlin.

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.