我正在使用NodeJS AWS SDK生成预先签名的S3 URL.文档提供了生成预签名URL的示例.
这是我的确切代码(省略了敏感信息):
const AWS = require('aws-sdk')
const s3 = new AWS.S3()
AWS.config.update({accessKeyId: 'id-omitted', secretAccessKey: 'key-omitted'})
// Tried with and without this. Since s3 is not region-specific, I don't
// think it should be necessary.
// AWS.config.update({region: 'us-west-2'})
const myBucket = 'bucket-name'
const myKey = 'file-name.pdf'
const signedUrlExpireSeconds = 60 * 5
const url = s3.getSignedUrl('getObject', {
Bucket: myBucket,
Key: myKey,
Expires: signedUrlExpireSeconds
})
console.log(url)
Run Code Online (Sandbox Code Playgroud)
生成的URL如下所示:
https://bucket-name.s3-us-west-2.amazonaws.com/file-name.pdf?AWSAccessKeyId=[access-key-omitted]&Expires=1470666057&Signature=[signature-omitted]
Run Code Online (Sandbox Code Playgroud)
我正在将该URL复制到我的浏览器中并获得以下响应:
<Error>
<Code>NoSuchBucket</Code>
<Message>The specified bucket does …Run Code Online (Sandbox Code Playgroud) 我正在搜索文档,它只提供了 v3 凭证的伪代码(例如const client = new S3Client(clientParams)
如何使用存储桶和凭据初始化 S3Client 以执行 getSignedUrl 请求?任何为我指明正确方向的资源都会非常有帮助。我什至搜索了 YouTube、SO 等,但找不到有关 v3 的任何具体信息。即使文档和示例也没有提供使用凭据的实际代码。谢谢!
顺便说一句,我是否必须在文件名中包含假文件夹结构,或者我可以只使用实际的文件名吗?例如:bucket/folder1/folder2/uniqueFilename.zip 或 uniqueFilename.zip
这是我到目前为止的代码:(请记住,我正在返回以wasabiObjKey确保我获得正确的文件名。我是。我遇到问题的是客户端、GetObjectCommand 和 getSignedUrl。
exports.getPresignedUrl = functions.https.onCall(async (data, ctx) => {
const wasabiObjKey = `${data.bucket_prefix ? `${data.bucket_prefix}/` : ''}${data.uid.replace(/-/g, '_').toLowerCase()}${data.variation ? `_${data.variation.replace(/\./g, '').toLowerCase()}` : ''}.zip`
const { S3Client, GetObjectCommand } = require('@aws-sdk/client-s3')
const s3 = new S3Client({
bucketEndpoint: functions.config().s3_bucket.name,
region: functions.config().s3_bucket.region,
credentials: {
secretAccessKey: functions.config().s3.secret,
accessKeyId: functions.config().s3.access_key
}
})
const command = new GetObjectCommand({
Bucket: functions.config().s3_bucket.name,
Key: wasabiObjKey,
}) …Run Code Online (Sandbox Code Playgroud) 我看到了很多这样的消息:
注意:AWS SDK for JavaScript (v2) 将于 2023 年进入维护模式。
请迁移您的代码以使用适用于 JavaScript 的 AWS 开发工具包 (v3)。有关更多信息,请查看迁移指南:https://a.co/7PzMCcy (用于
node --trace-warnings ...显示创建警告的位置)
能抑制住吗?
(这不是我的代码库,所以升级到 v3 是我无法控制的)。
我在cdk 研讨会上创建了一个小型 lambda 函数。我正在打字稿中编写 lambda 函数,通过管道进行部署,该管道创建包含 lambda 函数的云形成堆栈。
我正在尝试在 lambda 中使用 sdk v3,如此处演示的那样。但后来我在这里看到了相互矛盾的文档。
这些错误是因为我尝试使用 V3 而我不应该使用,还是因为其他原因?处理程序设置正确,函数运行但失败并出现错误:
{
"errorType": "Runtime.ImportModuleError",
"errorMessage": "Error: Cannot find module '@aws-sdk/client-sns'\nRequire stack:\n- /var/task/ReceiveMessageLoraThing.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",
"stack": [
"Runtime.ImportModuleError: Error: Cannot find module '@aws-sdk/client-sns'",
"Require stack:",
"- /var/task/ReceiveMessageLoraThing.js",
"- /var/runtime/UserFunction.js",
"- /var/runtime/index.js",
" at _loadUserApp (/var/runtime/UserFunction.js:100:13)",
" at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
" at Object.<anonymous> (/var/runtime/index.js:43:30)",
" at Module._compile (internal/modules/cjs/loader.js:999:30)",
" at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)",
" at Module.load (internal/modules/cjs/loader.js:863:32)",
" at Function.Module._load (internal/modules/cjs/loader.js:708:14)",
" at …Run Code Online (Sandbox Code Playgroud) 我对 SES 和 SESV2 之间 javascript aws-sdk 的差异感到困惑。我的默认假设是 V2 是升级/更新,应该涵盖基本 SES 模块具有的所有功能,但似乎存在很多差距,至少那些处理收据规则集的功能似乎缺失。或者我错过了什么?
例如,“listReceiptRuleSets”位于 aws-sdk SES 中,但不在 SESv2 中。V2中有类似的动作吗?
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SES.html#listReceiptRuleSets-property
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SESV2.html
我正在尝试使用有关 aws 和 dynamo db 的 async/await 功能。下面是一个如何在异步等待前放置对象的示例,正如您在回调中看到的,您可以访问包含放置对象的数据。但是,在使用 async 和 promise 的第二个代码块中,结果是一个空对象,有什么想法吗?
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.NodeJs.03.html
非承诺版本
var docClient = new AWS.DynamoDB.DocumentClient();
var table = "Movies";
var year = 2015;
var title = "The Big New Movie";
var params = {
TableName:table,
Item:{
"year": year,
"title": title,
"info":{
"plot": "Nothing happens at all.",
"rating": 0
}
}
};
console.log("Adding a new item...");
docClient.put(params, function(err, data) {
if (err) {
console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2));
} else {
console.log("Added item:", …Run Code Online (Sandbox Code Playgroud) javascript amazon-web-services node.js amazon-dynamodb aws-sdk-js
使用无服务器,我们可以process.env通过创建这样的配置文件条目来添加变量:
environment:
STRIPE_SECRET_KEY: ${self:custom.secrets.stripeSecretKey} # Stripe secret API key
Run Code Online (Sandbox Code Playgroud)
我们可以像这样在 lambda 函数中访问它:
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
Run Code Online (Sandbox Code Playgroud)
我们如何使用 AWS Amplify 做到这一点?
amazon-web-services node.js aws-lambda aws-sdk-js aws-amplify
测试 s3 上传?测试的方法是
export class ProcessData {
constructor() {}
async process(): Promise<void> {
const data = await s3Client.send(new GetObjectCommand(bucket));
await parseCsvData(data.Body)
}
Run Code Online (Sandbox Code Playgroud)
这是我对测试用例的尝试。
import {S3Client} from '@aws-sdk/client-s3';
jest.mock("aws-sdk/clients/s3", () => {
return {
S3Client: jest.fn(() => {
send: jest.fn().mockImplementation(() => {
data: Buffer.from(require("fs").readFileSync(path.resolve(__dirname, "test.csv")));
})
})
}
});
describe("@aws-sdk/client-s3 mock", () => {
test('CSV Happy path', async () => {
const processData = new ProcessData()
await processData.process()
}
}
Run Code Online (Sandbox Code Playgroud)
该进程进入解析方法并抛出错误“您尝试访问的存储桶必须使用特定端点进行寻址”
AWS 文档表明管理员可以使用 API 在 AWS Cognito 中创建用户池用户。
这是我所指的文档:https : //docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminCreateUser.html
然而,文档提供的细节很少,甚至没有提供如何完成的示例。它没有提及要调用的端点、要使用的 SDK 功能或任何有关身份验证的内容等。
有没有人有直接从您的代码创建新用户的经验?
每当尝试使用 AWS Cognito 响应 NEW_PASSWORD_REQUIRED 质询时,已经成功运行了几年的应用程序就会开始抛出以下错误:
{"__type":"NotAuthorizedException","message":"无法修改已提供的电子邮件"}
我正在发送以下内容,这些内容似乎都与文档相符。
{
"ChallengeName": "NEW_PASSWORD_REQUIRED",
"ClientId": <client_id>,
"ChallengeResponses": {
"userAttributes.email": "test@example.com",
"NEW_PASSWORD": "testP@55w0rd",
"USERNAME": "testfake"
},
"Session": <session_id>
}
Run Code Online (Sandbox Code Playgroud)
前端没有任何改变;我们在 Cognito/AWS 端所做的配置更改是否可能导致此错误?
aws-sdk-js ×10
node.js ×4
amazon-s3 ×3
javascript ×3
aws-lambda ×2
amazon-ses ×1
aws-amplify ×1
aws-sdk ×1
ts-jest ×1
typescript ×1