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

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:
- Erstellen Sie den Anbieter der benutzerdefinierten Ressource; eine Lambda-Funktion
- Stellen Sie die Ressource mit dem vorherigen benutzerdefinierten Ressourcenanbieter bereit
- Importieren Sie die selbst erstellte Ressource in Ihren Stapel
- 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:
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
Unsere Ideen
Weitere Blogs
Contact



