为了账号安全,请及时绑定邮箱和手机立即绑定

如何用Docker和LocalStack在本地运行NodeJS的Lambda函数

我试着在一个 docker-compose 堆栈中运行一个 lambda 函数——这需要我阅读很多教程并进行调试,所以我整理了一下,并决定把所有内容放到一个地方(请查看 GitHub 项目),在这里稍微解释一下。

项目结构如下:

repo/  
├─ src/  # 源代码文件夹,包含源代码文件
│  ├─ handler.js  
│  ├─ package.json  
├─ Dockerfile  # 用于构建Docker镜像的配置文件
├─ admin-policy.json  
├─ docker-compose.yaml  # 用于定义和运行多容器Docker应用的配置文件
├─ localSetup.sh  # 本地设置脚本

handler.js 文件导出一个名为 handle 的函数,该函数在这个例子中只是返回一条消息。

    exports.handler = async (event,context) => {  
      console.log("在函数里!");  
      console.log({ event, context });  
      const response = {  
        statusCode: 200,  
        body: JSON.stringify({  
          message: "来自本地堆栈的消息",  
        }),  
      };  
      console.log("正在返回响应");  
      return response;  
    };

package.json 中,你可以定义你的 lambda 函数所需的依赖包,例如你可能需要添加某些 npm 包。

{
  "name": "测试"
}

Dockerfile 会把 src 文件夹打包成一个压缩包,并将其命名为 lambdas.zip

    FROM node:latest as lambda  # 从最新的node镜像创建一个名为lambda的构建阶段

    WORKDIR /usr/src  # 设置工作目录为/usr/src
    COPY . .  # 将当前目录的内容复制到目标容器的当前工作目录
    RUN apt-get update  # 更新apt-get包列表
    RUN apt-get install zip  # 安装zip工具
    RUN cd src && npm install && zip -r lambdas.zip .  # 安装npm依赖并打包文件

    FROM localstack/localstack  # 从localstack/localstack镜像创建一个新阶段
    COPY --from=lambda /usr/src/src/lambdas.zip ./lambdas.zip  # 从lambda阶段复制文件到当前阶段

这一步在其他资料中没有提到。我创建了具有相应权限的IAM用户,并在我的admin-policy.json中允许了所有权限。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "允许效果",
      "Resource": "*",
      "Action": "sts:AssumeRole"
    }
  ]
}

docker-compose.yaml文件看起来像这样:

    version: '3.8'  

    services:  
      localstack:  
        network_mode: bridge  # 使用桥接网络模式
        build:  
          context: .  
        container_name: localstack_example  # 容器名称设置为 localstack_example
        hostname: localstack  
        ports:  
          - "4566:4566"  # 映射宿主机的 4566 端口到容器的 4566 端口
        environment:  
          - SERVICES=lambda,iam  # 设置服务为 lambda 和 iam
          - DEBUG=1  # 启用调试模式
          - AWS_DEFAULT_REGION=us-east-1  
          - AWS_ACCESS_KEY_ID=test  
          - AWS_SECRET_ACCESS_KEY=test  
          - LOCALSTACK_HOST=localstack  
          - LAMBDA_EXECUTION=local  
        volumes:  
          - ./localSetup.sh:/etc/localstack/init/ready.d/init-aws.sh  # 将当前目录下的 localSetup.sh 映射到容器内的相应路径
          - ./admin-policy.json:/opt/code/localstack/admin-policy.json  
          - /var/run/docker.sock:/var/run/docker.sock

最后,localSetup.sh 内容如下:

    #!/bin/bash  

    echo "创建Lambda函数"

    awslocal iam create-role \
      --role-name admin \
      --path / \
      --assume-role-policy-document file://admin-policy.json
    echo "...上面的操作成功了。"

    awslocal lambda create-function \
      --function-name test \
      --runtime nodejs18.x \
      --timeout 10 \
      --zip-file fileb://lambdas.zip \
      --handler handler.handler \
      --role arn:aws:iam::000000000000:role/admin

    echo "完成创建Lambda函数!"

    # 等待函数变为活动状态
    echo "等待函数变为活动状态..."
    while true; do
        status=$(awslocal lambda get-function --function-name test --query 'Configuration.State' --output text)
        if [[ "$status" == "Active" ]]; then
            echo "Lambda函数已变为活动状态。"
            break
        fi
        echo "当前状态:$status。正在等待..."
        sleep 2
    done

    echo "------------------------------"

    echo "创建函数URL"
    awslocal lambda create-function-url-config \
      --function-name test \
      --auth-type NONE

赋予这个文件执行权限,否则它运行不起来——只需要在主机上运行以下命令就可以了。


    chmod +x localSetup.sh
```给localSetup.sh文件添加执行权限

要启动容器,你可以这样做:

运行以下命令来启动并构建Docker容器:`docker-compose up -d --build`

一旦运行后,你应该能够在 docker 容器的日志中看到 Lambda 函数的网址,其形式应该类似于:
`http://<lambda-id>.lambda-url.us-east-1.localstack:4566/`

在主机机器上的 Postman 中调用它时,你需要将 `localstack` 替换为 `localhost` :

`http://<lambda-id>.lambda-url.us-east-1.localhost:4566/`

就这样啦!

资料来源:

## [LocalStack 现已支持 AWS Lambda 函数 URL,接下来我们就来学习如何创建并测试一个简单的 AWS Lambda 函数 URL。](https://hashnode.localstack.cloud/creating-aws-lambda-function-urls-with-localstack?source=post_page-----74b973b0d279--------------------------------)

## [使用.zip文件部署Node.js Lambda函数您的AWS Lambda函数的代码包括.js或.mjs文件,其中包含函数处理程序代码,以及其他任何必需的文件……](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-package.html?source=post_page-----74b973b0d279--------------------------------)。

## [LocalStack - 在本地测试 Lambda 函数](https://prabhakar-borah.medium.com/localstack-test-your-lambda-on-your-localhost-5cce066c967c?source=post_page-----74b973b0d279--------------------------------)

作为开发体验 (DX) 的一个坚定支持者,我开始欣赏这种用例,即在本地测试 Lambda 函数的价值…prabhakar-borah.medium.com
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消