使用 CloudFormation 命名 DynamoDB 表的權衡

使用 CloudFormation 命名 DynamoDB 表的權衡

我正在透過 CloudFormation 建立一些 dynamodb 表,這些表將由 Python lambda 存取。看起來我在命名表時有兩種選擇 - 讓 CF 來做,因此在名稱上放置一大堆隨機字符,或者明確指定名稱,這給了我一個易於訪問的名稱,但意味著我不能通過CF進行更改,無需替換表格。

我認為沒有簡單名稱的缺點是,我要么必須有一個對於運行 CF 的每個帳戶都不同的配置文件(因為它們將具有不同的隨機名稱),要么我必須編寫代碼來檢測每次調用lambda 時的名稱。

那你們都做什麼呢?明確名稱然後處理更改的替換,或者讓 CF 來做並在程式碼中處理 DB 名稱發現?或者還有其他我沒有想到的事情?

答案1

CloudFormation 讓您可以為堆疊配置建立模板,因此我建議您也這樣對待它們。您可能不希望在模板中使用硬編碼值。

使名稱動態化的方法有很多種,其中之一是 - 無需指定名稱,AWS 將為您產生一個唯一的名稱。其他 - 使用!Sub!ImportValue/!Ref內在函數來建立動態值。即:TableName: !Sub "${AWS::StackName}-my-unique-content"每個堆疊始終是唯一的,但也包含有關內部內容的一些描述性資訊。

如果您的 Python lambda 位於同一堆堆疊中,請將表名稱作為環境變數傳遞(我認為這是最簡單的方法)

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

如果它們是在另一個堆疊中建立的,但在同一帳戶中 - 您最好的機會是將表名稱匯出為Output,然後透過呼叫!ImportValue函數來引用它。例如:

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

在另一個堆疊中:

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

不過,要小心堆疊間引用,您可能最終會在各處出現循環依賴關係。

另一個選擇是利用 CloudFormation 範本中的參數並透過它們傳遞 DynamoDB 表名稱,並!Ref在 lambda 函數中引用它們(透過使用 )。

相關內容