如何在 AWS SDK v3 JavaScript 中设置凭证?

Joe*_*ger 25 amazon-s3 amazon-web-services aws-sdk-js

我正在搜索文档,它只提供了 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,
  })
  const { getSignedUrl } = require("@aws-sdk/s3-request-presigner")
  const url = getSignedUrl(s3, command, { expiresIn: 60 })
  return wasabiObjKey
})
Run Code Online (Sandbox Code Playgroud)

qkh*_*pro 46

有一个凭证链可以为来自 SDK https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html的 API 调用提供凭证

从 Amazon EC2 的 AWS Identity and Access Management (IAM) 角色加载

从共享凭证文件 (~/.aws/credentials) 加载

从环境变量加载

从磁盘上的 JSON 文件加载

JavaScript SDK 提供的其他凭据提供程序类

您可以将凭据嵌入到源代码中,但这不是首选方式

new S3Client(configuration: S3ClientConfig): S3Client
Run Code Online (Sandbox Code Playgroud)

其中 S3ClientConfig 包含一个credentials属性

https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/modules/credentials.html

new S3Client(configuration: S3ClientConfig): S3Client
Run Code Online (Sandbox Code Playgroud)

答案示例

  '$metadata': {
    httpStatusCode: 200,
    requestId: undefined,
    extendedRequestId: '7kwrFkEp3lEnLU+OtxjrgdmS6gQmvPdbnqqR7I8P/rdFrUPBkdKYPYykWivuHPXCF1IHgjCIbe8=',
    cfId: undefined,
    attempts: 1,
    totalRetryDelay: 0
  },
Run Code Online (Sandbox Code Playgroud)


Bil*_*ark 9

这是我(在 Deno 中)用于测试的一个简单方法(如果您不想采用signedUrl 方法,而只是让 SDK 为您完成繁重的工作):

import { config as env } from 'https://deno.land/x/dotenv/mod.ts' // https://github.com/pietvanzoen/deno-dotenv
import { S3Client, ListObjectsV2Command } from 'https://cdn.skypack.dev/@aws-sdk/client-s3' // https://github.com/aws/aws-sdk-js-v3

const {AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY} = env()

// https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/modules/credentials.html
const credentials = {
    accessKeyId: AWS_ACCESS_KEY_ID,
    secretAccessKey: AWS_SECRET_ACCESS_KEY,
}

// https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/interfaces/s3clientconfig.html
const config = {
    region: 'ap-southeast-1',
    credentials,
}

// https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/classes/s3client.html
const client = new S3Client(config)

export async function list() {
    // https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/interfaces/listobjectsv2commandinput.html
    const input = {
        Bucket: 'BucketNameHere'
    }

    // https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/classes/command.html
    const cmd = new ListObjectsV2Command(input)
    
    // https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/classes/listobjectsv2command.html
    return await client.send(cmd)
}
Run Code Online (Sandbox Code Playgroud)