AWS Serverless Application Repository

October 12, 2020

Der Artikel über AWS Secrets Manager und automatische Rotation für Passwörter nutzt zum Schnellstart am Ende des Artikels eine spezielle URL um den vorgestellten CloudFormation Stack in einen AWS zu deployen, bzw. das Deployment des CloudFormation Stacks soweit möglich vorzubereiten. Eine Alternative zu den CloudFormation Links ist das AWS Serverless Application Repository. Dort können wiederverwendbare CloudFormation Templates zur mehrfachen Verwendung veröffentlicht werden.

Wieso wiederverwendet?

Eine der grundlegenden Ideen einer serverless Architektur ist die Vermeidung von überflüssiger Verantwortungen. Sei es durch das Betreiben von Servern, oder auch das Reimplementieren von vorhandener Logik. Mit dem Ansatz Functions as a Service lässt sich Business Logik in kleine Logikblöcke aufbrechen.

Die Wiederverwendung der erstellen Logikblöcke stellt dabei meist die komplizierte Aufgabe dar, als das Bereitstellen. Für beides kommt nun das AWS Serverless Application Repository in Spiel.

Aber zuerst: Wie funktionieren eigentlich die Deep Links in CloudFormation?

Um Templates für AWS CloudFormation zu veröffentlichen, die als URL Parameter übergeben werden können, müssen diese in einem öffentlichen S3 Bucket liegen. Mit CloudFormation lässt sich ein S3 Bucket und die notwendige BucketPolicy wie folgt anlegen.

PublicBucket:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: !Sub superluminar-templates-${AWS::Region}
    AccessControl: PublicRead

PublicBucketPolicy:
  Type: AWS::S3::BucketPolicy
  Properties:
    PolicyDocument:
      Id: PublicBucketPolicy
      Version: 2012-10-17
      Statement:
        - Sid: PublicReadForGetBucketObjects
          Effect: Allow
          Principal: "*"
          Action: "s3:GetObject"
          Resource: !Sub ${PublicBucket.Arn}/*
    Bucket: !Ref PublicBucket

Alle Dateien bzw. CloudFormation Templates in diesen öffentlichen S3 Bucket können nun benutzt werden, um den Dialog zum Anlegen eines neuen CloudFormation Stacks bereits vorzubefüllen, sodass der:die Benutzer:in nur noch das Deployment bestätigen muss. Das Schema der URL entspricht folgenden Schema:

https://console.aws.amazon.com/cloudformation/home?region=$AWS_REGION#/stacks/quickcreate?stackName=$STACK_NAME&templateURL=$URL_TEMPLATE

Auch Parameter können bei Bedarf vordefiniert werden. Das CloudFormation Template zum AWS Secrets Manager mit automatischer Rotation für Passwörter erwartet zwei Parameter: SecretName und RotationPeriodInDays. In der obigen URL sind diese nicht vordefiniert, da die Parameter auch über die AWS Management Console gesetzt werden können.

Serverless Application Repository

Vorhandene CloudFormation Templates können mit dem SAM CLI im AWS Serverless Application Repository veröffentlicht werden. Alle notwendigen Information für diesen Vorgang müssen als Metadata im CloudFormation Template der restlichen Ressourcen angegeben werden:

Metadata:
  AWS::ServerlessRepo::Application:
    Name: secrets-manager-rotation
    Description: Manage secrets with Secrets Manager and RotationSchedule
    Author: superluminar
    SpdxLicenseId: MIT
    LicenseUrl: LICENSE.md
    ReadmeUrl: README.md
    Labels:
      [
        "example",
        "superluminar",
        "secretsmanager",
        "lambda",
        "rotation",
        "credentials",
      ]
    HomePageUrl: https://superluminar.io/2020/10/10/aws-sercrets-manager-rotation-lambda/
    SemanticVersion: 0.0.2

Ähnlich wie bei den Deep Links zu CloudFormation, benötigt das Serverless Application Repository einen S3 Bucket mit entsprechenden Zugriffsberechtigungen für den Zugriff auf das CloudFormation Template. Der notwendige Bucket und die BucketPolicy lassen sich wie folgt anlegen:

Repository:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: !Sub superluminar-repository-${AWS::Region}
    AccessControl: PublicRead

RepositoryBucketPolicy:
  Type: AWS::S3::BucketPolicy
  Properties:
    PolicyDocument:
      Id: RepositoryBucketPolicy
      Version: 2012-10-17
      Statement:
        - Sid: PublicReadForGetBucketObjects
          Effect: Allow
          Principal:
            Service: serverlessrepo.amazonaws.com
          Action: "s3:GetObject"
          Resource: !Sub ${Repository.Arn}/*
    Bucket: !Ref Repository

Wurde der S3 Bucket angelegt und das CloudFormation Template mit dem Werten für Metadata vorbereitet, können alle Ressourcen zu S3 geladen werden und das finale Template erstellt werden:

sam package \
    --template-file stack.yml \
    --output-template-file packaged.yml \
    --s3-bucket superluminar-repository-eu-central-1 \
    --region eu-central-1

Die erstellte Datei packaged.yml kann nun genutzt werden, um das CloudFormation Template im Serverless Application Repository zu veröffentlichen:

sam publish \
    --template packaged.yml \
    --region eu-central-1

Wenn das Template im Serverless Application Repository veröffentlicht wurde, können danach alle Details dazu über die AWS Management Console aufgerufen werden. Dort findet sich auch der ARN der Applikation, diese wird zur Referenz im nächsten Schritt benötigt.

AWS Management Console

Mit dem ARN der Applikation lässt sich diese nun in einem anderen CloudFormation Template referenzieren und die enthaltenen Komponenten deployen. Notwendige Parameter, die im Template definiert sind, lassen sich natürlich auch konfigurieren:

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: Use the Serverless Application Repository

Resources:
  Application:
    Type: AWS::Serverless::Application
    Properties:
      Location:
        ApplicationId: "arn:aws:serverlessrepo:eu-central-1:123456789001:applications/secrets-manager-rotation"
        SemanticVersion: 0.0.2
      Parameters:
        SecretName: /foo/bar
        RotationPeriodInDays: 10

Das AWS CLI kann nun das CloudFormation Template deployen und greift auf die Applikation im Serverless Application Repository und beinhaltete Ressourcen zurück:

$ > aws cloudformation deploy \
    --capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_IAM \
    --template-file stack.yml \
    --stack-name sar-consumer \
    --region eu-central-1

Das Serverless Application Repository ist ein Service von AWS, der viel zu selten in produktiven Umgebungen verwendet wird. Vor allem im Bereich von Microservice Architekturen lassen sich damit unkompliziert wiederverwendbare CloudFormation Templates erstellen und verwalten.

photo of Sebastian

Sebastian is a Senior Cloud Consultant at superluminar GmbH, AWS Serverless Hero and AWS Certified Solutions Architect. He writes here in German about AWS, Serverless, Software development, Go, TypeScript and React. English Articles can be found on his Website sbstjn.com and he can be found on Twitter under @sbstjn.