我的目标是创建一个较大的压缩文本文件并将其放入S3。
文件内容由我从另一个源中循环读取的块组成。
由于该文件的大小,我无法在内存中保存所有数据,因此我需要以某种方式直接将其同时流式传输到S3和ZIP。
我了解如何使用fsNode.JS中的常规代码执行此技巧,但是我对于使用AWS Lambda的S3是否可以执行相同的技巧感到困惑?我知道s3.putObject 可以消耗 streamObject,但是在我看来,执行putObject操作时该流应该已经完成,这可能导致超出允许的内存。
amazon-s3 amazon-web-services node.js aws-lambda aws-sdk-nodejs
背景
我正在 S3 存储桶中存储一些文件(对象)。每当从 S3 存储桶中删除任何文件时,我的 Lambda 函数就会被触发。lambda 函数需要从 DynamoDB 中减去对象大小。
问题: S3 deleteObject 事件不发送对象大小
S3 删除对象事件示例
{
"Records": [
{
"eventVersion": "2.0",
"eventTime": "1970-01-01T00:00:00.000Z",
"requestParameters": {
"sourceIPAddress": "127.0.0.1"
},
"s3": {
"configurationId": "testConfigRule",
"object": {
"sequencer": "0A1B2C3D4E5F678901",
"key": "HappyFace.jpg"
},
"bucket": {
"arn": "arn:aws:s3:::mybucket",
"name": "sourcebucket",
"ownerIdentity": {
"principalId": "EXAMPLE"
}
},
"s3SchemaVersion": "1.0"
},
"responseElements": {
"x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
"x-amz-request-id": "EXAMPLE123456789"
},
"awsRegion": "us-east-1",
"eventName": "ObjectRemoved:Delete",
"userIdentity": {
"principalId": "EXAMPLE"
},
"eventSource": "aws:s3"
}
]
}
Run Code Online (Sandbox Code Playgroud)
请帮助我找到适合我的用例的解决方案。
我正在尝试将数据从节点 JS 代码推送到 Dynamodb。
我遇到了这样的问题
DynamoDB.DocumentClient 应支持空字符串属性
有谁知道如何在 DynamoDB 中禁用验证?
我的Dynamo Db中有450万条记录。
我想批量读取每个记录的ID。
我期望像偏移和限制之类的东西,例如我们如何在Mongo Db中阅读。
有没有在Node-JS中没有扫描方法的建议。
我已经进行了足够的研究,我只能找到一种扫描方法,该方法可以缓冲Dynamo Db的完整记录,并且它开始扫描记录,这在性能方面无效。
请给我建议。
我一直在尝试为在 ECS 中运行的 web 应用程序设置简单的 S3 图像上传功能。ECS 集群是由系统管理员设置的,我不再获得帮助,但每个上传请求都会返回此错误:
{ AccessDenied: Access Denied
at Request.extractError (/www/node_modules/aws-sdk/lib/services/s3.js:585:35)
at Request.callListeners (/www/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
at Request.emit (/www/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
at Request.emit (/www/node_modules/aws-sdk/lib/request.js:683:14)
at Request.transition (/www/node_modules/aws-sdk/lib/request.js:22:10)
at AcceptorStateMachine.runTo (/www/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /www/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request.<anonymous> (/www/node_modules/aws-sdk/lib/request.js:38:9)
at Request.<anonymous> (/www/node_modules/aws-sdk/lib/request.js:685:12)
at Request.callListeners (/www/node_modules/aws-sdk/lib/sequential_executor.js:116:18)
at Request.emit (/www/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
at Request.emit (/www/node_modules/aws-sdk/lib/request.js:683:14)
at Request.transition (/www/node_modules/aws-sdk/lib/request.js:22:10)
at AcceptorStateMachine.runTo (/www/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /www/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request.<anonymous> (/www/node_modules/aws-sdk/lib/request.js:38:9)
at Request.<anonymous> (/www/node_modules/aws-sdk/lib/request.js:685:12)
at Request.callListeners (/www/node_modules/aws-sdk/lib/sequential_executor.js:116:18)
at callNextListener (/www/node_modules/aws-sdk/lib/sequential_executor.js:96:12)
at IncomingMessage.onEnd (/www/node_modules/aws-sdk/lib/event_listeners.js:299:13)
at ZoneDelegate.invokeTask (/www/node_modules/zone.js/dist/zone-node.js:423:31)
at Zone.runTask (/www/node_modules/zone.js/dist/zone-node.js:195:47)
message: 'Access Denied',
code: …Run Code Online (Sandbox Code Playgroud) amazon-s3 amazon-web-services amazon-ecs amazon-vpc aws-sdk-nodejs
我在没有 nat 网关/互联网访问的 vpc 中部署了功能。目标:从此函数通过 SES 发送电子邮件(在 vpc 中)
我尝试过使用公共私有子网和 nat 网关来发送电子邮件,效果很好。但我正在尝试通过 VPC 端点使用它。我已经创建了一个电子邮件 vpc 端点,但不确定如何在 serverless.yml 中配置它。已尝试按照https://www.serverless.com/framework/docs/providers/aws/guide/serverless.yml/中所述设置配置
但没有任何作用,因为没有提到 ses。
我正在尝试使用从 aws sdk 生成的预签名 url 将图像上传到 s3。
router.get('/upload-url', async(req, res) => {
try {
AWS.config.update({
secretAccessKey: process.env.AWS_SECRET_ACCESS,
accessKeyId: process.env.AWS_ACCESS_KEY,
region: 'ap-southeast-1'
});
const s3 = new AWS.S3();
var params = { Bucket: process.env.bucket_name, Key: 'products', ContentType: 'image/jpeg' };
s3.getSignedUrl('putObject', params, function(err, url) {
if (err) {
throw (err)
}
res.status(200).send({ link: url })
})
} catch (err) {
res.status(400).send({ message: err.message })
}
})
Run Code Online (Sandbox Code Playgroud)
使用上面的返回 url,当我尝试访问它时会出错
<Error>
<script class="__REQUESTLY__SCRIPT">(function(namespace) { window[namespace] = window[namespace] || {}; window[namespace].responseRules = {}; let open …Run Code Online (Sandbox Code Playgroud) javascript amazon-s3 amazon-web-services node.js aws-sdk-nodejs
我使用 Typescript 代码将文件上传到 S3,如下所示:
import {PutObjectCommand, PutObjectCommandInput, S3Client} from "@aws-sdk/client-s3";
const s3 = new S3Client(config);
const uploadParams: PutObjectCommandInput = {
Bucket: bucketName,
Key: filename,
Body: fileData
};
await s3.send(new PutObjectCommand(uploadParams));
Run Code Online (Sandbox Code Playgroud)
但是,我需要在上传后将对象公开,以便将其作为静态网站的一部分进行访问,并将其作为私有上传。我如何告诉 s3 客户端也将其公开?
我正在尝试减小使用 aws-sdk 的 nodejs lambda 包的大小。这是原始的 lambda package.json 文件:
{
"name": "lambdanodejs",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"aws-sdk": "^2.784.0",
"bluebird": "^3.7.2",
"ioredis": "^4.19.2",
"redis": "^3.0.2",
"redis-clustr": "^1.7.0"
}
}
Run Code Online (Sandbox Code Playgroud)
整体大小为57MB,其中54属于aws-sdk。
为了减小大小,我尝试使用特定的客户端服务(v3 sdk)。关注: https: //github.com/aws/aws-sdk-js-v3/blob/main/clients/client-secrets-manager/package.json
{
"name": "lambdanodejs",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": { …Run Code Online (Sandbox Code Playgroud) 我的 Amazon S3 存储桶工作正常,直到我决定将我的 aws sdk 从版本 v2 更新到模块化 v3。
我可以使用 sdk 以编程方式上传文件,但无法使用它生成的预签名 URL 上传文件。
const { getSignedUrl } = require('@aws-sdk/s3-request-presigner');
const { S3Client, , PutObjectCommand } = require('@aws-sdk/client-s3');
const s3Client = S3Client({ region: 'us-east-2'});
const params = {
Bucket: '<bucket>',
Key: '1234567890.jpg',
ACL: 'private',
ContentType: 'image/jpg',
// Body: '<base64 encoded image content>'
};
const command = new PutObjectCommand(params);
// await s3Client.send(command); // works fine
const signedUrl = await getSignedUrl(s3Client, command); // generated signed url fails to upload image
Run Code Online (Sandbox Code Playgroud)
当我尝试使用生成的预签名 …
aws-sdk-nodejs ×10
amazon-s3 ×6
node.js ×5
aws-sdk ×3
aws-lambda ×2
javascript ×2
amazon-ecs ×1
amazon-ses ×1
amazon-vpc ×1
aws-sdk-js ×1
serverless ×1
typescript ×1