Ein Blick auf die AWS::CloudFormation::StackSet CloudFormation Resource

Als Deployment-Werkzeug der Wahl setzen wir zumeist AWS CloudFormation ein, denn es ist ein sehr bewährter und robuster Service: Da CloudFormation ein Managed Service ist, entstehen keine Kosten fuer Installation, Wartung oder Updates wie z.B. bei Terraform.

Die Grenzen von CloudFormation

Allerdings stößt man mit CloudFormation oft schnell an Grenzen. So waren komplexere Abhängigkeiten/Orchestrierungen bisher nicht nativ darzustellen, zum Beispiel:

  • Orchestrierung von StackSets und Abhängigkeiten über Accounts hinweg, zB “Lege erst X in Account Y” an, dann “Z in Account B”
  • Cross-Region Deployments von einzelnen Resourcen, zB “Lege ACM Certificate fuer CloudFront in us-east-1 an, das S3 Bucket aber in eu-central-1

Oft kommen dann Workarounds über CloudFormation Custom Resources zu tragen, die allerdings wiederum (Folge-)Kosten haben.

Es gibt mit zwar mit CloudFormation StackSets eine native Möglichkeit, CloudFormation Stacks über Regionen, AWS Accounts oder ganze Organizational Units auszurollen, nur konnte man bisher StackSets nicht mit CloudFormation an sich verwalten.

Die Lösung: Die neue AWS::Cloudformation::StackSet Resource

Die neue AWS::Cloudformation::StackSet Resource aus dem CloudFormation Resource Provider ist hier vielversprechend, denn mit ihr können StackSets nun durch CloudFormation Templates definiert werden.

Noch nicht offiziell verfügbar, aber per Registry installierbar

Die AWS::Cloudformation::StackSet Resource ist noch nicht offiziell verfügbar, aber es ist schon möglich, sie selbst per CloudFormation Registry zu installieren und zu nutzen. Genau das wollen wir in diesem Beitrag beispielsweise einmal machen, um sie dann zu nutzen.

Da AWS den AWS:: Namespace in CloudFormation für sich reserviert, nennen wir die Resource um, in diesem Fall ziehen wir sie temporär in den Superluminar Namespace, so dass sie Superluminar::Cloudformation::StackSet heisst. Dafür mussten wir diesen temporären Change am Quelltext vornehmen.

Das Bauen des Resource Providers passiert nach Anleitung per mvn package. Die Registrierung und das Deployment geht per cfn submit. Dadurch wird auch ein S3 Bucket angelegt und das Artefakt dort hineingelegt. So wird die Resource auch für andere AWS Accounts importierbar. Da wir das schon gemacht haben, könnt ihr die Resource so in euren Account registrieren:

$ aws cloudformation register-type --type-name Superluminar::CloudFormation::StackSet --schema-handler-package s3://cloudformationmanageduploadinfrast-artifactbucket-f4smzzvycjb7/superluminar-cloudformation-stackset-2020-06-04T15-24-23.zip --type RESOURCE

Nun ist die Resource im Account verfügbar und kann genutzt werden. Schauen wir uns ein paar Beispiele an.

Beispiel: ACM Zertifikat in einer anderer Region erzeugen

So erzeugt man ein ACM Zertifikat in einer anderen Region als der Ursprungs-Stack. Das kann beispielsweise vorkommen, wenn ihr ein ACM Certificate für CloudFront in us-east-1 erstellen müsst, euer CloudFormation Stack aber in einer anderen Region “lebt”:

Resources:
  CertificateInUsEast1:
    Type: Superluminar::CloudFormation::StackSet
    Properties:
      StackSetName: !Ref AWS::StackName
      PermissionModel: SELF_MANAGED
      StackInstancesGroup:
        - Regions:
            - us-east-1
          DeploymentTargets:
            Accounts:
              - !Ref AWS::AccountId
      TemplateBody: |
        Resources:
          Certificate:
            Type: AWS::CertificateManager::Certificate
            Properties:
              DomainName: ssl.superluminar.io

