我在本地运行的Lambda中尝试通过SAM访问MongoDB的笔记

总结上次引入了文件夹层次结构。
这次要确认可以使用DocumentDB进行操作。
需要注意的是,由于没有提供本地版本的DocumentDB,所以我们将使用MongoDB。
MongoDB/DocumentDB有3系列和4系列的破坏性更改,但这次我们将引入最新版本4.0。

源代码

做事

    • 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
  }
};

堆栈

    • 環境変数を設定

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
}
image.png

请注意

    • 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的检查和管理

bannerAds