AWS S3 存储服务是一个强大的云端存储解决方案,但是在访问存储桶(bucket)时,需要传递一个 bucket endpoint。这个 endpoint 可以是一个 URL,也可以是一个 hostname,一般情况下都是通过 Amazon S3 Region 标识来确定的。然而,在 Kubernetes 集群或者其他一些特殊的场景下,这个 endpoint 并不能自动的被解析。为了解决这个问题,AWS 提供了 @aws-sdk/bucket-endpoint-middleware 这个 npm 包,可以方便地实现 bucket endpoint 的自动解析。
安装 @aws-sdk/bucket-endpoint-middleware
安装这个 npm 包很简单,只需要在你的项目中执行下面的命令即可:
npm install @aws-sdk/bucket-endpoint-middleware
使用 @aws-sdk/bucket-endpoint-middleware
在开始使用这个 middleware 之前,需要先获取到你的 AWS 服务的访问凭证。凭证可以通过 AWS 访问密钥(AWS access key)和访问密钥 ID(AWS secret access key)来获得。
如果你已经拥有 AWS 的访问凭证,那么可以通过下面的方法来创建一个 S3 client:
-- -------------------- ---- ------- ------ - -------- - ---- --------------------- ------ - ------------------------ - ---- -------------------------------------- ------ - --------------- - ---- ------------------------------- ----- -- - --- ---------- ------- ------------ -- --- -- ---------- ------------ ------------------ -- --- ------------ --- --- ---------- ------------ --------------------------- -- - ------ -------- ---------- --- ----------- - ---
在这个 client 中,我们引用了 @aws-sdk/bucket-endpoint-middleware 这个 npm 包,并将其添加到 middlewares 中。这样,当我们访问 bucket endpoint 的时候,middleware 就会自动的将 endpoint 解析成 IP 地址,然后发送请求。
在 S3 client 中,我们还需要定义访问的 bucket 名称和 endpoint 名称。这些信息可以通过两种不同方式来获得:
方式一:传入 URL
如果你已经知道你的 bucket 的 endpoint URL,那么可以直接将其传入 s3 client 的命令中:
-- -------------------- ---- ------- ----- ---------------------- - ------------------------------------- ----- -------- - ----------------- ----- -------------- ------- --------- ---- ---------------- ----- ----- -- - ---- --------- --------------- --- ---------------------------- -- - -------- --- -- ---
方式二:使用 bucket name 来自动获取 endpoint
如果我们只知道 bucket 的名称,那么可以使用 S3 client 的方法来自动获取 endpoint。
const myBucket = "my-bucket-name"; await s3.putObject({ Bucket: myBucket, Key: "my-object-key", Body: "This is a test object.", AutoLocationEnabled: true, // 启用自动获取 bucket endpoint });
当 AutoLocationEnabled
被设置为 true
后,s3 client 会自动的请求 AWS 的服务来获取 bucket 的 endpoint。为了保证这些请求的正确性,我们还需要确保 bucket 所在的 region 是正确的。
示例代码
下面是一个完整的 Node.js 示例代码,这个示例代码用来向 AWS S3 存储服务中上传一个文件。在上传文件之前,我们需要创建一个 S3 client,并将 bucket endpoint middleware 添加到它的 middlewares 中,然后我们就可以通过 S3 client 的方法来上传文件了。
-- -------------------- ---- ------- ------ -- ---- ----- ------ - -------- - ---- --------------------- ------ - ------------------------ - ---- -------------------------------------- ------ - --------------- - ---- ------------------------------- -- --- ---- ----- -- - --- ---------- ------- ------------ -- --- -- ------ ------------ ------------------ ------------ --------------------------- --- ----- -------- - ----------------- ----- ------ - ------------------ -- ------- ----- ----- - ---------------- -- -- ----- -- ------ ----- ----------- - ------------------------ -- ---- ----- -------------- ------- --------- ---- ------ ----- ------------ -------------------- ----- -- ------ ------ -------- ---
总之,@aws-sdk/bucket-endpoint-middleware 是一个非常实用的 npm 包,在使用 AWS S3 存储服务的时候,可以方便地自动解析 bucket endpoint,尤其是在一些特殊的场景下,更有其强大的作用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/5f6eecd1a9b7065299ccba17