Using node.js on WSL2 with Debian, I'm doing a sample project as detailed here, and I'm currently at this stage.
OLD [solved; scroll to NEW]
When I try to deploy, it gives me
An error occurred: ApiGatewayResourceNotesId - Resource's path part only allow a-zA-Z0-9._- and curly braces at the beginning and the end. (Service: AmazonApiGateway; Status Code: 400; Error Code: BadRequestException;
It seems to be coming from my YAML line here (I say seems because this is the only code in all my project files which mentions "(R|r)esource")
(Error #1)
environment: tableName: notes-sample iamRoleStatements: - Effect: Allow Action: - dynamodb:Scan - dynamodb:Query - dynamodb:GetItem - dynamodb:PutItem - dynamodb:UpdateItem - dynamodb:DeleteItem - dynamodb:DescribeTable Resource: "arn:aws:dynamodb:us-west-2:*:*" # <-- here ---
Yet the example shown on the website uses the same format as above, and I assume it works for them.
Edit 1: Also using Resource: '*'
gives the same error.
Edit 2: Also using Amazon's docs and formatting like Resource: "arn:aws:dynamodb:us-west-2::"
gives the same error.
Edit 4: Also tried
Resource: Fn::Join: - '' - - "arn:aws:dynamodb:us-west-2:<redacted>:table/notes-sample"
I've also tried formatting it this way
(Error #2)
environment: tableName: { "Ref": "notes-sample" } # <-- here: change 1 --- # 'iamRoleStatements' defines the permission policy for the Lambda function. # In this case Lambda functions are granted with permissions to access DynamoDB. iamRoleStatements: - Effect: Allow Action: - dynamodb:Scan - dynamodb:Query - dynamodb:GetItem - dynamodb:PutItem - dynamodb:UpdateItem - dynamodb:DeleteItem - dynamodb:DescribeTable Resource: { "Fn::GetAtt": ["sample-note", "Arn"] } # <-- here: change 2 ---
however, when Serverless validates the template, it gives me the error
Error: The CloudFormation template is invalid: Template format error: Unresolved resource dependencies [notes-sample] in the Resources block of the template at /home/USER/.nvm/versions/node/v15.6.0/lib/node_modules/serverless/lib/plugins/aws/deploy/lib/validateTemplate.js:20:13
For one, I can't find that folder on my PC, and don't know where else it might be, and two the problem still seems to be this one line of code, and I don't know what I'm missing, here.
I've looked at examples one, two, and tried to go through this Japanese site, but I don't seem to be seeing what's wrong with this line.
I appreciate anyone's help.
Edit 3: Also using Resource: { arn:aws:dynamodb:us-west-2:: }
or Resource: { arn:aws:dynamodb:us-west-2:*:* }
gives this error
Error: The CloudFormation template is invalid: [/Resources/IamRoleLambdaExecution/Type/Policies/0/PolicyDocument/Statement/2/Resource/arn:aws:dynamodb:us-west-2:*:*] 'null' values are not allowed in templates
I found out I was focusing on the wrong area and for two of my YAML files function definitions I had used [brackets] in place of {braces} from
update: handler: update.main events: - http: path: notes/[id] # <-- here -- method: put delete: handler: delete.main events: - http: path: notes/[id] # <-- here -- method: delete
to
update: handler: update.main events: - http: path: notes/{id} # <-- here -- method: put delete: handler: delete.main events: - http: path: notes/{id} # <-- here -- method: delete
Edit 5: I also fixed all the functions using path: notes
to path: notes-sample
so they match my [environment][tableName]
declaration.
NEW
However, now the error I'm getting is
An error occurred: DeleteLambdaFunction - Uploaded file must be a non-empty zip (Service: AWSLambdaInternal; Status Code: 400; Error Code: InvalidParameterValueException
I checked out AWS Lambda deployment guide and this Python thread, neither of which helped directly solve this.
INFORMATION
serverless.yml
# NOTE: update this with your service name service: notes-api # Create an optimized package for our functions package: individually: true plugins: - serverless-bundle # Package our functions with Webpack - serverless-offline - serverless-dotenv-plugin # Load .env as environment variables provider: name: aws runtime: nodejs12.x stage: prod region: us-west-2 # To load environment variables externally # rename env.example to .env and uncomment # the following line. Also, make sure to not # commit your .env. environment: tableName: notes-sample # SAMPLE_ENV_VAR: ${env:SAMPLE_ENV_VAR} # 'iamRoleStatements' defines the permission policy for the Lambda function. # In this case Lambda functions are granted with permissions to access DynamoDB. iamRoleStatements: - Effect: Allow Action: - dynamodb:Scan - dynamodb:Querynpm i -D - dynamodb:GetItem - dynamodb:PutItem - dynamodb:UpdateItem - dynamodb:DeleteItem - dynamodb:DescribeTable Resource: "arn:aws:dynamodb:us-west-2:082581148431:table/notes-sample" functions: create: handler: create.main events: - http: path: notes-sample method: post get: # Defines an HTTP API endpoint that calls the main function in get.js # - path: url path is /notes-sample/{id} # - method: GET request handler: get.main events: - http: path: notes-sample/{id} method: get list: handler: list.main events: - http: path: notes-sample method: get update: handler: update.main events: - http: path: notes-sample/{id} method: put delete: handler: delete.main events: - http: path: notes-sample/{id} method: delete
Old error #1
An error occurred: ApiGatewayResourceNotesId - Resource's path part only allow a-zA-Z0-9._- and curly braces at the beginning and the end. (Service: AmazonApiGateway; Status Code: 400; Error Code: BadRequestException; Request ID: f*******-4ae8-4**0-a822-7***********; Proxy: null).
Old error #2
Error: The CloudFormation template is invalid: Template format error: Unresolved resource dependencies [notes-sample] in the Resources block of the template at /home/USER/.nvm/versions/node/v15.6.0/lib/node_modules/serverless/lib/plugins/aws/deploy/lib/validateTemplate.js:20:13 at tryCatcher (/home/USER/.nvm/versions/node/v15.6.0/lib/node_modules/serverless/node_modules/bluebird/js/release/util.js:16:23) at Promise._settlePromiseFromHandler (/home/USER/.nvm/versions/node/v15.6.0/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:547:31) at Promise._settlePromise (/home/USER/.nvm/versions/node/v15.6.0/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:604:18) at Promise._settlePromise0 (/home/USER/.nvm/versions/node/v15.6.0/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:649:10) at Promise._settlePromises (/home/USER/.nvm/versions/node/v15.6.0/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:725:18) at _drainQueueStep (/home/USER/.nvm/versions/node/v15.6.0/lib/node_modules/serverless/node_modules/bluebird/js/release/async.js:93:12) at _drainQueue (/home/USER/.nvm/versions/node/v15.6.0/lib/node_modules/serverless/node_modules/bluebird/js/release/async.js:86:9) at Async._drainQueues (/home/USER/.nvm/versions/node/v15.6.0/lib/node_modules/serverless/node_modules/bluebird/js/release/async.js:102:5) at Immediate.Async.drainQueues [as _onImmediate] (/home/USER/.nvm/versions/node/v15.6.0/lib/node_modules/serverless/node_modules/bluebird/js/release/async.js:15:14) at processImmediate (node:internal/timers:463:21)
https://stackoverflow.com/questions/65856003/serverless-amazonapigateway-400-badrequestexception-resources-path-part-only-al January 23, 2021 at 01:20PM
没有评论:
发表评论