Writing AWS Lambda function in Typescript
AWS Lambda doesn’t support Typescript out of the box. I have to convert typescript files into javascript and upload it to the lambda. I thought it must be a trivial job to do it, yet I couldn’t find any starter package like create-react-app.
After a bit of googling-around, it seemed Webpack is the tool to bundle multiple javascript files into one. So I started learning Webpack by watching videos on YouTube. Before, I just used create-react-app and it did everything I need for me.
Webpack
Following the tutorial series, I’ve initialised the typescript project
tsc --init
I updated tsconfig.json
, though. By default, it’s es5
and commonjs
"target": "es6",
"module": "ES2015",
Then I initialised the project with npm
to create package.json
npm init
I can install NPM packages now. I prefer yarn
yarn add typescript webpack webpack-cli ts-loader --dev
You may have typescript installed globally, yet you need to install it locally as well for the webpack to work properly.
I’ve created /src
and /dist
in the root directory. Now my project folder looks like this.
Let’s add webpack.config
to transpile and bundle the typescripts.
const path = require('path')
module.exports = {
entry: {
'create-user': './src/create-user/index.ts',
'create-job': './src/create-job/index.ts'
},
devtool: 'inline-source-map',
module: {
rules: [
{
test: /\.ts$/,
use: 'ts-loader',
exclude: /node_modules/,
}
]
},
resolve: {
extensions: ['.ts', '.js'],
},
output: {
library: {
type: 'commonjs2',
},
filename: '[name]/index.js',
path: path.resolve(__dirname, 'dist')
}
}
I’m going to create multiple functions in this project. So it has multiple entry points. Each function has its own directory. I have two directories, create-user
and create-job
.
module
’s rules
specifies ts-loader
as transpiler. It will convert typescript files in src
directory into javascript. test
acts like a filter.
output
tells the webpack where to store the bundled scripts. path
accepts absolute path, so I used Nodejs’ path
library. [name]
refers to the name of the entry. Output directory will have sub-directories of create-user
and create-job
Finally, add webpack script in the package.json
file.
"scripts": {
"build": "webpack"
},
When you do yarn build
it will bundle up all typescript files into a single javascript file, index.js
in each directory.
Handling parameters
API Gateway will send parameters to lambda. The types of parameters are
-
Path Parameter
-
QueryString parameter
-
Body
Lambda function accepts event
parameter and you can get all those 3 parameters from it.
// queryStringParameters
export const handler = Sentry.AWSLambda.wrapHandler(async (ev: any, context: Context) => {
const companyId = ev.queryStringParameters.companyId
const jobNo = ev.queryStringParameters.jobNo
console.log('getting job details for job id: ', companyId, jobNo)
// pathParameters
export const handler = Sentry.AWSLambda.wrapHandler(
async (ev: any, context: Context) => {
const jobNo = ev.pathParameters.jobNo
// body
export const handler = Sentry.AWSLambda.wrapHandler(async (ev: any, context: Context) => {
const { email } = JSON.parse(ev.body)
Comments