Blog

CDK Pipeline manueller Genehmigungsschritt mit SNS-Benachrichtigung

Yvo van Zee

Aktualisiert Oktober 16, 2025
3 Minuten

Verwendung eines beliebigen CodePipeline-Schrittes in CDK Pipelines

Hintergrund

In dem Unternehmen, in dem ich derzeit als Cloud Consultant arbeite, haben wir zusätzliche Sicherheitsmaßnahmen für unsere Pipelines eingeführt. Unsere Codeänderungen erfolgen nach dem DTAP-Modell. Im Grunde wird der Code zuerst in DevTest, dann in UAT und schließlich in der Produktion eingesetzt. CDK Pipelines ist hier der Orchestrator. Zwischen unseren UAT- und Produktionskonten ist eine manuelle Genehmigung implementiert, so dass alle Codeänderungen genehmigt werden müssen, bevor sie in Produktion gehen.

Problem

Mit CDK Pipelines ist dies ein einfacher Schritt, den Sie zu Ihrer Produktionsphase hinzufügen können. Sie können die [pre] ( docs.aws.amazon.com/cdk/api/v1/python/aws_c.. ) innerhalb der StageDeployment-Funktionalität, um eine manuelle Genehmigung hinzuzufügen.
# Konten mit Variablen aus cdk.json abrufen
accounts= self.node.try_get_context("accounts")

für Konto in Konten:
  pipeline.add_stage(
  Anwendung(
  selbst,
  f"{Konto}".lower(),
  env={"account": accounts[account]["account_id"], "region": accounts[account]["region"]},
  # Übergeben Sie den Kontonamen (test, uat, prod), damit wir ihn in Stapeln verwenden können.
  account_name=account,
  ),
  # Manuelle Genehmigung zwischen uat- und prd-Stufe hinzufügen
  pre=None if account != "prd" else [pipelines.ManualApprovalStep("PromoteToProd")],
  )

Nun, genau das ist im Moment ein Problem mit CDK-Pipelines. Bei der Verwendung von CDK Version 2 und der neuen modernen API für Pipelines mit der CodePipelineEngine ist es nicht möglich, eine manuelle Genehmigung mit SNS-Themenkonfiguration zu erhalten.

Die ManualApprovalStep unterstützt nur das Hinzufügen eines Kommentars zur manuellen Genehmigung. Das ist seltsam, denn die normale CodePipeline-Aktionen Konstrukt unterstützt das Hinzufügen eines SNS-Benachrichtigungsthemas.

Glücklicherweise unterstützt CDK Pipelines einen Escape-Hack in Form von beliebiger CodePipeline-Aktionen .

Beliebige CodePipeline-Aktion

Um eine beliebige CodePipeline-Aktion zu implementieren, weil die CDK Pipeline den manuellen Genehmigungsschritt mit SNS-Benachrichtigungen nicht unterstützt, müssen Sie Ihre eigene Schrittklasse definieren, die Step erweitert und ICodePipelineActionFactory implementiert.

Hier ist das Beispiel für die Klasse der manuellen Genehmigung:

@jsii.implements(pipelines.ICodePipelineActionFactory)
class ManualApprovalWithSNSStep(pipelines.Step):
  """
  Erstellen Sie einen beliebigen CodePipeline-Schritt zur Aktivierung von SNS mit manueller Genehmigung
 
https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.pipelines/README.html#arbitrary-codepipeline-actions
  """

  def __init__(self, id_, topic: aws_sns.ITopic):
  super().__init__(id_)

  self.topic = Thema

  @jsii.member(jsii_name="produceAction")
  def produce_action(
  selbst,
  stage: aws_codepipeline.IStage,
  options: pipelines.ProduceActionOptions,
  ) -> pipelines.CodePipelineActionFactoryResult:
  stage.add_action(
  aws_codepipeline_actions.ManualApprovalAction(
  action_name=options.action_name,
  additional_information="bitte genehmigen",
  run_order=options.run_order,
  notification_topic=self.topic,
  )
  )

  return pipelines.CodePipelineActionFactoryResult(run_orders_consumed=1)

Lassen Sie uns die Sache in kleine Häppchen aufteilen. Wie beschrieben müssen wir also die ICodePipelineActionFactory von CDK Pipelines implementieren. Sie "erweitert" die Funktionalität von pipelines.Step. In der init-Funktion erwarten wir neben der id auch ein SNS-Thema. Dieses self.topic wird später in der Action verwendet. Da wir eine Unterklasse der CodePipeline Step erstellen, werden die Aktionen in der Funktion produce_action definiert. Das eigentliche Konstrukt, das wir hier verwenden werden, ist eine aws_codepipeline_actions.ManualApprovalAction. Dabei handelt es sich um das standardmäßige CodePipeline-Konstrukt mit der verfügbaren SNS-Themenkonfiguration. Hier werden wir das angegebene Thema mit der Eigenschaft notification_topic verknüpfen.

In unserer Pipeline ist der ARN des überwachenden SNS-Themas über den SSM-Parameterspeicher verfügbar. Um diese neue Klasse, die das CodePipeline Actions-Konstrukt verwendet, tatsächlich zu verwenden, rufen Sie sie im Vorschritt der Produktionsphase über auf:

pre=Keine
wenn Konto != "prd"
sonst [
  ManualApprovalWithSNSStep(
  "PromoteToProd",
  topic=aws_sns.Topic.from_topic_arn(
  selbst,
  "MonitoringTopic",
  topic_arn=aws_ssm.StringParameter.from_string_parameter_name(
  self, "SNSMonitoringTopicArn", "/cdp/sns/monitoring_arn"
  ).string_value,
  ),
  )
],

Das Ergebnis ist der CloudFormation-Code:

{
  "ActionTypeId": {
  "Kategorie": "Freigabe",
  "Eigentümer": "AWS",
  "Anbieter": "Manuell",
  "Version": "1"
  },
  "Konfiguration": {
  "NotificationArn": {
  "Ref": "SNSMonitoringTopicArnParameter"
  },
  "BenutzerdefinierteDaten": "bitte genehmigen"
  },
  "Name": "PromoteToProd",
  "RoleArn": {
  "Fn::GetAtt": [
  "PromoteToProdCodePipelineActionRoleEA4779BC",
  "Arn"
  ]
  },
  "RunOrder": 1
},

Fazit

In diesem Blog habe ich gezeigt, wie Sie einen beliebigen CodePipeline-Schritt mit CDK Pipelines (in Python) verwenden können. Da es eine Weile gedauert hat, das generierte Beispiel in der CDK-Dokumentation zu verstehen und selbst zu verwenden, habe ich ein Beispiel aus der Praxis für Sie erstellt. Interessieren Sie sich für CDK? Schauen Sie sich auch meinen letzten Blog an.

Verfasst von

Yvo van Zee

I'm an AWS Cloud Consultant working at Oblivion. I specialised myself in architecting and building high available environments using automation (Infrastructure as Code combined with Continuous Integration and Continuous Delivery (CI/CD)). Challenging problems and finding solutions which fit are my speciality.

Contact

Let’s discuss how we can support your journey.