Kompromisse bei der Benennung von DynamoDB-Tabellen mit CloudFormation

Kompromisse bei der Benennung von DynamoDB-Tabellen mit CloudFormation

Ich erstelle einige Dynamodb-Tabellen über CloudFormation, auf die Python-Lambdas zugreifen. Es sieht so aus, als hätte ich zwei Möglichkeiten, die Tabellen zu benennen: CF das machen lassen und daher eine ganze Reihe zufälliger Zeichen in den Namen einfügen oder den Namen explizit angeben, was mir einen leicht zugänglichen Namen gibt, aber bedeutet, dass ich keine Änderungen über CF vornehmen kann, ohne die Tabelle zu ersetzen.

Ich denke, der Nachteil daran, keinen einfachen Namen zu haben, besteht darin, dass ich entweder für jedes Konto, in dem ich die CF ausführe, eine andere Konfigurationsdatei brauche (weil sie unterschiedliche zufällige Namen haben), oder dass ich Code schreiben muss, um den Namen bei jedem Aufruf des Lambdas zu erkennen.

Was macht ihr also? Explizite Namen und dann den Ersatz für die Änderungen übernehmen oder CF das machen lassen und sich im Code um die DB-Namensermittlung kümmern? Oder etwas anderes, an das ich nicht denke?

Antwort1

Mit CloudFormation können Sie Vorlagen für Ihre Stapelkonfigurationen erstellen. Ich würde daher empfehlen, sie auch als solche zu behandeln. Sie möchten wahrscheinlich keine fest codierten Werte in Ihren Vorlagen haben.

Es gibt einige Möglichkeiten, Namen dynamisch zu machen. Eine davon ist, keinen Namen anzugeben, und AWS generiert einen eindeutigen Namen für Sie. Eine andere ist, !Suboder !ImportValue/ !Refintrinsische Funktionen zu verwenden, um dynamische Werte zu erstellen. D. h.: TableName: !Sub "${AWS::StackName}-my-unique-content"Dieser ist pro Stapel immer eindeutig, enthält aber auch einige beschreibende Informationen über den Inhalt.

Wenn sich Ihre Python-Lambdas im selben Stapel befinden, übergeben Sie den Tabellennamen als Umgebungsvariable (meiner Meinung nach der einfachste Weg).

PythonFunction:
  Type: "AWS::Serverless::Function"
  Properties:
    Environment:
      Variables:
        TABLE_NAME: !Ref DynamoTableResource

Wenn sie in einem anderen Stapel, aber im selben Konto erstellt werden, besteht Ihre beste Möglichkeit darin, den Tabellennamen als zu exportieren Outputund dann durch Aufrufen der !ImportValueFunktion darauf zu verweisen. Beispiel:

dynamostack.yaml
Outputs: 
  DynamoDBResource:
    Description: "DynamoDB table"
    Value: !Ref DynamoTableResource
    Export:
      Name: !Sub "${AWS::StackName}-exported-dynamo-table-name"

Und in einem anderen Stapel:

functionstack.yaml
PythonFunction:
  Type: "AWS::Serverless::Function"
  Properties:
    Environment:
      Variables:
        TABLE_NAME: !ImportValue "dynamostack-exported-dynamo-table-name"

Gehen Sie jedoch mit Verweisen zwischen Stapeln vorsichtig vor, da es sonst zu überall zirkulärer Abhängigkeiten kommen kann.

Eine andere Möglichkeit besteht darin, Parameter in CloudFormation-Vorlagen zu verwenden, DynamoDB-Tabellennamen über sie zu übergeben und sie (mithilfe von !Ref) in Ihren Lambda-Funktionen zu referenzieren.

verwandte Informationen