Blog

Migrieren Sie benutzerdefinierte CloudFormation-Ressourcen, nachdem AWS Unterstützung hinzugefügt hat

Martijn van Dongen

Aktualisiert Oktober 21, 2025
3 Minuten

Neue Dienste bieten bei der Einführung nicht immer Unterstützung für CloudFormation. Wenn Sie mit CloudFormation arbeiten, können Sie eine benutzerdefinierte Ressource erstellen. Mit der neuen Importfunktionalität können Sie, sobald AWS die native Unterstützung für die Ressource hinzufügt, diese Ressource in Ihre Vorlage importieren und die alte benutzerdefinierte Ressource entfernen.
Dieser Blogbeitrag beschreibt die 4 Stufen:

  1. Erstellen Sie den Anbieter der benutzerdefinierten Ressource; eine Lambda-Funktion
  2. Stellen Sie die Ressource mit dem vorherigen benutzerdefinierten Ressourcenanbieter bereit
  3. Importieren Sie die selbst erstellte Ressource in Ihren Stapel
  4. Entfernen Sie die benutzerdefinierte Ressource aus dem Stack und belassen Sie die importierte Ressource für die zukünftige Verwendung
    In unserem Beispiel gehen wir davon aus, dass SNS Topic beim Start noch nicht von CloudFormation unterstützt wird.

Schritt 1: Erstellen Sie den benutzerdefinierten Ressourcenanbieter

Die folgende Lambda-Funktion erstellt oder löscht die benutzerdefinierten Ressourcen. Für diese einfache Demo habe ich den ganzen hübschen Code entfernt. Stellen Sie diese Vorlage mit den Befehlen aws cloudformation package und aws cloudformation deploy oder mit SAM cli bereit.

Transform: 'AWS::Serverless-2016-10-31'
Resources:
  CustomS3Bucket:
    Type: 'AWS::Serverless::Function'
    Properties:
      Runtime: python3.7
      Timeout: 30
      Handler: index.handler
      Policies:
        - arn:aws:iam::aws:policy/AmazonSNSFullAccess
      InlineCode: |
        import base64
        import json
        import cfnresponse
        import boto3

        sns = boto3.client('sns')

        def handler(event, context):
          topic_name = event['ResourceProperties']['TopicName']
          response_data = {}
          if event['RequestType'] == 'Create':
            sns.create_topic(
              Name=topic_name
            )
          elif event['RequestType'] == 'Update':
            sns.delete_topic(
              Name=topic_name
            )
            sns.create_topic(
              Name=topic_name
            )
          #else: # delete
          #  uncommented to force a retain
          #  delete(event['PhysicalResourceId'])
          cfnresponse.send(event, context, cfnresponse.SUCCESS, response_data, topic_name)

Schritt 2: Bereitstellen von SNS mit dem Custom Resource Provider

Resources:
  MyTopic:
    Type: Custom::SNSTopic
    Properties:
      ServiceToken:
        !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:sns-topic"
      TopicName: mytopic

Stufe 3: Vorhandene Ressource importieren

Nach einer gewissen Zeit führt AWS die Unterstützung für Ihre selbst erstellte Ressource ein. In diesem Beispiel ist es SNS, oder vielleicht sogar eine Funktion von SNS Topic. Um die Ressource zu importieren, verwenden Sie die folgende Vorlage und die Weboberfläche (CLI wird derzeit noch nicht unterstützt).
Wichtiger Hinweis: ist eine obligatorische Konfiguration, damit der Import funktioniert.
Wir haben jetzt CloudFormation-Ressourcen für dieselbe physische Ressource. Das macht nichts, im nächsten Schritt werden wir die benutzerdefinierte Ressource entfernen.

Resources:
  MyTopic:
    Type: Custom::TopicCreator
    Properties:
      ServiceToken:
        !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:sns-topic"
      TopicName: mytopic
  MyTopicImport:
    Type: AWS::SNS::Topic
    DeletionPolicy: Retain
    Properties:
      TopicName: mytopic

Dies ist der aktuelle Ablauf. Einige Bestätigungsbildschirme werden übersprungen:


Schritt 4: Entfernen Sie die alte benutzerdefinierte Ressource

Jetzt können wir wieder zu unserem Standardverteilungsprozess wechseln, um den endgültigen Stack mit der Vorlage ohne benutzerdefinierte Ressourcen zu aktualisieren.
Wichtiger Hinweis: Stellen Sie sicher, dass die benutzerdefinierte Ressource die physische Ressource NICHT löscht. In diesem Beispiel haben wir einfach die Löschaktion in der Funktion entfernt. Sie können aber auch eine Eigenschaft hinzufügen: Retain: True, um die Löschaktion zu überspringen.

Resources:
  MyTopicImport:
    Type: AWS::SNS::Topic
    DeletionPolicy: Retain
    Properties:
      TopicName: mytopic

Fazit

Wir haben gelernt, wie man benutzerdefinierte CloudFormation-Ressourcen und die brandneue Importfunktion verwendet, um die Migration von benutzerdefinierten Ressourcen zu nativen unterstützten CloudFormation-Ressourcen zu erleichtern.

Verfasst von

Martijn van Dongen

Contact

Let’s discuss how we can support your journey.