Невозможно использовать любую библиотеку изображений в проекте функции AWS Lambda в.NET Core

Я разрабатываю функцию Aws S3 Lambda в ядре.NET. Сейчас я пытаюсь изменить размер изображения и сохранить его как новый файл при загрузке файла изображения в корзину s3. Для изменения размера изображений в ядре.NET я попытался использовать все параметры, упомянутые в этой ссылке. Все параметры работают локально на моем ноутбуке с Windows. Но когда я устанавливаю какой-либо из пакетов или dll-файлов в свой проект и использую его в функции AWS Lambda, я получаю сообщение об ошибке. Для всех библиотек. Похоже, что AWS lambda использует сервер Linux, и библиотекам может потребоваться дополнительная настройка.

Например, когда я использую CoreCompat.System.Drawing в коде и создаю растровое изображение, как это.

var resized = new Bitmap(100, 100);

Я получил эту ошибку при тестировании на консоли AWS.

{
  "errorType": "AggregateException",
  "errorMessage": "One or more errors occurred. (The type initializer for 'System.Drawing.GDIPlus' threw an exception.)",
  "stackTrace": [
    "at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)",
    "at lambda_method(Closure , Stream , Stream , LambdaContextInternal )"
  ],
  "cause": {
    "errorType": "TypeInitializationException",
    "errorMessage": "The type initializer for 'System.Drawing.GDIPlus' threw an exception.",
    "stackTrace": [
      "at System.Drawing.GDIPlus.GdipCreateBitmapFromScan0(Int32 width, Int32 height, Int32 stride, PixelFormat format, IntPtr scan0, IntPtr& bmp)",
      "at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)",
      "at System.Drawing.Bitmap..ctor(Int32 width, Int32 height)",
      "at AwsS3Lambda.Function.<FunctionHandler>d__14.MoveNext() in C:\\Users\\Acer\\Desktop\\AwsS3Lambda\\AwsS3Lambda\\AwsS3Lambda\\Function.cs:line 117"
    ],
    "cause": {
      "errorType": "DllNotFoundException",
      "errorMessage": "Unable to load DLL 'gdiplus': The specified module or one of its dependencies could not be found.\n (Exception from HRESULT: 0x8007007E)",
      "stackTrace": [
        "at System.Drawing.GDIPlus.GdiplusStartup(UInt64& token, GdiplusStartupInput& input, GdiplusStartupOutput& output)",
        "at System.Drawing.GDIPlus..cctor()"
      ]
    }
  },
  "causes": [
    {
      "errorType": "TypeInitializationException",
      "errorMessage": "The type initializer for 'System.Drawing.GDIPlus' threw an exception.",
      "stackTrace": [
        "at System.Drawing.GDIPlus.GdipCreateBitmapFromScan0(Int32 width, Int32 height, Int32 stride, PixelFormat format, IntPtr scan0, IntPtr& bmp)",
        "at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)",
        "at System.Drawing.Bitmap..ctor(Int32 width, Int32 height)",
        "at AwsS3Lambda.Function.<FunctionHandler>d__14.MoveNext() in C:\\Users\\Acer\\Desktop\\AwsS3Lambda\\AwsS3Lambda\\AwsS3Lambda\\Function.cs:line 117"
      ],
      "cause": {
        "errorType": "DllNotFoundException",
        "errorMessage": "Unable to load DLL 'gdiplus': The specified module or one of its dependencies could not be found.\n (Exception from HRESULT: 0x8007007E)",
        "stackTrace": [
          "at System.Drawing.GDIPlus.GdiplusStartup(UInt64& token, GdiplusStartupInput& input, GdiplusStartupOutput& output)",
          "at System.Drawing.GDIPlus..cctor()"
        ]
      }
    }
  ]
}

Я знаю, что CoreCompat.System.Drawing имеет кросс-платформенную проблему. Итак, я попытался использовать SkiaSharp, который совместим для кроссплатформенности.

Однажды я называю эту строку кода.

using(var inputStream = new SKManagedStream(responseStream))
                  {

                  }

Я получил эту ошибку.

