Passing a path parameter to Google's Endpoint for Cloud Function

有些话、适合烂在心里 提交于 2019-12-11 04:47:46

问题


I am following Google's tutorial on setting up Google Cloud endpoint (not AWS API Gateway) in front of my Cloud Function. I am triggering my Cloud Function to trigger an AWS lambda function, AND I am trying to pass a path parameter from my Endpoint as defined by OpenAPI spec.

Path parameters are variable parts of a URL path. They are typically used to point to a specific resource within a collection, such as a user identified by ID. A URL can have several path parameters, each denoted with curly braces { }.

paths:   /users/{id}:
    get:
      parameters:
        - in: path
          name: id   # Note the name is the same as in the path
          required: true
          schema: 
            type: integer

GET /users/{id}

My openapi.yaml

swagger: '2.0'
info:
  title: Cloud Endpoints + GCF
  description: Sample API on Cloud Endpoints with a Google Cloud Functions backend
  version: 1.0.0
host: HOST
x-google-endpoints:
- name: "HOST"
  allowCors: "true
schemes:
  - https
produces:
  - application/json
paths:
  /function1/{pathParameters}:
    get:
      operationId: function1
      parameters:
      - in: path
        name: pathParameters
        required: true
        type: string
      x-google-backend:
        address: https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net/function1
      responses:
        '200':
          description: A successful response
          schema:
            type: string

The error I get when I use Endpoint URL https://REGION-FUNCTIONS_PROJECT_ID.cloudfunctions.net/function1/conversations is a TypeError from my AWS lambda function

StatusCode:200, FunctionError: "Unhandled", ExecutedVersion: "$LATEST". Payload: "errorType":"TypeError", errorMessage:"Cannot read property 'startsWith' of undefined..."

It is saying that on line

var path = event.pathParameters;
...
...
if (path.startsWith('conversations/'){...};

my path var is undefined.

I initially thought my Google Function was not correctly passing pathParameters but when I tested my Google function using triggering event {"pathParameters":"conversations"}, my Lambda returns the payload successfully.

My Google Cloud Function:

let AWS = require('aws-sdk');

AWS.config.update({
  accessKeyId: 'key',
  secretAccessKey: 'secret',
  region: 'region'
})

let lambda = new AWS.Lambda();

exports.helloWorld = async(req,res) => {
  let params = {
     FunctionName:'lambdafunction',
     InvocationType: "RequestRespone",
     Payload: JSON.stringify(req.body)
  };

  res.status(200).send(await lambda.invoke(params, function(err,data){
      if(err){throw err}
      else{
         return data.Payload
      }
   }).promise());
}

EDIT 1:

Seeing this Google Group post, I tried adding to my openapi.yaml file path_translation: APPEND_PATH_TO_ADDRESS, yet still I'm having no luck.

...
paths:
  /{pathParameters}:
    get:
     ...
     x-google-backend:
       address: https://tomy.cloudfunctions.net/function-Name
       path_translation: APPEND_PATH_TO_ADDRESS

@Arunmainthan Kamalanathan mentioned in the comments that testing in AWS and Google Cloud directly with trigger event {"pathParameters":"conversations"} is not equivalent to passing req.body from my Google function to AWS lambda. I think this is where my error is occurring -- I'm not correctly passing my path parameter in the payload.

EDIT 2:

There is this Stackoverflow post concerning passing route parameters to Cloud Functions using req.path. When I console.log(req.path) I get / and console.log(req.params) I get {'0': '' }, so for some reason my path parameter is not getting passed correctly from Cloud Endpoint URL to my Google function.


回答1:


When your invocation type is RequestRespone, you can access the payload directly from the event parameter of lambda.

Look at the `Payload' parameter of the Google function:

let params = {
   FunctionName:'lambdafunction',
   InvocationType: "RequestRespone",
   Payload: JSON.stringify({ name: 'Arun'})
};

res.status(200).send(await lambda.invoke(params)...)

Also the Lambda part:

exports.handler = function(event, context) {
  context.succeed('Hello ' + event.name);
};

I hope this helps.



来源:https://stackoverflow.com/questions/59165012/passing-a-path-parameter-to-googles-endpoint-for-cloud-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!