无法在serverless.yml中引用cloudformation资源。变量UserPoolId的变量引用语法无效

时间:2018-05-08 19:39:48

标签: node.js amazon-web-services yaml serverless-framework serverless

我使用无服务器框架将无服务器应用程序部署到aws。但是,cloudformation部分未按预期工作。我在网上查了一下,发现我的yaml没有任何问题。

我正在使用Cloudformation创建UserPool,然后创建UserPoolClient。我对resources:

有以下yaml
resources:
  Resources:
    HttpBucket:
      Type: "AWS::S3::Bucket"
      Properties:
        BucketName: ${self:service}-${UserPoolId}
        AccessControl: PublicRead
        WebsiteConfiguration:
          IndexDocument: index.html
    UserPool:
      Type: "AWS::Cognito::UserPool"
      Properties:
        UserPoolName: ${self:service}-user-pool
        MfaConfiguration: "OFF"
        EmailVerificationSubject: "Your verification code"
        EmailVerificationMessage: "Your verification code is {####}. "  
        Schema:
          - Name: name
            AttributeDataType: String
            Mutable: true
            Required: true
          - Name: email
            AttributeDataType: String
            Mutable: false
            Required: true
          - Name: teamName
            AttributeDataType: String
            Mutable: true
            Required: false
          - Name: custom:supportedTeam
            AttributeDataType: String
            Mutable: true
            Required: false
          - Name: custom:payment
            AttributeDataType: String
            Mutable: true
            Required: false
            DeveloperOnlyAttribute: true
        UsernameAttributes:
          - email
        AutoVerifiedAttributes:
          - email
        AdminCreateUserConfig:
          InviteMessageTemplate:
            EmailMessage: 'Your username is {username} and temporary password is {####}. '
            EmailSubject: Your temporary password
            SMSMessage: 'Your username is {username} and temporary password is {####}. '
          UnusedAccountValidityDays: 7
          AllowAdminCreateUserOnly: false
        Policies:
          PasswordPolicy:
            RequireLowercase: true
            RequireSymbols: false
            RequireNumbers: true
            MinimumLength: 6
            RequireUppercase: true
    UserPoolClient:
      Type: "AWS::Cognito::UserPoolClient"
      Properties:
        ClientName: ${self:service}-client
        GenerateSecret: false
        UserPoolId: 
          Ref: UserPool
  Outputs:
    UserPoolId:
      Value: 
        Ref: UserPool
      Export:
        Name: "UserPool::Id"
    UserPoolClientId:
      Value: 
        Ref: UserPoolClient
      Export:
        Name: "UserPoolClient::Id"

指定UserPool(用作UserPoolClient时,我无法引用UserPoolId。 以下内容:

UserPoolId: 
  Ref: UserPool

产生错误:

  

变量UserPoolId的变量引用语法无效。您可以   仅参考env vars,options,&文件。您可以查看我们的文档   更多信息。

另一件我不确定的事情,我看到人们分享yaml包含以下语法:

UserPoolId: !Ref UserPool

但它也失败了,关于无效语法的错误(由于!Ref)。有谁可以清楚我这个?

2 个答案:

答案 0 :(得分:2)

在离开电脑一段时间后,我认为问题可能出在其他地方就是这样的情况。

我在环境变量下使用${UserPoolId}并意识到这就是问题所在。我改为以下方式,问题解决了。我没有正确引用用户池ID(它引用了名为UserPoolId的serverless.yml局部变量,该变量不存在)

userPoolId: 
      Ref: UserPool

这只是我的错误,现在已经解决了。

答案 1 :(得分:1)

我在编写模板时发现它有时会做错误的语法突出显示,我不得不写它以便它无法检查。

参考:UserPool

Fn :: Sub:'$ {UserPool}'

通过使用Substitute交换它,它无法检查字符串的内容是否有效,然后它将构造一个包含RefP到UserPool的字符串,或者用户池id

Fn::Sub documentation