我正在透過 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 函數中引用它們(透過使用 )。