CloudFormation を使用した DynamoDB テーブルの命名に関するトレードオフ

CloudFormation を使用した DynamoDB テーブルの命名に関するトレードオフ

CloudFormation 経由でいくつかの Dynamodb テーブルを作成しています。これは Python ラムダによってアクセスされます。テーブルに名前を付けるには 2 つの選択肢があるようです。CF に任せて、名前にランダムな文字をたくさん付けるか、名前を明示的に指定して、簡単にアクセスできる名前にしますが、テーブルを置き換えずに CF 経由で変更を加えることができないようにします。

単純な名前を持たないことの欠点は、CF を実行するアカウントごとに異なる構成ファイルが必要になること (アカウントごとにランダムな名前が付けられるため)、またはラムダの呼び出しごとに名前を検出するコードを記述する必要があることだと思います。

それで、皆さんはどうしますか? 明示的に名前を指定してから変更の置換を処理しますか、それとも CF に任せてコード内で DB 名の検出を処理しますか? それとも私が考えていない他の方法ですか?

答え1

CloudFormation ではスタック構成のテンプレートを作成できるので、そのように扱うことをお勧めします。テンプレートにハードコードされた値を含めたくないでしょう。

名前を動的にする方法はいくつかありますが、その 1 つは、名前を指定しないことです。そうすると、AWS が一意の名前を生成します。もう 1 つは、!Subまたは!ImportValue/!Ref組み込み関数を使用して動的な値を構築することです。つまり、TableName: !Sub "${AWS::StackName}-my-unique-content"スタックごとに常に一意になりますが、内部の内容に関する説明情報も含まれます。

同じスタック内に Python ラムダがある場合は、テーブル名を環境変数として渡します (最も簡単な方法だと思います)

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"

ただし、スタック間の参照には注意してください。あらゆる場所で循環依存関係が発生する可能性があります。

もう 1 つのオプションは、CloudFormation テンプレートでパラメータを使用し、それらを介して DynamoDB テーブル名を渡し、!RefLambda 関数でそれらを参照することです ( を使用)。

関連情報