web-dev-qa-db-ja.com

AWS CloudFormationテンプレートで!Ref DynamoDBテーブル名を参照する

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であることを期待していますが、未定義を返します。テンプレートを期待どおりに機能させるにはどうすればよいですか?

6
McShaman

コンソールでラムダ関数を調べて、想定されている場所より下にない環境変数を確認して、これが機能していないことを確認できますか?

1
Nick Littrell

他の誰かが述べたように、AWS :: DynamoDB :: Tableによって公開される属性は、ArnおよびStreamArnのみです( AWS CloudFormation DynamoDBのドキュメント を参照)。

DynamoDBのarnsの構文を提供すると、次の方法でテーブル名を取得できます。

      Environment: 
        Variables:
          TABLE_NAME: !Select [1, !Split ['/', !GetAtt DynamoDBTable.Arn]] 

DynamoDBTableNameを返します。

1
Lord of the Goo

!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属性を取得する方法はありません。

0