如何在 Serverless 架构中使用 Amazon S3 进行数据存储
在 Serverless 架构中,Amazon S3 可以作为一种广泛使用的数据存储解决方案。在本文中,我们将详细介绍如何在 Serverless 环境中使用 Amazon S3 进行数据存储,以及如何使用 AWS S3 SDK 和 AWS Lambda 实现 Serverless 应用程序中的 S3 文件上传。
1.创建 Amazon S3 存储桶
在开始之前,我们需要创建一个 Amazon S3 存储桶。在 AWS 控制台的 Amazon S3 页面上,您可以轻松地创建和管理 S3 存储桶。
2.创建 AWS Lambda 函数
在处理存储和检索 Amazon S3 上的文件时,AWS Lambda 是一个非常有用的工具。通过 AWS Lambda,您可以轻松地编写和部署处理 Amazon S3 事件的函数。
我们将编写一个名为 uploadFile 的函数。它将使用 AWS S3 SDK 将文件上传到 Amazon S3 存储桶中。代码如下:
// www.javascriptcn.com code example
const AWS = require('aws-sdk')
exports.handler = async (event, context) => {
const s3 = new AWS.S3()
const bucketName = '[YOUR BUCKET NAME]'
try {
const { name, content } = JSON.parse(event.body)
const key = `${Date.now()}_${name}`
const uploadParams = { Bucket: bucketName, Key: key, Body: Buffer.from(content, 'base64') }
await s3.putObject(uploadParams).promise()
return {
statusCode: 200,
body: JSON.stringify({ key }),
}
} catch (err) {
console.error(err)
return {
statusCode: 500,
body: JSON.stringify({ message: 'Error uploading file to S3' }),
}
}
}这个函数从事件中获取文件名和文件内容,使用 S3 SDK 将文件上传到 S3 存储桶中,并在成功上传后返回键(key)作为响应。
3.配置存储桶权限
为了让 AWS Lambda 函数能够上传文件到存储桶中,我们需要为存储桶设置必要的权限。我们可以使用 AWS 访问管理(IAM)来创建一个新的 IAM 角色,该角色具有上传文件到存储桶的权限。角色示例:
// www.javascriptcn.com code example
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::[YOUR BUCKET NAME]/*"
]
}
]
}- 部署 AWS Lambda 函数
我们已经编写了上传文件的 AWS Lambda 函数,并为存储桶设置必要的权限,现在我们需要将上传文件的函数部署到 AWS Lambda 中。
我们可以使用 AWS CLI 或 AWS 控制台将函数部署到 AWS Lambda。这里使用 AWS CLI:
aws lambda create-function \ --function-name uploadFile \ --runtime nodejs14.x \ --code S3Bucket=[YOUR S3 BUCKET NAME],S3Key=lambda.zip \ --handler handler.handler \ --role [YOUR ROLE ARN]
- 在 Serverless 应用程序中使用 uploadFile 函数
我们已经在 AWS Lambda 中成功部署了上传文件的函数,现在我们可以在 Serverless 应用程序中使用此函数。
首先,我们需要添加 AWS SDK 和 serverless-http 构建插件到 package.json 文件中。示例:
{
"name": "serverless-app",
"version": "1.0.0",
"dependencies": {
"aws-sdk": "*",
"serverless-http": "*"
}
}其次,我们需要使用 serverless-http 插件将 AWS Lambda 函数转换为 Express 中间件,以便在您的应用程序中使用。示例:
// www.javascriptcn.com code example
const express = require('express')
const AWS = require('aws-sdk')
const serverless = require('serverless-http')
const app = express()
const router = express.Router()
const s3 = new AWS.S3()
const bucketName = '[YOUR BUCKET NAME]'
const lambda = new AWS.Lambda({
region: '[YOUR REGION]',
})
router.post('/upload', async (req, res) => {
try {
const { name, file } = req.body
const uploadParams = { FunctionName: 'uploadFile', Payload: JSON.stringify({ name, content: file }) }
const data = await lambda.invoke(uploadParams).promise()
return res.status(200).json(JSON.parse(data.Payload))
} catch (err) {
console.error(err)
return res.status(500).json({ message: err.message })
}
})
app.use('/api', router)
module.exports.handler = serverless(app)这里,我们创建一个 Express 应用程序,并配置一个上传文件的路由。路由使用 AWS Lambda 调用上传文件的函数,并将响应从 Lambda 返回。
现在,您已经学会了如何在 Serverless 架构中使用 Amazon S3 进行数据存储,并使用 AWS S3 SDK 和 AWS Lambda 实现了 Serverless 应用程序中的 S3 文件上传。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67c3d809314edc2684e02236