因此,我需要在客户端的自定义管理屏幕中显示用户列表及其各个组。我正在 Lambda 函数中返回结果AWS.CognitoIdentityServiceProvider.listUsers,并且可以很好地列出用户,但我不确定为每个用户获取组并将其添加到响应中的最佳方法。
对我来说,他们没有提供类似 listUsers 的方法来包含该信息,就个人而言,这似乎有点令人惊讶,因为这似乎是一个常见的用例。以前有人解决过这个问题吗?我有一个可行的解决方案,但它看起来很老套,而且可能性能不高,所以我正在寻找更有效的解决方案。
看来我的选择是要么获取用户池中的每个组并调用AWS.CognitoIdentityServiceProvider.listUsersInGroup每个组,然后循环遍历所有用户listUsers并检查他们是否属于这些组中的任何一个,或者循环遍历响应中的每个用户listUsers并AWS.CognitoIdentityServiceProvider.adminListGroupsForUser调用他们每个人。这些是我唯一的选择吗?第一个选项似乎效率稍高,因为组数少于用户数,因此 API 调用也会减少,但看起来这仍然非常低效。
我用来@aws-sdk/client-kms加密数据。我得到了 base64 字符串作为响应。现在我得到了Uint8Array。
const encryptedBlob = await kms.encrypt({
KeyId: kmsKey,
Plaintext: Buffer.from(JSON.stringify('data to encrypt')),
});
Run Code Online (Sandbox Code Playgroud)
加密的明文。当您使用 HTTP API 或 AWS CLI 时,该值是 Base64 编码的。否则,它不是 Base64 编码的。AWS文档中提到
有没有办法在nodeJs中获取base64作为响应。
我在 typescript/nodejs 环境中使用适用于 javascript 的 AWS SDK v3,但是当我使用 ts-node 运行它时,它抱怨无法在 s3client 上找到发送函数。我的代码:
\nconst client = new S3Client({\n credentialDefaultProvider: this.getCredentialDefaultProvider\n region: "us-west-2",\n});\nconst command = new ListObjectsCommand({\n Bucket: bucket,\n Prefix: prefix,\n});\nconst result = await client.send(command);\nRun Code Online (Sandbox Code Playgroud)\n启动服务器时出现的错误是这样的:
\n/server/node_modules/ts-node/src/index.ts:230\n return new TSError(diagnosticText, diagnosticCodes)\n\nTSError: \xe2\xa8\xaf Unable to compile TypeScript:\nsrc/controllers/aws.controller.ts(56,37): error TS2339: Property \'send\' does not exist on type \'S3Client\'.\nRun Code Online (Sandbox Code Playgroud)\n这与官方文档中的代码示例基本相同。但我已经安装了正确的包(甚至清除了我的node_modules文件夹并重新安装了它)并且node_modules中的代码看起来是正确的。我究竟做错了什么?
\n对于上下文,这是一个在 docker-compose 容器中的 ts-node 中运行的 nodeJS 脚本。其他代码工作正常,包括使用相同客户端对象获取签名 URL 的命令。
\n我按照此说明在 Cognito 中实现自定义消息发送器https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-custom-sms-sender.html
所有这些都适用于类似的代码(我在 AWS Lambda 上使用 Typescript):
import {buildClient, CommitmentPolicy, KmsKeyringNode} from '@aws-crypto/client-node';
import b64 from 'base64-js';
const {decrypt} = buildClient(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT);
const keyring = new KmsKeyringNode({keyIds: ["my-key-arn"]});
...
const {plaintext} = await decrypt(keyring, b64.toByteArray(event.request.code));
console.log(plainttext.toString()) // prints plain text exactly as I need
Run Code Online (Sandbox Code Playgroud)
然而,这个库@aws-crypto/client-node让我的包变得非常巨大,几乎有 20MB!可能是因为它依赖于一些较旧的 AWS 库......
我曾经使用模块化库,这样的库@aws-sdk/xxx确实提供了更小的包。
我发现对于加密/解密我可以使用@aws-sdk/client-kms. 但这不起作用!
我正在尝试以下代码:
import {KMSClient, DecryptCommand} from "@aws-sdk/client-kms";
import b64 from 'base64-js';
const client = new KMSClient;
await client.send(new DecryptCommand({CiphertextBlob: b64.toByteArray(event.request.code), KeyId: 'my-key-arn'}))
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误: …
我有一个在 AWS Lambda 中调用的文件,bedrock.mjs其中包含以下代码:
import {
BedrockRuntimeClient,
InvokeModelCommand,
} from "@aws-sdk/client-bedrock-runtime"
export const callBedrock = async (prompt, max_tokens, temperature) => {
const client = new BedrockRuntimeClient()
const input = {
modelId: "cohere.command-text-v14",
contentType: "application/json",
accept: "application/json",
body: JSON.stringify({
prompt,
max_tokens,
temperature
})
}
const command = new InvokeModelCommand(input)
const response = await client.send(command)
return response
}
Run Code Online (Sandbox Code Playgroud)
当我打电话时callBedrock("Respond with a nice greeting", 100, 0.2),body回复是:
{\"0\":123,\"1\":34,\"2\":103,\"3\":101,\"4\":110,\"5\":101,\"6\":114,\"7\":97,\"8\":116,\"9\":105,\"10\":111,\"11\":110,\"12\":115,\"13\":34,\"14\":58,\"15\":91,\"16\":123,\"17\":34,\"18\":105,\"19\":100,\"20\":34,\"21\":58,\"22\":34,\"23\":98,\"24\":98,\"25\":101,\"26\":54,\"27\":56,\"28\":49,\"29\":54,\"30\":101,\"31\":45,\"32\":48,\"33\":99,\"34\":49,\"35\":50,\"36\":45,\"37\":52,\"38\":50,\"39\":53,\"40\":99,\"41\":45,\"42\":56,\"43\":56,\"44\":101,\"45\":52,\"46\":45,\"47\":98,\"48\":102,\"49\":49,\"50\":51,\"51\":49,\"52\":101,\"53\":98,\"54\":56,\"55\":49,\"56\":49,\"57\":100,\"58\":50,\"59\":34,\"60\":44,\"61\":34,\"62\":116,\"63\":101,\"64\":120,\"65\":116,\"66\":34,\"67\":58,\"68\":34,\"69\":32,\"70\":72,\"71\":101,\"72\":108,\"73\":108,\"74\":111,\"75\":33,\"76\":32,\"77\":72,\"78\":111,\"79\":119,\"80\":32,\"81\":99,\"82\":97,\"83\":110,\"84\":32,\"85\":73,\"86\":32,\"87\":104,\"88\":101,\"89\":108,\"90\":112,\"91\":32,\"92\":121,\"93\":111,\"94\":117,\"95\":32,\"96\":116,\"97\":111,\"98\":100,\"99\":97,\"100\":121,\"101\":63,\"102\":34,\"103\":125,\"104\":93,\"105\":44,\"106\":34,\"107\":105,\"108\":100,\"109\":34,\"110\":58,\"111\":34,\"112\":99,\"113\":97,\"114\":100,\"115\":99,\"116\":57,\"117\":50,\"118\":102,\"119\":51,\"120\":45,\"121\":53,\"122\":50,\"123\":102,\"124\":97,\"125\":45,\"126\":52,\"127\":56,\"128\":101,\"129\":56,\"130\":45,\"131\":98,\"132\":100,\"133\":57,\"134\":54,\"135\":45,\"136\":48,\"137\":57,\"138\":57,\"139\":57,\"140\":102,\"141\":98,\"142\":55,\"143\":56,\"144\":53,\"145\":97,\"146\":101,\"147\":101,\"148\":34,\"149\":44,\"150\":34,\"151\":112,\"152\":114,\"153\":111,\"154\":109,\"155\":112,\"156\":116,\"157\":34,\"158\":58,\"159\":34,\"160\":82,\"161\":101,\"162\":115,\"163\":112,\"164\":111,\"165\":110,\"166\":100,\"167\":32,\"168\":119,\"169\":105,\"170\":116,\"171\":104,\"172\":32,\"173\":97,\"174\":32,\"175\":110,\"176\":105,\"177\":99,\"178\":101,\"179\":32,\"180\":103,\"181\":114,\"182\":101,\"183\":101,\"184\":116,\"185\":105,\"186\":110,\"187\":103,\"188\":34,\"189\":125}
Run Code Online (Sandbox Code Playgroud)
这应该如何解释或使用?
我收集了可能属于或不属于特定存储桶的URL。这些不是公开的。
我正在使用nodejs aws-sdk来获取它们。
但是,该getObject函数需要参数Bucket和参数Key,这些参数已经存在于我的URL中。
有什么办法可以使用URL?
我尝试通过使用拆分URL来提取密钥,/并通过拆分来获取存储桶.。但是问题是存储桶名称也可以有.,我不确定键名称是否也可以有/。
我正在编写一个简单的js函数,该函数从AWS CloudWatch Logs中读取一些信息。
遵循Node.js AWS开发工具包中的配置区域中的答案以及AWS nodejs SDK文档中的内容,我提出了以下内容:
var AWS = require('aws-sdk');
var cloudwatchlogs = new AWS.CloudWatchLogs();
console.log(AWS.config.region) // Undefined
AWS.config.region = 'eu-central-1' // Define the region with dot notation
console.log(AWS.config.region) . // eu-central-1
AWS.config.update({region:'eu-central-1'}); // Another way to update
console.log(AWS.config.region) . // eu-central-1
var params = {
limit: 0,
// logGroupNamePrefix: 'STRING_VALUE',
// nextToken: 'STRING_VALUE'
};
// This call is failing
cloudwatchlogs.describeLogGroups(params, function(err, data) {
if (err) console.log(err, err.stack); // an error …Run Code Online (Sandbox Code Playgroud) 当我将应用程序部署到 AWS 时,我在使用 aws-sdk 时遇到了严重的性能问题。我正在使用它,如下所示:
wrapper = {
accessKeyId: "YOURACCESSKEY",
secretAccessKey: "YOURSECRETKEY",
region: "us-east-1",
endpoint: new AWS.Endpoint('http://localhost:8000')
};
AWS.config.update(wrapper);
const docClient = new AWS.DynamoDB.DocumentClient();
module.exports ={"docClient":docClient};
Run Code Online (Sandbox Code Playgroud)
我研究并发现 - https://github.com/aws/aws-sdk-js/issues/900 - 我们可以在 aws 中指定 httpOptions 以便启用 keepAlive。
我的问题是,如何在上面的 AWS-sdk 构造函数中指定 httpOptions:
var dynamo = new AWS.DynamoDB({
region: "ap-southeast-2",
httpOptions: {
agent: new https.Agent({
rejectUnauthorized: true,
keepAlive: true
})
}
Run Code Online (Sandbox Code Playgroud)
});
如何将其添加到包装器配置中。它不接受 AWS.config.update 中的任何额外的 httpOptions 键
我试图在用户请求重置密码时发送短信.我想等待发送消息以提醒用户是否成功.我目前正在尝试如下操作:
async function sendResetPasswordTextMessage(req, res) {
let result = {};
let phoneNumber = req.body.phoneNumber;
if (phoneNumber === undefined) {
return sendInvalidParametersMessage(res);
}
phoneNumber = phoneNumber.toString();
const userProfile = await models.UserProfile.findOne({
where: {
phoneNumber: phoneNumber
}
});
************************** RELEVANT CODE TO ISSUE *************************
if (userProfile) {
const message = "Your username is:\n" + userProfile.username;
const sent = await AWSSNSClient.sendMessage(message, phoneNumber);
if (!sent) {
result.error = setTitleAndMessage("Error", "An error occurred");
} else {
result.success = setTitleAndMessage("Success", "Message sent");
}
}
return res.send(result); …Run Code Online (Sandbox Code Playgroud) 我正在使用AWS SDK for Javascript(Node.js)从DynamoDB表中读取数据.自动缩放功能在大多数时间内都能很好地工作,并且消耗的读取容量单位(RCU)在一天中的大部分时间都非常低.但是,有一个编程的作业在午夜左右执行,耗费约为配置RCU的10倍,并且由于自动缩放需要一些时间来调整容量,因此存在大量限制读取请求.此外,我怀疑我的请求没有完成(虽然我在错误日志中找不到任何异常).
为了处理这种情况,我考虑使用AWS API(updateTable)增加配置的RCU,但计算我的应用程序所需的RCU数量可能并不简单.
所以我的第二个猜测是重试失败的请求,只是等待自动扩展配置的RCU.正如AWS文档和一些Stack Overflow答案所指出的那样(特别是关于ProvisionedThroughputExceededException):
适用于Amazon DynamoDB的AWS开发工具包会自动重试接收此异常的请求.因此,您的请求最终会成功,除非请求太大或您的重试队列太大而无法完成.
我已经阅读了类似的问题(这一个,这一个和这一个),但我仍然感到困惑:如果请求太大或重试队列太大而无法完成(因此在自动重试之后)或实际上在重试之前?
最重要的是:我应该在我的背景下期待的例外吗?(所以我可以抓住它并重试直到自动缩放增加RCU?)
aws-sdk-js ×10
node.js ×6
javascript ×3
amazon-kms ×2
aws-sdk ×2
amazon-s3 ×1
amazon-sns ×1
async-await ×1
aws-lambda ×1
aws-regions ×1