In diesem Beispiel erzeugt CloudFormation über die CertificateInUsEast1 Resource ein StackSet erzeugt, welches in us-east-1 im gleichen AWS Account ein CloudFormation Stack ausrollt. Dieser Stack enthält dann die Certificate Resource.

Hier wird das Permission Model SELF_MANAGED verwendet, d.h. ihr müsst ggf. selbst Rollen für CloudFormation im ausführenden Account (AdministrationRoleARN) sowie für die Sub-Accounts (ExecutionRoleName) bereitstellen. Nutzt ihr AWS Landing Zone oder AWS Control Tower, um AWS Accounts in eurer AWS Organization zu erstellen und zu verwalten, so ist euer AWS Setup bereits vorbereitet, wenn ihr aus eurem AWS Organizations Master Account heraus StackSets anlegen wollt:

  • Bei AWS Landing Zone sind die Defaults für AdministrationRoleARN und ExecutionRoleName bereits korrekt.
  • Nutzt ihr AWS Control Tower, ist für AdministrationRoleARN die Rolle AWSControlTowerStackSetRole, und für ExecutionRoleName ist es AWSControlTowerExecution.

Beispiel 2: Einen Stack über eine bestimmte OU ausrollen

Das folgende Beispiel zeigt, wie ihr Resourcen in die gesamte AWS Organization oder in bestimmte Organizational Units (OU) ausrollen könnt. In diesem Fall wird das Security Hub in jedem Account der OU, welche mit dem Parameter OU übergeben wird, aktiviert:

Parameters:
  OU:
    Type: String

Resources:
  Stackset:
    Type: Superluminar::CloudFormation::StackSet
    Properties:
      StackSetName: !Sub ${AWS::StackName}
      PermissionModel: SERVICE_MANAGED
      AutoDeployment:
        Enabled: true
        RetainStacksOnAccountRemoval: false
      StackInstancesGroup:
        - Regions:
          - !Ref AWS::Region
          DeploymentTargets:
            OrganizationalUnitIds:
              - !Ref OU
      TemplateBody: |
        Resources:
          SecurityHub:
            Type: AWS::SecurityHub::Hub

Beachtenswertes

  • Private CloudFormation Typen müssen je Region und Account registriert werden.
  • Man kommt nicht ohne weiteres an die Outputs der per StackSets angelegten Stacks heran. Wollt ihr etwas aus dem Sub-Template referenzieren, so bleibt nur der Weg über das Synthetisieren der Resource-Namen/ARNs. Das ist nicht immer möglich, z. B. bei generierten ARNs wie ACM Zertifikaten.
  • Ihr könnt die CloudFormation Resource jetzt schon verwenden, und später in den offiziellen Namepace umziehen. Dank der nativen CloudFormation Imports wird auch die StackSet Resource zu importieren sein.
  • Die privaten CloudFormation Resourcen sind im Gegensatz zum Rest von CloudFormation nicht kostenlos, allerdings mit 1.000 freien Operationen pro Monat und \$0.0009 pro Operation auch eher gering.
  • StackSets haben Limits, nämlich 100 StackSets pro Account und Region, diese lassen sich allerdings erhöhen.

Fazit

Die native AWS::Cloudformation::StackSet CloudFormation Resource wird das Verwalten von Resourcen über AWS Accounts, Organizational Units und Regionen erheblich vereinfachen. Solange die Resource noch nicht offiziell released ist, könnt ihr sie schon über die CloudFormation Registry nutzen.

Sönke ist Co-founder und Senior Cloud Consultant bei superluminar, AWS Partner Ambassador und AWS Certified Solutions Architect Professional sowie AWS Certified DevOps Engineer Professional. Hier schreibt er zumeist über seine Lieblingsthemen: Professionelle AWS Setups und Softwareentwicklung. Auf Twitter ist er unter @s0enke zu finden.