我试着在一个 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 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