CloudFormationテンプレートファイルで宣言されたDynamoDBテーブルのテーブル名を渡すことをローカルでテストしようとしています。
私が読んだすべてのドキュメントから、!Ref
組み込み関数を使用してDynamoDBリソースのTableName
プロパティ値を参照できるはずです。しかし、これをローカルでテストすると、プロパティが未定義になります。
次の例について考えてみます。
Transform: 'AWS::Serverless-2016-10-31'
Resources:
ServerlessFunction:
Type: AWS::Serverless::Function
Properties:
Runtime: nodejs10.x
Handler: index.handler
Environment:
Variables:
TABLE_NAME: !Ref DynamoDBTable # <- returning undefined
Events:
GetCocktails:
Type: Api
Properties:
Path: /
Method: get
DynamoDBTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: DynamoDBTableName
AttributeDefinitions:
- AttributeName: ID
AttributeType: S
KeySchema:
- AttributeName: ID
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
私はTABLE_NAME
環境変数がDynamoDBTableName
であることを期待していますが、未定義を返します。テンプレートを期待どおりに機能させるにはどうすればよいですか?
コンソールでラムダ関数を調べて、想定されている場所より下にない環境変数を確認して、これが機能していないことを確認できますか?
他の誰かが述べたように、AWS :: DynamoDB :: Tableによって公開される属性は、Arn
およびStreamArn
のみです( AWS CloudFormation DynamoDBのドキュメント を参照)。
DynamoDBのarn
sの構文を提供すると、次の方法でテーブル名を取得できます。
Environment:
Variables:
TABLE_NAME: !Select [1, !Split ['/', !GetAtt DynamoDBTable.Arn]]
DynamoDBTableName
を返します。
!Ref
は、リソースの名前を「論理名」で返し、状況に応じて機能するはずです。ただし、リソース(テーブル)は参照する前に存在している必要があるため、2つのオプションがあります。
テンプレートの前の方で(参照する前に)テーブルリソースを宣言する
ラムダのようなDependsOn
プロパティを使用します
ServerlessFunction:
Type: AWS::Serverless::Function
DependsOn: DynamoDBTable
Fn::GetAtt
の使用について:
AWSドキュメント に基づいて、タイプAWS::DynamoDB::Table
のリソースを作成する場合、Fn::GetAtt
で使用できる属性は2つだけです。
Arn
StreamArn
つまり、現在のバージョンのCloudFormationでは、Fn::GetAtt
を使用してDynamoDBテーブルのTableName
属性を取得する方法はありません。