Установите пакет Linux в образ Node.js для AWS Lambda

Я пытаюсь создать образ контейнера для функции Node.js Lambda. Мое базовое изображение такое:

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

COPY index.js ${LAMBDA_TASK_ROOT}

CMD [ "index.handler" ]

Однако моя функция Node.js также использует пакет pdf2htmlEX. Один из способов установить его — с помощью apt-get. Запуск apt-get в приведенном выше файле докеров вернет ошибку «команда не найдена». Это понятно, потому что apt-get недоступен в образе Node.js от AWS.

Возможно, это не тот способ сделать это. В конечном итоге, как мне получить функцию Lambda Node.js для выполнения пакета Linux (в данном случае pdf2htmlEX)?


Обновление 1. После тестирования различных вариантов и комбинаций я создал альтернативный базовый образ для установки pdf2htmlEX, node.js и npm:

ARG FUNCTION_DIR = "/function"
FROM ubuntu:18.04
ARG FUNCTION_DIR
ENV NODE_VERSION=16.13.0
RUN apt-get update
COPY ./pdf2htmlEX.deb /tmp
# Install pdf2htmlEX and node.js and related packages
RUN apt-get install -y /tmp/pdf2htmlEX.deb curl cmake autoconf libtool
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
ENV NVM_DIR=/root/.nvm
RUN . "$NVM_DIR/nvm.sh" && nvm install ${NODE_VERSION}
RUN . "$NVM_DIR/nvm.sh" && nvm use v${NODE_VERSION}
RUN . "$NVM_DIR/nvm.sh" && nvm alias default v${NODE_VERSION}
ENV PATH = "/root/.nvm/versions/node/v${NODE_VERSION}/bin/:${PATH}"
RUN mkdir -p ${FUNCTION_DIR}
COPY index.js package.json ${FUNCTION_DIR}
WORKDIR ${FUNCTION_DIR}
RUN npm install aws-lambda-ric
CMD [ "index.handler" ]

Сборка не удалась при установке aws-lambda-ric, клиента интерфейса среды выполнения, необходимого при использовании альтернативного базового образа. Журнал ошибок слишком длинный, чтобы публиковать его здесь, поэтому, возможно, это не та конфигурация.


Обновление 2: Еще одна попытка использования node-20:buster:

ARG FUNCTION_DIR = "/function"

FROM node:20-buster as build-image

# Include global arg in this stage of the build
ARG FUNCTION_DIR

COPY ./pdf2htmlEX.deb /tmp
# Install build dependencies
RUN apt-get update && \
apt-get install -y \
/tmp/pdf2htmlEX.deb

Получил другой тип ошибки:

The following packages have unmet dependencies:
pdf2htmlex : Depends: libjpeg-turbo8 but it is not installable
Unable to correct problems, you have held broken packages.

Ваша проблема не в докере или лямбде. Это с pdf2htmlex. Я даже не могу установить его на новую ОС Ubuntu. Для преобразования HTML в PDF существует множество хорошо поддерживаемых инструментов.

JRichardsz 02.06.2024 16:09

@JRichardsz Однако этот инструмент предназначен для преобразования PDF в HTML. Это обеспечивает более точный контроль над онлайн-публикацией, в отличие от преобразования HTML в PDF. Это лучший инструмент с открытым исходным кодом для этой цели, который я могу найти. Есть еще рекомендации?

bytrangle 04.06.2024 18:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
299
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Образ Docker (public.ecr.aws/lambda/nodejs:20), который вы использовали, создан для Amazon Linux 2023 (AL2). Для установки любого пакета вы можете yum Однако dnf инструментом управления пакетами программного обеспечения по умолчанию в AL2023 является DNF. DNF является преемником YUM, инструмента управления пакетами в AL2.

DNF по своему использованию похож на YUM. Многие команды и параметры DNF такие же, как команды YUM. В команде интерфейса командной строки (CLI) в большинстве случаев dnf заменяет yum.

Например, для следующих команд AL2 yum:

$ sudo dnf install packagename

Добавление Run sudo dnf install <<package_name>> приводит к sudo: команда не найдена». Однако удаление sudo приводит к выводу «Ни один пакет не соответствует <<имя_пакета>>». Работает ли dnf вообще с образом node.js 20?

bytrangle 27.05.2024 17:13

Там нет sudo. Просто используйте без sudo.

Victor 29.05.2024 16:47
Ответ принят как подходящий

