我将改用新的 Node AWS SDK (v3),以利用其模块化和 Typescript 支持。我需要做的第一件事是编写 Lambda 函数,但我找不到支持处理函数签名的类型。中的类型@aws/client-lambda似乎都与管理Lambda 的客户端相关。
Node SDK 是否有用于在某处编写Lambda 的官方类型?尤其:
context?event论证,是否有可能来自其他 AWS 服务及其相应类型的事件列表?interface Event {
// This could be anything -- a custom structure or something
// created by another AWS service, so it makes sense that
// there isn't a discoverable type for this. There should be
// corresponding types for each service that can send events
// to Lambda functions though. Where …Run Code Online (Sandbox Code Playgroud) 使用AWS Node SDK的代码似乎无法获得ECS任务的角色权限.
如果我在EC2 ECS实例上运行代码,代码似乎继承了实例上的角色,而不是任务.
如果我在Fargate上运行代码,则代码不会获得任何权限.
相比之下,在实例中运行的任何bash脚本似乎都具有适当的权限.
实际上,文档没有提到这是节点sdk的一个选项,只是:
有没有办法让您的节点代码获得ECS任务的权限?
这似乎是将权限传递给代码的合理方式.它与在实例上运行的代码完美配合.
我能想到的唯一解决方法是为每个ECS服务创建一个IAM用户,并将API Key/Secret作为环境变量传递给任务定义.但是,这似乎不太安全,因为对于有权访问任务定义的任何人来说,它都可以以纯文本形式显示.
我正在使用 typescript 和 aws-sdk 编写一个节点应用程序来调用 Athena。有时,对 Athena 的调用会在等待 Athena 响应一分钟后超时。我不明白的是,如果我转到 AWS 控制台并查看 Athena History 选项卡,它说我的查询需要 4 秒才能成功,但在我的代码中,它运行了超过一分钟等待响应。我希望我的代码中有什么地方做错了。
myFunct... {
const athena = getAthena();
const startQueryExecutionResponse: StartQueryExecutionOutput = await athena.startQueryExecution(params).promise();
let status = "UNKNOWN";
do {
await sleep(1000);
status = await getQueryStatus(athena, startQueryExecutionResponse);
} while (status === "QUEUED" || status === "RUNNING");
return await athena.getQueryResults(startQueryExecutionResponse as GetQueryResultsInput).promise();
};
const sleep = (ms: number) => {
return new Promise(resolve => {
setTimeout(resolve, ms)
})
};
const getQueryStatus = async (athena: AWS.Athena, startQueryExecutionResponse: …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建使用 AWS Javascript SDK v3 的项目。这里我的tsconfig.json
{
"compilerOptions": {
"target":"ES2020",
"module": "commonjs",
"lib": ["es2020"],
"outDir": "dist",
"resolveJsonModule": true,
},
"exclude": [
"coverage",
"node_modules",
"dist",
"tests"
]
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的构建错误示例(为了简洁起见,我已经删除了一些输出):
node_modules/@aws-sdk/client-s3/types/models/models_1.d.ts:727:23 - error TS2304: Cannot find name 'ReadableStream'.
node_modules/@aws-sdk/client-s3/types/models/models_1.d.ts:727:40 - error TS2304: Cannot find name 'Blob'.
node_modules/@aws-sdk/util-dynamodb/types/models.d.ts:19:86 - error TS2304: Cannot find name 'File'.
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这会给我这样的问题,即使我已经安装了@types/node支持节点输入的模块
我刚刚开始在我的应用程序上使用 aws-sdk 将文件上传到 S3,我正在争论是否使用 aws-sdk v2 还是 v3。
V2 是整个包,考虑到我只需要 s3 服务,而不是无数其他选项,它非常臃肿。然而,文档非常神秘,我很难让等效的 getSignedUrl 函数在 v3 中工作。
在 v2 中,我有这个代码来签署 url,它工作正常。我在服务器上使用express
import aws from 'aws-sdk';
const signS3URL = (req,res,next) => {
const s3 = new aws.S3({region:'us-east-2'});
const {fileName,fileType} = req.query;
const s3Params = {
Bucket : process.env.S3_BUCKET,
Key : fileName,
ContentType:fileType,
Expires: 60,
};
s3.getSignedUrl('putObject',s3Params,(err,data)=>{
if(err){
next(err);
}
res.json(data);
});
}
Run Code Online (Sandbox Code Playgroud)
现在我一直在阅读文档和示例,试图让 v3 等效工作,但我找不到任何如何使用它的工作示例。到目前为止我的设置方式如下
import {S3Client,PutObjectCommand} from '@aws-sdk/client-s3';
import {getSignedUrl} from '@aws-sdk/s3-request-presigner';
export const signS3URL = async(req,res,next) => {
console.log('Sign')
const …Run Code Online (Sandbox Code Playgroud) 我正在尝试从 Kinesis Shard 订阅事件。但是执行SubscribeToShardCommand挂起 5 分钟(订阅超时)然后抛出错误:
(node:2667) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token in JSON at position 0
at JSON.parse (<anonymous>)
at /home/mjpolak/Documents/company/project/node_modules/@aws-sdk/client-kinesis/protocols/Aws_json1_1.ts:4020:19
at processTicksAndRejections (internal/process/task_queues.js:88:5)
at Object.deserializeAws_json1_1SubscribeToShardCommand (/home/mjpolak/Documents/company/project/node_modules/@aws-sdk/client-kinesis/protocols/Aws_json1_1.ts:2583:21)
at /home/mjpolak/Documents/company/project/node_modules/@aws-sdk/middleware-serde/src/deserializerMiddleware.ts:20:18
at /home/mjpolak/Documents/company/project/node_modules/@aws-sdk/middleware-signing/src/middleware.ts:26:22
at StandardRetryStrategy.retry (/home/mjpolak/Documents/company/project/node_modules/@aws-sdk/middleware-retry/src/defaultStrategy.ts:125:38)
at /home/mjpolak/Documents/company/project/node_modules/@aws-sdk/middleware-logger/src/loggerMiddleware.ts:21:20
at /home/mjpolak/Documents/company/project/kinesis-subscribe.ts:85:29
Run Code Online (Sandbox Code Playgroud)
我正在寻找可以让我成功订阅的帮助。
完整代码:
const { StreamDescription } = await client.send(
new DescribeStreamCommand({
StreamName: 'streamName',
}),
);
const { StreamARN } = StreamDescription;
const { Consumers } = await client.send(
new ListStreamConsumersCommand({
StreamARN,
}),
);
let Consumer = Consumers.find((x) => x.ConsumerName == …Run Code Online (Sandbox Code Playgroud) 目前我们使用的是aws-sdkv2,通过这种方式提取上传的文件URL
const res = await S3Client
.upload({
Body: body,
Bucket: bucket,
Key: key,
ContentType: contentType,
})
.promise();
return res.Location;
Run Code Online (Sandbox Code Playgroud)
现在我们要升级到aws-sdkv3,新的文件上传方式如下所示
const command = new PutObjectCommand({
Body: body,
Bucket: bucket,
Key: key,
ContentType: contentType,
});
const res = await S3Client.send(command);
Run Code Online (Sandbox Code Playgroud)
不幸的是,res对象现在不包含Location属性。
getSignedUrlSDK功能看起来不太合适,因为它只是生成一个带有到期日期的URL(可能可以将其设置为一些额外的巨大持续时间,但无论如何,我们仍然需要有可能分析URL路径)
对我来说,手动构建 URL 看起来不是一个好主意,也不是一个稳定的解决方案。
最近是否有人注意到 AWS JS SDK 的行为发生了变化?
因为我在 Github Actions 中有一个 CI 管道,其中使用以下 docClient 设置启动本地 DynamoDB 并将其写入 DyanmoDB:
const docClient = new AWS.DynamoDB.DocumentClient({
region: 'localhost',
endpoint: 'http://localhost:8000',
accessKeyId: 'DEFAULTACCESSKEY',
secretAccessKey: 'DEFAULTSECRETKEY',
convertEmptyValues: true,
});
Run Code Online (Sandbox Code Playgroud)
到目前为止,这也非常有效,只是从今天中午开始,这个错误就失败了。
我没有更改源代码中的任何内容,只是再次运行 CI 作业。
UnrecognizedClientException: The Access Key ID or security token is invalid.
281
at Request.extractError (node_modules/aws-sdk/lib/protocol/json.js:80:27)
282
at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:106:20)
283
at Request.emit (node_modules/aws-sdk/lib/sequential_executor.js:78:10)
284
at Request.emit (node_modules/aws-sdk/lib/request.js:686:14)
Run Code Online (Sandbox Code Playgroud)
我在今天发布的 aws-sdk 包 (2.1409.0) 中找不到任何可以表明这一点的内容。
amazon-dynamodb aws-sdk aws-sdk-nodejs aws-sdk-js github-actions
我正在使用 AWS 开发工具包v2.796.0
根据 putEvents 的文档,详细信息值必须是有效的 JSON 字符串。 https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEventsRequestEntry.html
但是,它不接受 JSON 数组作为字符串。
const eventBridge = new AWS.EventBridge();
const entries = {
Entries: [
{
EventBusName: "busName",
Source: "api.user",
DetailType: "detailType",
Detail: JSON.stringify({ test: { test: ["test", "test2"] } }),
},
],
};
const rs = await eventBridge.putEvents(entries).promise();
console.log(rs);
// this passes
// {
// FailedEntryCount: 0,
// Entries: [ { EventId: 'a6176012-7310-2b84-a9b5-819956e2e3f9' } ]
// }
const entries2 = {
Entries: [
{
EventBusName: "busName",
Source: "api.user",
DetailType: "detailType", …Run Code Online (Sandbox Code Playgroud) 我的代码在小型虚拟机(低内存和低磁盘)中运行,它通过 HTTP 流接收未知大小的流并将其上传到 AWS S3。它可能是几个 TB,我希望能够达到 S3 的 5TB 最大值,我在流上没有收到内容长度标头,而另一家公司制造了服务器(并且它是动态压缩的,他们不既没有内存也没有磁盘空间来存储它们运行的位置)。
我们的代码位于 Node.js 中,我正在努力克服限制。
使用分段上传时,每个部分必须为 500MB(最坏情况为 5TB 除以 10000),这不适合内存,当然也不适合队列。这些部分必须位于内存中才能计算其主体哈希标头并测量其长度。
我研究了aws-chunked编码,但它需要提前了解总事务长度才能填充x-amz-decoded-content-length标头,但允许任意小的分块,与多部分相反。
我现在看到的唯一路径是重新实现分段上传的非缓冲和非排队版本,它将通过带有未签名有效负载标头的 https 发送 500MB 部分,最后一个部分用零填充,然后提交文件并然后返回剪辑文件的填充端。这看起来非常复杂,我一定错过了一些东西。
我可以使用最新版本的 AWS SDK JS 3、版本 2 或任何库。
aws-sdk-js ×10
aws-sdk ×4
amazon-s3 ×3
typescript ×3
javascript ×2
node.js ×2
amazon-ecs ×1
amazon-iam ×1
aws-lambda ×1