!无服务器框架中的 ImportValue 不起作用

!ImportValue in Serverless Framework not working

我正在尝试从 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

您似乎正在为 CloudFormation YAML 使用 !ImportValue shorthand。我的理解是,当 CloudFormation 解析 YAML 时,!ImportValue 实际上是别名 Fn::ImportValue。根据 Serverless Function 文档,它们似乎应该支持 Fn::ImportValue 形式的导入。

根据 Fn::ImportValue 的文档,您应该能够像

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

希望对您的问题有所帮助。

使用${cf:stackName.outputKey}

解决

我也为此苦苦挣扎,对我有用的是:

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

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