Краткое содержание

  • общедоступные изображения от AWS для лямбды с nodejs основаны на Centos или Fedora:
    • ИЗ public.ecr.aws/lambda/nodejs:20
    • ОТ Amazon/aws-lambda-nodejs:18
  • инструмент pdf2htmlEX не поддерживает Centos и Fedora
  • Если вы создадите свой собственный образ Docker из Ubuntu, не следуя спецификациям aws, вы получите ошибки или непредвиденное поведение, если вы развернете его на реальной учетной записи aws.
  • Спецификации, которые я обнаружил: требуется только чтение os, ожидается /tmp и aws-lambda-ric.
  • Чтобы обеспечить совместимость вашего локального хоста с реальными серверами AWS, необходимо использовать aws-lambda-runtime-interface-emulator

Попытки

  • Я попытался преобразовать .deb в .rpm (с помощью инструмента Alien), а затем установить его в образ Centos. После исправления почти всех ошибок, последняя ошибка оказалась фатальной: Некоторая библиотека для jpg.

Шаги

  • Создайте базовый образ, совместимый с реальными серверами AWS и локальным тестированием.
  • В конце установите инструмент pdf2htmlEX с предварительными условиями.

Папка и файлы

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

Папка должна выглядеть так

Докерфайл

# Get a base image
FROM public.ecr.aws/ubuntu/ubuntu:22.04

# Set some defaults
ARG LAMBDA_TASK_ROOT = "/app"
ARG LAMBDA_RUNTIME_DIR = "/usr/local/bin"
ARG PLATFORM = "linux/amd64"

RUN groupadd --gid 1000 node; \
    useradd --uid 1000 --gid node --shell /bin/bash --create-home node

# node
ENV NVM_DIR /usr/local/nvm
ENV NODE_VERSION v20.13.0
RUN mkdir -p /usr/local/nvm && apt-get update && echo "y" | apt-get install curl
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
RUN /bin/bash -c "source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION && nvm use --delete-prefix $NODE_VERSION"
ENV NODE_PATH $NVM_DIR/versions/node/$NODE_VERSION/bin
ENV PATH $NODE_PATH:$PATH

WORKDIR /app

## Install aws-lambda-ric
RUN apt-get update; \
    apt-get install -y \
        g++ \
        make \
        cmake \
        unzip \
        libcurl4-openssl-dev \
        autoconf \
        automake \
        build-essential \
        libtool \
        m4 \
        python3 \
        unzip \
        libssl-dev; \       
    rm -rf /var/lib/apt/lists/*;
RUN npm install aws-lambda-ric -g

# Copy function code
COPY ./app/ ${LAMBDA_TASK_ROOT}/
RUN npm install 


# Prevent this warn
# npm WARN logfile Error: ENOENT: no such file or directory, scandir '/home/sbx_user1051/.npm/_logs'
# https://stackoverflow.com/a/73394694/3957754
RUN mkdir -p /tmp/.npm/_logs
ENV npm_config_cache /tmp/.npm

# (Optional) Add Lambda Runtime Interface Emulator and use a script in the ENTRYPOINT for simpler local runs
WORKDIR ${LAMBDA_TASK_ROOT}
ADD "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie" "/usr/bin/aws-lambda-rie"
COPY entry.sh /
RUN chmod 755 "/usr/bin/aws-lambda-rie" "/entry.sh"

## Install pdf2htmlEX

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update; \
    apt-get -y install tzdata libjpeg-turbo8 wget gpg curl xz-utils jq libglib2.0-dev libcairo2-dev

RUN curl -s https://api.github.com/repos/pdf2htmlEX/pdf2htmlEX/releases/latest  | jq -r '.assets[] | select(.name= = "pdf2htmlEX-0.18.8.rc1-master-20200630-Ubuntu-bionic-x86_64.deb").browser_download_url'  | wget -qi - -O /tmp/pdf2htmlEX.deb

RUN dpkg -i /tmp/pdf2htmlEX.deb
RUN pdf2htmlEX -v


ENTRYPOINT [ "/entry.sh" ]
CMD [ "app.handler" ]

запись.sh

#!/bin/sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
  exec /usr/bin/aws-lambda-rie npx aws-lambda-ric $1
else
  exec npx aws-lambda-ric $1
fi

приложение.js

const exec = require('util').promisify(require('child_process').exec);

exports.handler = async (event, context) => {

    let out = await exec(`pdf2htmlEX -v`).catch(e => e);

    console.info("pdf2htmlEX command", JSON.stringify(out));

    return {
        statusCode: 200,
        body: {
            code: 200,
            message: "Hell!!"
        }
    }; 
}

pdf2htmlEX

В качестве доказательства установки pdf2htmlEX я распечатал pdf2htmlEX -v

в локальном хосте

внутри контейнера

настоящий аккаунт AWS

докерхаб

Я публикую изображение, чтобы оно было готово к использованию.

https://hub.docker.com/repository/docker/jrichardsz/aws-lambda-nodejs/general

Большое спасибо, что нашли время для создания изображения.

bytrangle 25.06.2024 12:30

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