I'm trying to mount an EFS to my Lambda function so that I can use large dependencies. So far I've been following this tutorial.
I slightly modified the .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}'
Whenever I run severless deploy
I get the following error:
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)
I tried commenting out various parts, and narrowed down the error to somewhere within
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}'
besides renaming (what I think is) an insignificant function name, this code snippet is the same as the reference. I tried hard coding #{AWS::AccountId}
based on my account ID, but that didn't work. I'm now a bit stumped.
Normally CloudFormation expects a Type
parameter in a resource definition, e.g. Type: AWS::Lambda::Function
, hence why you're seeing the error. In your case you're using the Override AWS CloudFormation Resource functionality by Serverless though, i.e. the name needs to exactly match the normalized function name Serverless assigns (see the doc linked above), in your case this would be TestLambdaFunction
.
Change your code to:
resources:
extensions:
TestLambdaFunction:
Properties:
[...]