标签: aws-sdk-js

节点 AWS SDK v3:Lambda 函数中“事件”和“上下文”参数的类型?

我将改用新的 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)

node.js typescript aws-lambda aws-sdk-js aws-sdk-js-v3

10
推荐指数
1
解决办法
6653
查看次数

如何在节点AWS SDK代码中使用AWS ECS任务角色

使用AWS Node SDK的代码似乎无法获得ECS任务的角色权限.

如果我在EC2 ECS实例上运行代码,代码似乎继承了实例上的角色,而不是任务.

如果我在Fargate上运行代码,则代码不会获得任何权限.

相比之下,在实例中运行的任何bash脚本似乎都具有适当的权限.

实际上,文档没有提到这是节点sdk的一个选项,只是:

  1. 从Amazon EC2的IAM角色加载(如果在EC2上运行),
  2. 从共享凭证文件(〜/ .aws/credentials)加载,
  3. 从环境变量加载,
  4. 从磁盘上的JSON文件加载,
  5. 在您的应用程序中硬编码

有没有办法让您的节点代码获得ECS任务的权限?

这似乎是将权限传递给代码的合理方式.它与在实例上运行的代码完美配合.

我能想到的唯一解决方法是为每个ECS服务创建一个IAM用户,并将API Key/Secret作为环境变量传递给任务定义.但是,这似乎不太安全,因为对于有权访问任务定义的任何人来说,它都可以以纯文本形式显示.

amazon-web-services amazon-ecs amazon-iam aws-sdk-js

9
推荐指数
1
解决办法
1163
查看次数

athena.getQueryExecution 会返回 RUNNING 状态 1 分钟以上,即使历史记录说该作业花了 4 秒

我正在使用 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)

javascript typescript aws-sdk amazon-athena aws-sdk-js

9
推荐指数
1
解决办法
1618
查看次数

AWS Javascript SDK v3 - 由于错误 TS2304,Typescript 无法编译:找不到名称“ReadableStream”

我正在尝试构建使用 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支持节点输入的模块

amazon-web-services typescript aws-sdk-js

9
推荐指数
2
解决办法
1391
查看次数

AWS Javascript SDK v3 中的 S3 getSignedUrl v2 等效项

我刚刚开始在我的应用程序上使用 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)

amazon-s3 amazon-web-services node.js aws-sdk-js

9
推荐指数
1
解决办法
2万
查看次数

SubscribeToShard 命令的异常

我正在尝试从 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)

javascript amazon-kinesis aws-sdk-js aws-sdk-js-v3

9
推荐指数
1
解决办法
114
查看次数

使用 Javascript 'aws-sdk' v3 获取上传的对象 URL

目前我们使用的是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 看起来不是一个好主意,也不是一个稳定的解决方案。

amazon-s3 aws-sdk aws-sdk-nodejs aws-sdk-js

9
推荐指数
1
解决办法
4347
查看次数

AWS JS SDK 突然抛出“访问密钥 ID 或安全令牌无效”。

最近是否有人注意到 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

9
推荐指数
2
解决办法
4209
查看次数

AWS EventBridge putEvents 不接受详细信息 JSON 数组

我正在使用 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)

amazon-web-services aws-sdk aws-sdk-js aws-event-bridge

8
推荐指数
1
解决办法
5847
查看次数

如何将未知大小的流上传到AWS S3?

我的代码在小型虚拟机(低内存和低磁盘)中运行,它通过 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 或任何库。

amazon-s3 aws-sdk-js

8
推荐指数
0
解决办法
935
查看次数