In a Serverless project, how can one get the ARN of one Lambda function deployed a the project to another in the same project? - serverless-framework

I'm working on a web service in which one Lambda function serves requests from a web browser. This request handling kicks off some slow work that can be completed asynchronously, so I have a separate Lambda function that I want to invoke asynchronously to handle the slow work.
This is being deployed as a Serverless project. The serverless.yml file looks like this:
service: AsyncService
frameworkVersion: '=1.54.0'
provider:
name: aws
runtime: go1.x
package:
exclude:
- ./**
include:
- ./bin/**
functions:
FrontEnd:
handler: bin/FrontEnd
events:
- http:
path: processData
method: post
environment:
AsyncWorkerARN: ???
AsyncWorker:
handler: bin/AsyncWorker
The question is how can I get the ARN of the AsyncWorker Lambda function into an environment variable of the FrontEnd Lambda function without hardcoding it? I need it there to be able to invoke the AsyncWorker Lambda.

I think the best way is to use the serverless-pseudo-parameters plugin and then do something like: arn:aws:lambda:#{AWS::Region}:#{AWS::AccountId}:function:AsyncService-dev-AsyncWorker

Related

Defining API path with query string Serverless HTTP API (API Gateway v2)

How can I define the path in serverless.yml with more than one query parameter using HTTP API (API Gateway v2) so that the endpoint looks like the following:
https://example.com/rest/endpoint?id=$id&tag=$tag
serverless.yml
dfsPostback:
handler: handlers/result.main
events:
- httpApi:
path: /dfs-pingback // need help here
method: get
I tried with
path: /dfs-pingback?id={id}&tag={tag}
deployment failed
There is no need to specify the query parameters in the path. You should be able to access all passed query params in your event handler.

Change API Gateway Name when using Serverless Framework

The Serverless framework has made it very easy for developers to create an API gateway connected to a lambda function. like this
hello:
name: hello-handler
description: blablabla
handler: /lambda-functions/hello-handler.handler
role: HelloRole
package:
include:
- lambda-functions/hello-handler.js
events:
- http: GET hello
My question is how can I change the name of the API gateway that is going to be created?
Based on the doc, this should do the trick.
provider:
...
apiName: custom-api-name # Use a custom name for the API Gateway API

AWS Api Gateway proxy for s3 bucket with Serverless Framework

I am deploying a project with the Serverless framework that includes different resources (a lambda function, cognito user pool, cognito identity pool, etc...)
For a previous project, we created from the console (so manually) the configuration for a second Api Gateway (in addition to the one that we configured with Serverless on the lambda) to just be the proxy for our s3 bucket, so we were able to add and get files from the bucket without using the lambda.
Now, I want to make the exact thing to this new project, but instead making the second Api Gateway manually from the console, there is a way to declare this proxy directly from Serverless configuration?
I searched for different solutions, but I didn't find any guide for this.
What I'm trying to make in the configuration is what this amazon guide explains.
You can use this plugin that allows setting up API Gateway service proxies very easily (I'm one of the collaborators).
serverless.yml example:
service: s3-proxy
provider:
name: aws
runtime: nodejs10.x
plugins:
- serverless-apigateway-service-proxy
custom:
apiGatewayServiceProxies:
- s3:
path: /s3/{key}
method: post
action: PutObject
bucket:
Ref: S3Bucket
key:
pathParam: key
cors: true
resources:
Resources:
S3Bucket:
Type: 'AWS::S3::Bucket'

How to use default request templates when using the serverless framework?

I understand that I need to specify a request template for the API gateway in order to gain access to the request headers. The Serverless docs say:
"Serverless ships with the following default request templates you can use out of the box:"
The default templates look like they provide access to what I want (i.e. request headers), but how do you tell Serverless to use them?
The "default request templates you can use out of the box" are referring to a lambda integration, not a "default" integration, where you leave the parameter blank. If no integration is defined, then it is the default integration. So, under http, add "integration: lambda".
However, that being said, you should still have access to the headers when you do not specify the integration.
Lambda Integration
https://serverless.com/framework/docs/providers/aws/events/apigateway/#example-lambda-event-before-customization
functions:
create:
handler: posts.create
events:
- http:
path: posts/create
method: post
integration: lambda
Default Integration
https://serverless.com/framework/docs/providers/aws/events/apigateway/#example-lambda-proxy-event-default
functions:
index:
handler: handler.hello
events:
- http: GET hello

Invoke Lambda function without authorization on local serverless-offline environment

I am trying to test authorization of a Lambda function using Cognito, Serverless framework & Serverless-Offline plugin.
When I run my stack locally using serverless offline, all requests by default are authorized and I can execute them without a problem.
The command is serverless offline
What I cant do is test unauthorized requests locally, when I use the argument --noAuth the request is still authorized by default, which means I can't test scenarios of unauthorized access.
Using serverless offline --noAuth
When I am developing locally, how can I test requests against my handler that are unauthorized?
Here is my yml:
service: apples
provider:
name: aws
runtime: nodejs8.10
stage: ${opt:stage, 'dev'}
region: ap-southeast-2
profile: personal
plugins:
- serverless-offline
functions:
hello:
handler: handler.hello
events:
- http:
path: users
method: get
cors: true
authorizer:
arn: ${cf:apples-auth-dev.CognitoUserPoolArn}