!无服务器框架中的ImportValue无法正常工作

时间:2017-09-01 15:29:38

标签: amazon-cloudformation serverless-framework

我尝试从CloudFormation中创建的堆栈导出DynamoDb StreamArn,然后使用serverless.yml中的!ImportValue引用导出。

但我收到此错误消息:

unknown tag !<!ImportValue> in "/codebuild/output/src/serverless.yml"

cloudformation和serverless.yml定义如下。任何帮助表示赞赏。

StackA.yml

AWSTemplateFormatVersion: 2010-09-09
Description: Resources for the registration site

Resources:
  ClientTable:
    Type: AWS::DynamoDB::Table
    DeletionPolicy: Retain
    Properties:
      TableName: client
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      ProvisionedThroughput:
        ReadCapacityUnits: 2
        WriteCapacityUnits: 2
      StreamSpecification:
        StreamViewType: NEW_AND_OLD_IMAGES

Outputs:  
  ClientTableStreamArn:
      Description: The ARN for My ClientTable Stream
      Value: !GetAtt ClientTable.StreamArn
      Export:
        Name: my-client-table-stream-arn

serverless.yml

service: my-service

frameworkVersion: ">=1.1.0 <2.0.0"

provider:
  name: aws
  runtime: nodejs6.10
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:DescribeStream
        - dynamodb:GetRecords
        - dynamodb:GetShardIterator
        - dynamodb:ListStreams
        - dynamodb:GetItem
        - dynamodb:PutItem
      Resource: arn:aws:dynamodb:*:*:table/client

functions:

  foo:
    handler: foo.main
    events:
      - stream:
          type: dynamodb
          arn: !ImportValue my-client-table-stream-arn
          batchSize: 1

3 个答案:

答案 0 :(得分:5)

使用npm i --no-optional

解决

答案 1 :(得分:1)

您似乎正在使用!ImportValue简写为CloudFormation YAML。我的理解是,当CloudFormation解析YAML时,!ImportValue实际上是别名Fn::ImportValue。根据无服务器功能文档,它们似乎应该支持Fn::ImportValue形式的导入。

根据Fn::ImportValue的文档,您应该可以像

那样引用您的导出
  - stream:
      type: dynamodb
      arn: {"Fn::ImportValue": "my-client-table-stream-arn"}
      batchSize: 1

希望这有助于解决您的问题。

答案 2 :(得分:0)

我也为此而苦苦挣扎,对我来说欺骗的是:

functions:
  foo:
    handler: foo.main
    events:
      - stream:
         type: dynamodb
         arn: 
          !ImportValue my-client-table-stream-arn
         batchSize: 1

请注意,内在函数ImportValue换行并缩进,否则在生成event时将忽略整个cloudformation-template-update-stack.json