Using IronPdf to create PDFS on AWS Lambda

1. Create AWS Lambda with container template (.Net5)

Please follow the top part of this official document from AWS. https://aws.amazon.com/blogs/developer/net-5-aws-lambda-support-with-container-images/

2. Add package dependencies

These dependencies is require for Chrome in this AWS environment. Please modify Docker file to be like this.

FROM public.ecr.aws/lambda/dotnet:5.0

WORKDIR /var/task

RUN yum update -y
RUN yum install -y pango.x86_64 
RUN yum install -y libXcomposite.x86_64 
RUN yum install -y libXcursor.x86_64
RUN yum install -y libXdamage.x86_64
RUN yum install -y libXext.x86_64 
RUN yum install -y libXi.x86_64 
RUN yum install -y libXtst.x86_64 
RUN yum install -y cups-libs.x86_64 
RUN yum install -y libXScrnSaver.x86_64 
RUN yum install -y libXrandr.x86_64
RUN yum install -y GConf2.x86_64 
RUN yum install -y alsa-lib.x86_64
RUN yum install -y atk.x86_64 
RUN yum install -y gtk3.x86_64 
RUN yum install -y ipa-gothic-fonts 
RUN yum install -y xorg-x11-fonts-100dpi
RUN yum install -y xorg-x11-fonts-75dpi
RUN yum install -y xorg-x11-utils
RUN yum install -y xorg-x11-fonts-cyrillic
RUN yum install -y xorg-x11-fonts-Type1 
RUN yum install -y xorg-x11-fonts-misc
RUN yum install -y glibc-devel.x86_64
RUN yum install -y at-spi2-atk.x86_64
RUN yum install -y mesa-libgbm.x86_64
RUN yum install -y libxkbcommon

# This COPY command copies the .NET Lambda project's build artifacts from the host machine into the image. 
# The source of the COPY should match where the .NET Lambda project publishes its build artifacts. If the Lambda function is being built 
# with the AWS .NET Lambda Tooling, the `--docker-host-build-output-dir` switch controls where the .NET Lambda project
# will be built. The .NET Lambda project templates default to having `--docker-host-build-output-dir`
# set in the aws-lambda-tools-defaults.json file to "bin/Release/lambda-publish".
#
# Alternatively Docker multi-stage build could be used to build the .NET Lambda project inside the image.
# For more information on this approach checkout the project's README.md file.
COPY "bin/Release/lambda-publish"  .

3. Add Iron Pdf (Linux) Nuget package

Install IronPdf.Linux

  1. In Solution Explorer, right-click References, Manage NuGet Packages
  2. Select Browse and search IronPdf.Linux
  3. Select the package and install.

4. Modify FunctionHandler code

this example will create pdf from webpage https://ironpdf.com/ and save to /tmp . In order to view this pdf you must upload this pdf to another service such as S3. (you can find an offical aws example here https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/dotnetv3/S3/UploadObjectExample/UploadObject/UploadObject.cs)

        public Casing FunctionHandler(string input, ILambdaContext context)
        {
            try
            {
                context.Logger.LogLine($"START FunctionHandler RequestId: {context.AwsRequestId} Input: {input}");

                var awsTmpPath = @"/tmp/"; // AWS temporary storage

                //[optional] enable logging (please uncomment these code if you face any problem)
                //IronPdf.Logging.Logger.EnableDebugging = true;
                //IronPdf.Logging.Logger.LogFilePath = awsTmpPath;
                //IronPdf.Logging.Logger.LoggingMode = IronPdf.Logging.Logger.LoggingModes.All;

                //set your license key
                IronPdf.License.LicenseKey = "YOUR_LICENSE_KEY";

                //set ChromeGpuMode to Disabled
                IronPdf.Installation.ChromeGpuMode = IronPdf.Engines.Chrome.ChromeGpuModes.Disabled;
                //set DefaultRenderingEngine to Chrome
                IronPdf.Installation.DefaultRenderingEngine = IronPdf.Rendering.PdfRenderingEngine.Chrome;

                //set IronPDF Temp Path
                Environment.SetEnvironmentVariable("TEMP", awsTmpPath, EnvironmentVariableTarget.Process);
                Environment.SetEnvironmentVariable("TMP", awsTmpPath, EnvironmentVariableTarget.Process);
                IronPdf.Installation.TempFolderPath = awsTmpPath;
                IronPdf.Installation.CustomDeploymentDirectory = awsTmpPath;

                //set auto LinuxAndDockerDependenciesAutoConfig
                IronPdf.Installation.LinuxAndDockerDependenciesAutoConfig = true;

                context.Logger.LogLine($"creating IronPdf.ChromePdfRenderer");
                var Renderer = new IronPdf.ChromePdfRenderer();

                context.Logger.LogLine($"rendering Pdf");
                using var pdfDoc = Renderer.RenderUrlAsPdf("https://ironpdf.com/");

                var guid = Guid.NewGuid();
                var fileName = $"/tmp/{input}_{guid}.pdf"; //save file to /tmp

                context.Logger.LogLine($"saving pdf name : {fileName}");
                pdfDoc.SaveAs(fileName);

                //here you can upload saved pdf file to anywhere such as S3. 

                context.Logger.LogLine($"COMPLETE!");
            }
            catch (Exception e)
            {
                context.Logger.LogLine($"[ERROR] FunctionHandler : {e.Message}");
            }

            return new Casing(input?.ToLower(), input?.ToUpper());
        }
    }

    public record Casing(string Lower, string Upper);

5. Increase Memory and Timeout

IronPdf require more time and memory than the default value of Lambda. you can config at aws-lambda-tools-defaults.json. Please adjust this to match you function. In this example we will set to 512 (mb) and 330 (seconds)

    "function-memory-size" : 512, 
    "function-timeout"     : 330,

You also can update this config using lambda console. https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html#configuration-memory-console

6. Publish

Please follow the bottom part of this document to publish and try your Lambda function. https://aws.amazon.com/blogs/developer/net-5-aws-lambda-support-with-container-images/

7. Try it out!

You can invoke lambda function by using lambda console https://console.aws.amazon.com/lambda or invoke via visual studio by using AWS Toolkit for Visual Studio. https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/lambda-creating-project-in-visual-studio.html