Skip to content

Latest commit

 

History

History
121 lines (94 loc) · 4.07 KB

README.md

File metadata and controls

121 lines (94 loc) · 4.07 KB

sharp for AWS Lambda Layers

GitHub release Build action

About

The prebuilt sharp node module for AWS Lambda layer.

Features

  • Built and tested automatically using GitHub Actions
  • Automatically releases sharp updates with GitHub Actions
  • Separated builds for arm64 and x64
  • Minified and bundled with esbuild
  • Minimum 6.98 MB zip file to optimize cold start time

Why use a bundled Lambda function? / Why separate build for arm64?

Please check out Optimizing Node.js dependencies in AWS Lambda for details. A bundled and minified lambda function can be up to 70% faster for cold starts. The package size is also crucial for cold start performance.

Download

Releases

Download latest release-arm64.zip or release-x64.zip

Usage

import sharp from 'sharp'

Check out aws: Creating and sharing Lambda layers for more details.

This package can be used with sst. Check out docs.sst.dev: Lambda Layers and sst.dev: Resize Images for examples.

Setting arm64 for sst functions

function: {
  handler: '{handler}',
  runtime: 'nodejs18.x',
  architecture: 'arm_64',
  nodejs: {
    esbuild: {
      external: ['sharp'],
    },
  },
  layers: [
    new lambda.LayerVersion(stack, 'SharpLayer', {
      code: lambda.Code.fromAsset('layers/sharp'),
      compatibleArchitectures: [
        lambda.Architecture.ARM_64
      ]
    }),
  ]
}

Setting up a lambda layer for AWS SAM

Providing a zip file locally actually works, even though it's not mentioned in the documentation.

  ## Lambda
  ImageFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: image-lambda/
      Handler: app.handler
      Runtime: nodejs18.x
      Architectures:
        - arm64
      Timeout: 30
      MemorySize: 1024
      Layers:
        - !Ref SharpLayer
    Metadata:
      BuildMethod: esbuild
      BuildProperties:
        # Check these two issues for problems related to esm and esbuild
        # https://github.com/evanw/esbuild/issues/1921
        # https://github.com/evanw/esbuild/pull/2067#issuecomment-1503688128
        # Switch to cjs when esm doesn't work
        Format: esm
        OutExtension:
          - .js=.mjs
        EntryPoints:
          - app.ts
        External:
          - '@aws-sdk/*' # @aws-sdk 3.x is installed globally for nodejs18.x
          - sharp # use layer
  ## Lambda layer
  SharpLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: sharp
      ContentUri: layers/sharp/release-arm64.zip # zip
      CompatibleArchitectures:
        - arm64
      CompatibleRuntimes:
        - nodejs18.x
        - nodejs16.x

Build

Fork this repo -> Actions -> Run build.yml

References

Umkus/lambda-layer-sharp - another maintained sharp lambda layer

aws: Creating and sharing Lambda layers

aws: Working with layers

aws: Building layers

sharp: Installation - AWS Lambda