{
  "errorType": "AggregateException",
  "errorMessage": "One or more errors occurred. (The type initializer for 'SkiaSharp.SKAbstractManagedStream' threw an exception.)",
  "stackTrace": [
    "at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)",
    "at lambda_method(Closure , Stream , Stream , LambdaContextInternal )"
  ],
  "cause": {
    "errorType": "TypeInitializationException",
    "errorMessage": "The type initializer for 'SkiaSharp.SKAbstractManagedStream' threw an exception.",
    "stackTrace": [
      "at SkiaSharp.SKAbstractManagedStream..ctor(Boolean owns)",
      "at SkiaSharp.SKManagedStream..ctor(Stream managedStream, Boolean disposeManagedStream, Boolean owns)",
      "at SkiaSharp.SKManagedStream..ctor(Stream managedStream, Boolean disposeManagedStream)",
      "at SkiaSharp.SKManagedStream..ctor(Stream managedStream)",
      "at AwsS3Lambda.Function.<FunctionHandler>d__14.MoveNext() in C:\\Users\\Acer\\Desktop\\AwsS3Lambda\\AwsS3Lambda\\AwsS3Lambda\\Function.cs:line 113"
    ],
    "cause": {
      "errorType": "DllNotFoundException",
      "errorMessage": "Unable to load DLL 'libSkiaSharp': The specified module or one of its dependencies could not be found.\n (Exception from HRESULT: 0x8007007E)",
      "stackTrace": [
        "at SkiaSharp.SkiaApi.sk_managedstream_set_delegates(IntPtr pRead, IntPtr pPeek, IntPtr pIsAtEnd, IntPtr pHasPosition, IntPtr pHasLength, IntPtr pRewind, IntPtr pGetPosition, IntPtr pSeek, IntPtr pMove, IntPtr pGetLength, IntPtr pCreateNew, IntPtr pDestroy)",
        "at SkiaSharp.SKAbstractManagedStream..cctor()"
      ]
    }
  },
  "causes": [
    {
      "errorType": "TypeInitializationException",
      "errorMessage": "The type initializer for 'SkiaSharp.SKAbstractManagedStream' threw an exception.",
      "stackTrace": [
        "at SkiaSharp.SKAbstractManagedStream..ctor(Boolean owns)",
        "at SkiaSharp.SKManagedStream..ctor(Stream managedStream, Boolean disposeManagedStream, Boolean owns)",
        "at SkiaSharp.SKManagedStream..ctor(Stream managedStream, Boolean disposeManagedStream)",
        "at SkiaSharp.SKManagedStream..ctor(Stream managedStream)",
        "at AwsS3Lambda.Function.<FunctionHandler>d__14.MoveNext() in C:\\Users\\Acer\\Desktop\\AwsS3Lambda\\AwsS3Lambda\\AwsS3Lambda\\Function.cs:line 113"
      ],
      "cause": {
        "errorType": "DllNotFoundException",
        "errorMessage": "Unable to load DLL 'libSkiaSharp': The specified module or one of its dependencies could not be found.\n (Exception from HRESULT: 0x8007007E)",
        "stackTrace": [
          "at SkiaSharp.SkiaApi.sk_managedstream_set_delegates(IntPtr pRead, IntPtr pPeek, IntPtr pIsAtEnd, IntPtr pHasPosition, IntPtr pHasLength, IntPtr pRewind, IntPtr pGetPosition, IntPtr pSeek, IntPtr pMove, IntPtr pGetLength, IntPtr pCreateNew, IntPtr pDestroy)",
          "at SkiaSharp.SKAbstractManagedStream..cctor()"
        ]
      }
    }
  ]
}

Я перепробовал все библиотеки, указанные в ссылке. Все библиотеки работают с ядром.NET локально на моем ноутбуке, когда я создаю новое приложение проекта (Консоль) и тестирую его. Но все библиотеки не работают, когда я использую его в проекте функции AWS Lambda, потому что все библиотеки выдают соответствующую ошибку, когда я тестирую его на консоли AWS. Как изменить размер изображения в лямбда-функции AWS в.NET Core?

1 ответ

.NET Core поставляется с System.Drawing.Common, который является кроссплатформенной реализацией System.Drawing.

Он использует libgdiplus, и вам нужно убедиться, что вы установили libgdiplus на сервер, на котором будет выполняться ваш код. Проект libgdiplus находится по адресу github.com/mono/libgdiplus и поставляется с большинством дистрибутивов Linux.

То же самое касается SkiaSharp и его родного аналога.

Я не очень разбираюсь в функциях Amazon Lambda, но если у вас нет контроля над тем, какие пакеты установлены на сервере, на котором выполняется ваш код, вы также можете попробовать полностью управляемую библиотеку чертежей, такую ​​как ImageSharp.

Другие вопросы по тегам