Aws cdk graphicsmagick лямбда pdf в png

Мне требуется AWS CDK для развертывания лямбда-парка, и я хотел бы использовать gm для преобразования первой страницы PDF в PNG. Я в порядке с реализацией, так как она отлично работает на моем ноутбуке, мне просто нужна помощь в добавлении двоичных файлов GraphicsMagick.

Я, конечно, получаю Error: Stream yields empty buffer, потому что приведенная ниже NodejsFunction не включает в себя необходимые двоичные файлы. Как развернуть NodejsFunction с установленным GraphicsMagick?

    const designerHandler = new NodejsFunction(this, "designer-server", {
      functionName: "designer-server",
      memorySize: 512,
      runtime: lambda.Runtime.NODEJS_12_X,
      handler: "handler",
      entry: path.join(__dirname, "./server/src/index.ts"),
      timeout: cdk.Duration.seconds(30),
    });

Я безуспешно пытался использовать слои, и сейчас я изучаю использование докера.

    designerHandler.addLayers(
      lambda.LayerVersion.fromLayerVersionArn(
        this,
        "layer-graphicsmagick",
        "arn:aws:lambda:ap-southeast-2:391641713082:layer:graphicsmagick-layer:1"
      )
    );

Вот мое использование с gm.

  const pngOf = (pdf: Buffer) => {
    return new Promise(
      (resolve: (value: Buffer) => void, reject: (reason: any) => void) => {
        gm(pdf)
          .density(600, 600)
          .resize(600)
          .toBuffer('PNG', (err, png) => {
            if (err) {
              reject(err);
            }
            resolve(png);
          });
      }
    );
  };

Как выглядит ваш обработчик?

Andrew Gillis 21.11.2022 02:07
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
1
1
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В итоге я решил это с помощью функции DockerImage.

const designerHandler = new lambda.DockerImageFunction(
  this,
  "designer-server",
  {
    functionName: "designer-server",
    memorySize: 512,
    code: lambda.DockerImageCode.fromImageAsset(
      path.join(__dirname, "./server")
    ),
    timeout: cdk.Duration.seconds(30),
  }
);

Dockerfile следующим образом

# transpile typescript into javascript
FROM public.ecr.aws/lambda/nodejs:18 as builder

WORKDIR /usr/app

COPY package*.json ./
RUN npm install

# .dockerignore node_modules/ dist/
COPY . .
# rimraf dist && tsc
RUN npm run build 


FROM public.ecr.aws/lambda/nodejs:18

WORKDIR ${LAMBDA_TASK_ROOT}

RUN yum -y install gcc-c++ make libpng-devel libjpeg-devel libtiff-devel wget tar gzip libpng libjpeg libtiff ghostscript freetype freetype-devel jasper jasper-devel
RUN wget https://sourceforge.net/projects/graphicsmagick/files/graphicsmagick/1.3.38/GraphicsMagick-1.3.38.tar.gz \
        && tar -zxvf GraphicsMagick-1.3.38.tar.gz \
        && rm GraphicsMagick-1.3.38.tar.gz
RUN ./GraphicsMagick-1.3.38/configure --prefix=/var/task/graphicsmagick --enable-shared=no --enable-static=yes
RUN make
RUN make install
RUN tar -zcvf ~/graphicsmagick.tgz /var/task/graphicsmagick/

ENV PATH = "${PATH}:/var/task/graphicsmagick/bin"

COPY package*.json ./
RUN npm install

# copy builders javascript to task root
COPY --from=builder /usr/app/dist ./
ENTRYPOINT [ "/lambda-entrypoint.sh" ]
CMD [ "index.handler" ]

Использование в обработчике тогда так же просто, как

import gm from 'gm';

Вот tsconfig.json в розыске.

{
  "compilerOptions": {
    "target": "es2020",
    "module": "commonjs",
    "rootDir": "./src",
    "outDir": "./dist",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "baseUrl": "./src",
    "paths": {
      "src/*": ["./*"]
    },
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

Если вы не используете машинописный текст, удалите конструктор полностью и просто COPY usr/app/src ./.

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