Мне требуется 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);
});
}
);
};
В итоге я решил это с помощью функции 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 ./
.
Как выглядит ваш обработчик?