Ошибка Serverless Framework: каждый объект ресурсов должен содержать член типа

Я пытаюсь подключить EFS к своей функции Lambda, чтобы можно было использовать большие зависимости. До сих пор я следил за это руководство.

Я немного изменил .yml.

serverless.yml

service: test2EFS

plugins:
  - serverless-pseudo-parameters

custom:
  efsAccessPoint: fsap-00**********
  LocalMountPath: /mnt/efs
  subnetsId: subnet-0b**********
  securityGroup: sg-0b7**********

provider:
  name: aws
  runtime: python3.6
  region: us-east-2

package:
  exclude:
    - node_modules/**
    - .vscode/**
    - .serverless/**
    - .pytest_cache/**
    - __pychache__/**

functions:
  test:
    handler: handler.handler
    environment: # Service wide environment variables
      MNT_DIR: ${self:custom.LocalMountPath}
    vpc:
      securityGroupIds:
        - ${self:custom.securityGroup}
      subnetIds:
        - ${self:custom.subnetsId}
    iamManagedPolicies:
      - arn:aws:iam::aws:policy/AmazonElasticFileSystemClientReadWriteAccess
    events:
      - http:
          path: test
          method: get

resources:
  extensions:
    # Name of function
    test2EFSLambdaFunction:
      Properties:
        FileSystemConfigs:
          - Arn: 'arn:aws:elasticfilesystem:${self:provider.region}:#{AWS::AccountId}:access-point/${self:custom.efsAccessPoint}'
            LocalMountPath: '${self:custom.LocalMountPath}'

Каждый раз, когда я запускаю severless deploy, я получаю следующую ошибку:

Serverless: Uploading artifacts...
Serverless: Uploading service test2EFS.zip file to S3 (926 B)...
Serverless: Validating template...
 
  Error --------------------------------------------------
 
  Error: The CloudFormation template is invalid: Template format error: [/Resources/test2EFSLambdaFunction] Every Resources object must contain a Type member.
      at provider.request.catch (/usr/local/lib/node_modules/serverless/lib/plugins/aws/deploy/lib/validateTemplate.js:20:13)
      at tryCatcher (/usr/local/lib/node_modules/serverless/node_modules/bluebird/js/release/util.js:16:23)
      at Promise._settlePromiseFromHandler (/usr/local/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:547:31)
      at Promise._settlePromise (/usr/local/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:604:18)
      at Promise._settlePromise0 (/usr/local/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:649:10)
      at Promise._settlePromises (/usr/local/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:725:18)
      at _drainQueueStep (/usr/local/lib/node_modules/serverless/node_modules/bluebird/js/release/async.js:93:12)
      at _drainQueue (/usr/local/lib/node_modules/serverless/node_modules/bluebird/js/release/async.js:86:9)
      at Async._drainQueues (/usr/local/lib/node_modules/serverless/node_modules/bluebird/js/release/async.js:102:5)
      at Immediate.Async.drainQueues [as _onImmediate] (/usr/local/lib/node_modules/serverless/node_modules/bluebird/js/release/async.js:15:14)
      at runCallback (timers.js:705:18)
      at tryOnImmediate (timers.js:676:5)
      at processImmediate (timers.js:658:5)
      at process.topLevelDomainCallback (domain.js:126:23)

Я попытался закомментировать различные части и сузил ошибку где-то в пределах

resources:
  extensions:
    # Name of function
    test2EFSLambdaFunction:
      Properties:
        FileSystemConfigs:
          - Arn: 'arn:aws:elasticfilesystem:${self:provider.region}:#{AWS::AccountId}:access-point/${self:custom.efsAccessPoint}'
            LocalMountPath: '${self:custom.LocalMountPath}'

помимо переименования (как мне кажется) незначительного имени функции, этот фрагмент кода такой же, как и ссылка. Я очень старался кодировать #{AWS::AccountId} на основе идентификатора моей учетной записи, но это не сработало. Я сейчас немного в тупике.


person Warlax56    schedule 08.02.2021    source источник


Ответы (2)


Обычно CloudFormation ожидает параметр Type в определении ресурса, например Type: AWS::Lambda::Function, поэтому вы видите ошибку. В вашем случае вы используете Однако переопределить функциональность AWS CloudFormation Resource бессерверной функцией, то есть имя должно точно соответствовать нормализованному имени функции, которое назначает бессерверный сервер (см. Приведенный выше документ), в вашем случае это будет TestLambdaFunction.

Измените свой код на:

resources:
  extensions:
    TestLambdaFunction:
      Properties:
        [...]
person yvesonline    schedule 08.02.2021
comment
что это сделал, ты мужчина. Спасибо! - person Warlax56; 08.02.2021

Я поговорил с некоторыми людьми на GitHub. Как заявляет yvesonline, этот метод переопределяет автоматически сгенерированный код формирования облака. Бессерверная версия имеет встроенную поддержку EFS, и ее рекомендуется использовать вместо метода, описанного в вопросе.

родная EFS в serverless выглядит примерно так; с fileSystemConfig, существующим в определении функции:

test:
    handler: handler.test
    environment: # Service wide environment variables
      MNT_DIR: ${self:custom.LocalMountPath}
    vpc:
      securityGroupIds:
        - ${self:custom.securityGroup}
      subnetIds:
        - ${self:custom.subnetsId}
    iamManagedPolicies:
      - arn:aws:iam::aws:policy/AmazonElasticFileSystemClientReadWriteAccess
    events:
      - http:
          path: test
          method: get
    fileSystemConfig:
      localMountPath: '${self:custom.LocalMountPath}'
      arn: 'arn:aws:elasticfilesystem:${self:provider.region}:#{AWS::AccountId}:access-point/${self:custom.efsAccessPoint}'

вы можете узнать больше о конфигурации efs без сервера здесь

person Warlax56    schedule 10.02.2021