我在本地运行的Lambda中尝试通过SAM访问MongoDB的笔记
总结上次引入了文件夹层次结构。
这次要确认可以使用DocumentDB进行操作。
需要注意的是,由于没有提供本地版本的DocumentDB,所以我们将使用MongoDB。
MongoDB/DocumentDB有3系列和4系列的破坏性更改,但这次我们将引入最新版本4.0。
源代码
做事
-
mongodbの単体テスト
- mongodbの単体テスト
-
- nongodbのローカルでの実行
mongodbはdockerで動かす
不要做的事情 (Bù zuò de
デプロイ
引入MongoDBlaradockを参考に導入。
ファイルシステムがwindowsと相性悪いのでvolumesを修正(ubuntuのdockerでは修正しなくても動いた)
version: '3.5'
networks:
backend:
driver: ${NETWORKS_DRIVER}
volumes:
mongodb-data: {}
services:
### MongoDB ##############################################
mongo:
build: ./mongo
ports:
- "${MONGODB_PORT}:27017"
volumes:
- mongodb-data:/data/db
networks:
- backend
用Robo 3T进行连接确认。
官方- 使用Robo 3T连接。
使用Robo 3T来检查monogoDB。
使用MongoDB
处理程序
callbackWaitsForEmptyEventLoop はfalseにしておくのがベストプラクティスとあったのでそうしている。
import { APIGatewayProxyHandler } from 'aws-lambda';
import * as response from '@/lambda/utilities/reponse';
import * as users from '../../users/persistant/users';
export const lambdaHandler: APIGatewayProxyHandler = async (event, context) => {
context.callbackWaitsForEmptyEventLoop = false;
const { body } = event;
if (!body) {
return response.badRequest('body is required')
}
try {
const user = await users.create(JSON.parse(body))
return response.ok(user);
} catch (e) {
console.error(e)
throw e
}
};
堆栈
-
環境変数を設定
callbackWaitsForEmptyEventLoop はfalseにしておくのがベストプラクティスとあったのでそうしている。
import { APIGatewayProxyHandler } from 'aws-lambda';
import * as response from '@/lambda/utilities/reponse';
import * as users from '../../users/persistant/users';
export const lambdaHandler: APIGatewayProxyHandler = async (event, context) => {
context.callbackWaitsForEmptyEventLoop = false;
const { body } = event;
if (!body) {
return response.badRequest('body is required')
}
try {
const user = await users.create(JSON.parse(body))
return response.ok(user);
} catch (e) {
console.error(e)
throw e
}
};
堆栈
-
環境変数を設定
- 環境変数を設定
mongodb-client-encryptionはbundleするときに入れろという内容のエラーが出たので、言われるままに追加。
const environment = {
DOCUMENTDB_CONNECTION_STRING: '',
DEFAULT_DB_NAME: ''
}
const bundling = {
externalModules: ['aws-sdk', 'mongodb', 'mongodb-client-encryption'],
}
const mongoFunctionOptions = { environment, bundling, layers: [nodeModulesLayer] }
const postUserFunction = new NodejsFunction(this, 'postUser', {
runtime: lambda.Runtime.NODEJS_14_X,
entry: `${entryHandlerDir}/users/post-user.ts`,
functionName: 'post-user',
handler: 'lambdaHandler',
...mongoFunctionOptions,
});
执行配置
-
関数名の下に環境変数を設定
- 関数名の下に環境変数を設定
接続文字列は、localhostをhost.docker.internalに置き換えている。参照
samはコンテナ上で動いているため、ホストのlocalhostのmongodbを見に行く必要がある
{
"postUser7BA52173": {
"DOCUMENTDB_CONNECTION_STRING": "mongodb://host.docker.internal:27017",
"DEFAULT_DB_NAME": "sample"
}
}
-n (-env-vars)オプションで環境変数設定ファイルを使用するように設定
"bundle": "cdk synth > cdk.out/template.yaml",
"localinvoke": "cd cdk.out && sam.cmd local invoke testAF53AC38 --no-event",
+ "dev-serve": "cd cdk.out && sam.cmd local start-api -n ../env.json"
},
使用MongoDB进行测试
由于之前使用 Jest,因此选择使用 @shelf/jest-mongodb。
为了在内存中进行测试,需要额外安装 mongodb-memory-server。
请注意安装时默认的 MongoDB 版本为 4.0.14。
module.exports = {
mongodbMemoryServerOptions: {
binary: {
version: '4.0.14',
skipMD5: true
},
instance: {
dbName: 'jest'
},
autoStart: false,
instance: {}
}
};
This phrase can be paraphrased in Chinese as “实践” (shí .
POST http://localhost:3000/users HTTP/1.1
{
"username": "user2",
"age": 22
}
请注意
-
dockerでmongodbはwindowsとちょっと相性悪いぽい。
ファイルシステムの問題
请你再说一遍好吗?我试了一下 npm info mongodb versions 和 npm info @types/mongodb。
MongoDB的3系列的最新版本是3.6.4,而 @types/mongodb 的最新版本是3.6.9。
它们不同步吗?
另外,’4.0.0-beta.1’中包含了类型定义文件。
请汇款指南jest mongodb – 测试JavaScript代码的库
github shelfio/jest-mongodb – Jest的MongoDB扩展,用于在测试中模拟和管理MongoDB数据库
mongodb-memory-servere – 用于在内存中模拟和管理MongoDB数据库的Node.js库
Node.jsからMongoDBに接続してみる – 从Node.js连接到MongoDB进行尝试
github-mongo – 在GitHub上管理和托管MongoDB数据库
Express + MongoDBで作成したAPIサーバーをJestでテストする – 使用Jest测试使用Express + MongoDB创建的API服务器
AWS DocumentDB – 亚马逊云的托管文档数据库服务
AWS DynamoDB/DocumentDBをローカルで確認する手順(自分用メモ) – 在本地检查AWS DynamoDB/DocumentDB的步骤(个人备忘录)
Do You Need Mongoose When Developing Node.js and MongoDB Applications? – 开发Node.js和MongoDB应用程序时是否需要Mongoose?
ts-jest – 用于在TypeScript项目中进行Jest测试的库
MongoDB, Mongo Express起動用docker-compose設定手順 – 用于启动MongoDB和Mongo Express的Docker Compose设置步骤
@aws-cdk/aws-apigateway module – 用于AWS CDK创建API Gateway的模块
‘mongodb-client-encryption’ – 提供MongoDB客户端加密功能的库
stack over flow – 一个编程问答网站
linuxでhost.docker.internalを使う – 在Linux中使用host.docker.internal
Dockerコンテナ内からホストへlocalhostでアクセスしてみる – 尝试从Docker容器内部通过localhost访问主机
MongoDBを扱うExpressアプリをAWS Lambdaに乗せてサーバーレスにするgit lo – 将处理MongoDB的Express应用程序部署到AWS Lambda以实现无服务器架构的git库
AWS SAMの環境変数設定方法 – AWS SAM的环境变量设置方法
aws-cdk-examples – AWS CDK的示例项目
robo3t – 一个可视化的MongoDB管理工具
公式- robo3tで接続する – 使用官方的robo3t进行连接和管理MongoDB
Robo 3Tを使ってmonogoDBを確認する – 使用Robo 3T进行MongoDB的检查和管理
module.exports = {
mongodbMemoryServerOptions: {
binary: {
version: '4.0.14',
skipMD5: true
},
instance: {
dbName: 'jest'
},
autoStart: false,
instance: {}
}
};
POST http://localhost:3000/users HTTP/1.1
{
"username": "user2",
"age": 22
}

请注意
-
dockerでmongodbはwindowsとちょっと相性悪いぽい。
- dockerでmongodbはwindowsとちょっと相性悪いぽい。
ファイルシステムの問題
请你再说一遍好吗?我试了一下 npm info mongodb versions 和 npm info @types/mongodb。
MongoDB的3系列的最新版本是3.6.4,而 @types/mongodb 的最新版本是3.6.9。
它们不同步吗?
另外,’4.0.0-beta.1’中包含了类型定义文件。
请汇款指南jest mongodb – 测试JavaScript代码的库
github shelfio/jest-mongodb – Jest的MongoDB扩展,用于在测试中模拟和管理MongoDB数据库
mongodb-memory-servere – 用于在内存中模拟和管理MongoDB数据库的Node.js库
Node.jsからMongoDBに接続してみる – 从Node.js连接到MongoDB进行尝试
github-mongo – 在GitHub上管理和托管MongoDB数据库
Express + MongoDBで作成したAPIサーバーをJestでテストする – 使用Jest测试使用Express + MongoDB创建的API服务器
AWS DocumentDB – 亚马逊云的托管文档数据库服务
AWS DynamoDB/DocumentDBをローカルで確認する手順(自分用メモ) – 在本地检查AWS DynamoDB/DocumentDB的步骤(个人备忘录)
Do You Need Mongoose When Developing Node.js and MongoDB Applications? – 开发Node.js和MongoDB应用程序时是否需要Mongoose?
ts-jest – 用于在TypeScript项目中进行Jest测试的库
MongoDB, Mongo Express起動用docker-compose設定手順 – 用于启动MongoDB和Mongo Express的Docker Compose设置步骤
@aws-cdk/aws-apigateway module – 用于AWS CDK创建API Gateway的模块
‘mongodb-client-encryption’ – 提供MongoDB客户端加密功能的库
stack over flow – 一个编程问答网站
linuxでhost.docker.internalを使う – 在Linux中使用host.docker.internal
Dockerコンテナ内からホストへlocalhostでアクセスしてみる – 尝试从Docker容器内部通过localhost访问主机
MongoDBを扱うExpressアプリをAWS Lambdaに乗せてサーバーレスにするgit lo – 将处理MongoDB的Express应用程序部署到AWS Lambda以实现无服务器架构的git库
AWS SAMの環境変数設定方法 – AWS SAM的环境变量设置方法
aws-cdk-examples – AWS CDK的示例项目
robo3t – 一个可视化的MongoDB管理工具
公式- robo3tで接続する – 使用官方的robo3t进行连接和管理MongoDB
Robo 3Tを使ってmonogoDBを確認する – 使用Robo 3T进行MongoDB的检查和管理