AWS Lambda IronPDF en Amazon Linux 2

This article was translated from English: Does it need improvement?
Translated
View the article in English

AWS Lambda / Amazon Linux 2 (Instalar como admin/root usando IronPdf.Linux)

Esta información también se muestra en nuestro sitio web - https://ironpdf.com/how-to/creating-pdfs-csharp-amazon-aws-lambda/

Instrucciones AWS

  1. Vea https://aws.amazon.com/blogs/developer/net-5-aws-lambda-support-with-container-images/

  2. Cree y utilice el siguiente dockerfile:
    FROM public.ecr.aws/lambda/dotnet:5.0
    WORKDIR /var/task
    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
    # 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".
    FROM public.ecr.aws/lambda/dotnet:5.0
    WORKDIR /var/task
    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
    # 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".
SHELL
  1. Agregue el paquete IronPdf.Linux a su solución

  2. Modifica el código _FunctionHandler _ - este ejemplo creará un PDF desde una página web (https://ironpdf.com/) y lo guardará en /tmp. Para poder ver este PDF, debe subirse a otro servicio, como S3. (Ejemplo oficial de AWS disponible aquí - https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/dotnetv3/S3/S3_Basics/S3_Basics.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);
    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);
Public Function FunctionHandler(ByVal input As String, ByVal context As ILambdaContext) As Casing
				Try
					context.Logger.LogLine($"START FunctionHandler RequestId: {context.AwsRequestId} Input: {input}")

					Dim 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")
					Dim Renderer = New IronPdf.ChromePdfRenderer()
					context.Logger.LogLine($"rendering Pdf")
					Dim pdfDoc = Renderer.RenderUrlAsPdf("https://ironpdf.com/")
					Dim guid As System.Guid = System.Guid.NewGuid()
					Dim 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 e As Exception
					context.Logger.LogLine($"[ERROR] FunctionHandler : {e.Message}")
				End Try
				Return New Casing(input?.ToLower(), input?.ToUpper())
End Function
		}
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'		public record Casing(string Lower, string Upper)
$vbLabelText   $csharpLabel
  1. Aumentar la memoria y el tiempo de espera - IronPDF requiere más tiempo y memoria que el valor predeterminado de Lambda. Esto se puede configurar en aws-lambda-tools-defaults.json. Ajústelo a su función.

    En este ejemplo. configuramos a 512 (mb) y 330 (segundos):

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

La configuración también se puede actualizar utilizando la consola de Lambda - https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html#configuration-memory-console.

  1. Por favor, sigue la última parte de la siguiente documentación para publicar y probar una función Lambda https://aws.amazon.com/blogs/developer/net-5-aws-lambda-support-with-container-images/

  2. La función Lambda también se puede invocar usando la consola Lambda, https://console.aws.amazon.com/lambda, o invocarse a través de Visual Studio usando el AWS Toolkit para Visual Studio - https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/lambda-creating-project-in-visual-studio.html

    Si recibe el mensaje "GPU process isn't usable", es posible que la instalación no se haya ejecutado con privilegios de administrador. Intente ejecutar el software de nuevo con privilegios de administrador/root. Alternativamente, añada lo siguiente a su archivo docker:

  • RUN chmod 755 "runtimes/linux-x64/native/IronCefSubprocess"