#node.js #amazon-web-services #amazon-s3 #aws-lambda #pre-signed-url
#node.js #amazon-веб-сервисы #amazon-s3 #aws-lambda #предварительно подписанный url
Вопрос:
Я использую прокси-сервер, используя aws-lambda-fastify
пакет, чтобы заставить мой REST API на основе Fastify работать под AWS Lambda.
Одной из проблем, которую мне пришлось решить для запуска под Lambda, было время ожидания HTTP-запросов. Оказалось, что это было вызвано тем, что цикл событий не был пустым. Мне пришлось установить специальный флаг для лямбды context
, и теперь запросы возвращаются нормально, все, кроме одного — маршрут для генерации предварительно подписанных URL-адресов для загрузки S3.
const S3 = require('aws-sdk/clients/s3');
module.exports = createPresignedPost = ({ key, contentType }) => {
const s3 = new S3();
s3.config.accessKeyId = process.env.AWS_SECRET_ACCESS_KEY;
s3.config.secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY;
s3.config.region = process.env.AWS_REGION;
const params = {
Expires: 60,
Bucket: process.env.AWS_BUCKET_NAME,
Conditions: [['content-length-range', 100, 10000000]], // 100Byte - 10MB
Fields: {
'Content-Type': contentType,
'Cache-Control': 'max-age=31536000',
key
}
};
return new Promise(async (resolve, reject) => {
s3.createPresignedPost(params, (err, data) => {
if (err) {
reject(err);
return;
}
resolve(data);
});
});
};
Эта функция вызывает тайм-аут при вызове из / под Lambda, в то время как локально она отлично работает под Docker и / или виртуальными / физическими хостами.
Есть предложения?
Комментарии:
1. Связана ли функция lambda с VPC?
2. @Marcin в чем разница? очевидно, что на хосте
s3.createPresignedPost()
возвращается, а под Lambda — нет.3. У Lambda в VPC по умолчанию нет подключения к Интернету. Таким образом, у вас будет тайм-аут, если вы хотите получить доступ к S3, если вы не настроили свой VPC и lambda правильно.
4. Это общедоступный RDS или вы создали частный RDS в частной подсети и подключили lambda к этой подсети для взаимодействия с RDS?
5. Я подключаюсь, используя общедоступное полное доменное имя
Ответ №1:
Это работает:
const AWS = require('aws-sdk');
AWS.config.update({
region: process.env.AWS_DEFAULT_REGION,
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
}
});
module.exports = createPresignedPost = ({ key, contentType }) => {
const s3 = new AWS.S3();
const params = {
Expires: 60,
Bucket: process.env.AWS_BUCKET_NAME,
Conditions: [['content-length-range', 100, 10000000]], // 100Byte - 10MB
Fields: {
'Content-Type': contentType,
'Cache-Control': 'max-age=31536000',
'Access-Control-Allow-Origin': '*',
key
}
};
return new Promise(async (resolve, reject) => {
s3.createPresignedPost(params, (err, data) => {
if (err) {
reject(err);
}
resolve(data);
});
});
};