AWS Serverless Application Repository
October 12, 2020Der 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?
CloudFormation Deep Links
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.
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.