Wie richte ich das Single-Stack-Eigentum an einer AWS::StepFunctions::Activity-Ressource in CloudFormation ein?

Zuletzt aktualisiert: 15.09.2021

Ich möchte, dass meine AWS::StepFunctions::Activity-Ressource nur von einem einzigen Stack in AWS CloudFormation verwaltet wird.

Kurzbeschreibung

Sie können das Eigentum an einer AWS::StepFunctions::Activity-Ressource von mehreren Stacks aus aufrechterhalten. Beispielsweise können Sie StackA mit der ersten CloudFormation-Vorlage und StackB mit der zweiten Vorlage erstellen.

Vorlage für StackA:

AWSTemplateFormatVersion: "2010-09-09"
Description: Template for StackA
Resources:
  MyActivity:
    Type: AWS::StepFunctions::Activity
    Properties:
      Name: myActivity

Vorlage für StackB:

AWSTemplateFormatVersion: "2010-09-09"
Description: Template for StackB
Resources:
 MyActivityDuplicate:
 Type: AWS::StepFunctions::Activity
 Properties:
 Name: myActivity
 Tags:
 - Key: Key1
   Value: Val1
....

StackA und StackB zeigen die Ressource beide als CREATE_COMPLETE an. Die Activity-Ressource, auf die in StackA und StackB verwiesen wird, hat jedoch die Eigenschaften, die in der Vorlage für StackA definiert sind. Der Vorgang scheint erfolgreich zu sein, aber die Eigenschaften der Ressource stimmen nicht mit der von StackA verwendeten Vorlage überein. Wenn einer der Stacks gelöscht wird, wird die Aktivität ebenfalls gelöscht. In den anderen Stacks gibt es keinen Hinweis darauf, dass die Ressource nicht mehr existiert.

Es ist eine bewährte Methode bei der Verwendung von CloudFormation sicherzustellen, dass die Konfiguration einer gemeinsam genutzten Ressource in einem einzigen CloudFormation-Stack verwaltet wird. Dies bietet eine einzige Quelle der Wahrheit für die Konfiguration der Ressource. Der CloudFormation-Stack, der die freigegebene Ressource verwaltet, kann den Amazon-Ressourcennamen (ARN) der Ressource als Stack-Ausgabe bereitstellen. Dann können alle anderen Stacks, die von der freigegebenen Ressource abhängen, auf diese verweisen, z. B. die Aktivität Step Functions. Weitere Informationen zu stackübergreifenden Referenzen finden Sie unter Walkthrough: Verweis auf Ressourcenausgaben in einem anderen AWS CloudFormation-Stack.

Auflösung

Um das Problem zu beheben, führen Sie die folgenden Schritte für jede AWS::StepFunctions::Activity-Ressource durch, die in mehreren Stapeln verwaltet wird:

1.    Identifizieren Sie die im AWS Personal Health Dashboard der CloudFormation-Stacks freigegebenen ARNs, die die Ressource AWS::StepFunctions::Activity verwalten.

2.    Bestimmen Sie einen der Stacks als den einzigen Stack, der die Aktivität weiterhin aufrechterhält.

Führen Sie innerhalb des identifizierten Stacks die folgenden Schritte aus:

1.    Wenn Ihre CloudFormation-Vorlage keinen Abschnitt für Ausgaben enthält, dann fügen Sie Ihrer Vorlage einen solchen Abschnitt hinzu.

