Invoke Lambda-Funktion, wenn AWS Parameter Store (SSM) Eintrag geändert wird mit Python (CDK)

In diesem Beitrag behandeln wir das Thema, wie man eine Lambda-Funktion per Event triggert, wenn eine Änderung im AWS Parameter Store (SSM) stattfindet. Wann kann das aber hilfreich sein? Es gibt einige Szenarien, in denen diese Vorgehensweise Prozesse automatisieren kann. Beispielsweise können Nutzer per Push Benachrichtigung informiert werden, wenn sich die Version einer Komponente des Systems ändert. Es können automatisch Updates ausgespielt werden und Datenbankeinträge auf der Information basierend angepasst werden.

Welche Services benötigen wir dafür?

Wir fassen in diesem Beitrag den AWS Lambda-Service für die eigentlich Invoke-Logik, die AWS EventBridge für die Regel, den AWS IAM Service für die nötigen PolicyStatements und den eben den AWS Parameter Store (SSM) an.

Zuerst erstellen wir die zuständige Regel

Um die Regel zu erstellen greifen wir auf die events.Rule im aws_cdk.aws_events package zu. Hier geben wir die obligatorische ID für das Konstrukt mit und anbei eine (noch nicht existierende) Variable für den Inhalt bzw. das Pattern für die Regel mit. Das könnte ungefähr so aussehen

parameter_store_change_rule = events.Rule(
    self,
    "ParameterStoreRule",
    event_pattern=parameter_store_change_event_pattern
)

Jetzt können wir uns Gedanken machen, wie wir unsere Regellogik aufbauen wollen. Welche Quelle wollen wir nutzen? Wie bereits beschrieben geht es um den Parameter Store, welcher im AWS Systems Manager (SSM) sitzt. Wir haben sonst keine andere Quelle, deshalb ist unsere einzige source eben aws.ssm.

Außerdem wollen wir auf Änderungen reagieren. Auch hier haben wir nur ein einziges Detail, deshalb bleibt der detail-type auch mit einem einzigen Element im String Array befüllt. Das letzte Detail was noch fehlt ist das name-Attribut. Hier fügen wir den Namen des Parameter Store Eintrags ein. Mit dieser Summe fügt sich folgendes Bild zusammen:

parameter_store_change_event_pattern = {
    "source": ["aws.ssm"],
    "detail-type": ["Parameter Store Change"],
    "detail": {
        "name": [
            "/my/parameter/store/entry"
        ]
    }
}

Diese Regel feuert ab diesem Moment, wenn der Parameter Store Eintrag mit dem Namen /my/parameter/store/entry also geändert wird.

Die Ausführlogik steckt in der Lambda-Funktion

Auch brauchen wir ein Ziel für unsere Regel, welches ausgeführt werden soll, wenn die entsprechende Regel zutrifft. Dieses Ziel ist eine Lambda-Funktion. Diese erhält, wie alle Konstrukte, die obligatorische ID und einen Pfad zum Code Asset. Dies ist quasi die Minimalausführung einer Lambda-Funktion im Stack.

parameter_store_lambda = lambda_.Function(
    self,
    "ParameterStoreLambda",
    code=lambda_.Code.from_asset("lambda"),
    handler="index.handler",
    runtime=lambda_.Runtime.PYTHON_3_X
)

Jetzt müssen wir lediglich diese Lambda Funktion der Regel als Ziel hinzufügen. Dafür stellt uns das AWS CDK die add_target-Funktion zur Verfügung. Mit dieser können wir verschiedene ITargets, in unserem Fall eine Lambda-Funktion, übergeben. Außerdem wollen wir den neuen Inhalt des Parameter Store Eintrags erhalten, deshalb geben wir diesen auch als Event mit.

parameter_store_change_rule.add_target(
    targets.LambdaFunction(
        parameter_store_lambda,
        event=events.RuleTargetInput.from_object({"parameterName": "/my/parameter/store/entry"})
    )
)

Es fehlt nur noch die Permission

Um der Lambda-Funktion die Permission zu geben den Eintrag aus dem Parameter Store zu lesen, müssen wir der Lambda-Funktion noch ein PolicyStatement mit an die Hand geben. Dieses soll erlauben (iam.Effect.ALLOW), wenn die Aktion einen Parameter auszulesen (ssm:GetParameter) bei unserem Eintrag im Parameter Store ausgeführt wird.

parameter_store_lambda.add_to_role_policy(
    iam.PolicyStatement(
        effect=iam.Effect.ALLOW,
        actions=["ssm:GetParameter"],
        resources=["arn:aws:ssm:<REGION>:<ACCOUNT-ID>:parameter/my/parameter/store/entry"]
    )
)

Mit diesen Schritten hast du eine EventBridge-Regel eingerichtet, die auf Änderungen des angegebenen AWS Parameter Store (SSM) Eintrag reagiert und bei Übereinstimmung mit der Regel eine Lambda-Funktion aufruft. Der Lambda-Funktion wurde die Berechtigung erteilt, den AWS Parameter Store (SSM) Eintrag zu lesen, so dass sie alle gewünschten Aktionen durchführen kann, wenn der Eintrag geändert wird.

Noch Fragen? Lass uns reden?