2.    Fügen Sie dem Abschnitt Ausgaben eine neue Ausgabe hinzu. Die neue Ausgabe muss Folgendes enthalten:

  • Eine eindeutige logische ID für die Ausgabe. Zum Beispiel: MyActivityArn. Sie verwenden Ihre eindeutige logische ID als Schlüssel für die Ausgabe im Abschnitt Ausgaben Ihrer Vorlage.
  • Eine Value-Eigenschaft innerhalb der Stack-Ausgabe. Die Eigenschaft Value verwendet Ref mit der logischen ID der Aktivität als Argument, um den ARN der Aktivität abzurufen.
  • Eine Export-Eigenschaft für die Stack-Ausgabe, deren Wert ein Objekt mit einer einzigen Name-Eigenschaft ist. Der Wert der Eigenschaft Name ist eine Zeichenfolge, die verwendet wird, um auf den ARN dieser Aktivität aus anderen CloudFormation-Stacks zu verweisen. Beispiel:
AWSTemplateFormatVersion: "2010-09-09"
Description: Template for StackA
Resources:
  MyActivity:
    Type: AWS::StepFunctions::Activity
    Properties:
      Name: myActivity
Outputs:
  MyActivityArn:
    Value: 
      Ref: MyActivity
    Export:
      Name: MyActivityArn

3.    Aktualisieren Sie Ihren Stack mit den vorhergehenden Änderungen.

4.    Stellen Sie sicher, dass die Ressourcen, die auf die Aktivität verweisen, immer noch den richtigen ARN verwenden.

Führen Sie die folgenden Schritte für jeden Stack aus, der auf die Activity-Ressource verweist:

1.    Identifizieren Sie in der CloudFormation-Konsole unter der Registerkarte Ressourcen für Ihren Stack die logische ID der Activity-Ressource.

2.    Fügen Sie eine DeletionPolicy-Eigenschaft zur Ressourcendeklaration der Aktivität hinzu, falls die Eigenschaft nicht bereits vorhanden ist. Setzen Sie den Wert auf Beibehaltung. Beispiel:

AWSTemplateFormatVersion: "2010-09-09"
Description: Template for StackB
Resources:
  MyActivityDuplicate:
    Type: AWS::StepFunctions::Activity
    DeletionPolicy: Retain
    Properties:
      Name: myActivity
      Tags:
        - Key: Key1
          Value: Val1
...

3.    Aktualisieren Sie Ihren Stack mit den vorhergehenden Änderungen.

4.    Bestimmen Sie, welche anderen Ressourcen in der Vorlage auf den ARN dieser Aktivität verweisen.

5.    Ersetzen Sie für jede der Ressourcen, die Sie in Schritt 4 identifiziert haben, den Verweis auf den ARN der Aktivität durch die intrinsische Funktion Fn::ImportValue. Übergeben Sie den Exportnamen, den Sie beim Erstellen einer neuen Ausgabe angegeben haben, als Argument für die intrinsische Funktion. Beispiel:

AWSTemplateFormatVersion: "2010-09-09"
Description: Template for StackB
Resources:
  # MyActivityDuplicate:
  #   DeletionPolicy: Retain
  #   Type: AWS::StepFunctions::Activity
  #   Properties:
  #     Name: myActivity
  #     Tags:
  #       - Key: Key1
  #         Value: Val1
  MyStateMachine:
    Type: AWS::StepFunctions::StateMachine
    Properties:
      StateMachineName: MyStateMachine
      RoleArn: arn:aws:iam::111122223333:role/service-role/StatesExecutionRole-us-east-1
      DefinitionString: 
        Fn::Sub:
          - |
              {
                "Comment": "An example using a Task state.",
                "StartAt": "getGreeting",
                "Version": "1.0",
                "TimeoutSeconds": 300,
                "States":
                {
                  "getGreeting": {
                    "Type": "Task",
                    "Resource": "${ActivityArn}",
                    "End": true
                  }
                }
              }
          - ActivityArn:
              Fn::ImportValue: MyActivityArn

6.    Entfernen Sie den Eintrag für die Aktivität im Abschnitt Ressourcen.

7.    Aktualisieren Sie Ihren Stack mit den vorhergehenden Änderungen.

8.    Stellen Sie sicher, dass die Ressourcen, die auf die Aktivität verweisen, immer noch den richtigen ARN verwenden.


War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?