埃普西龙
用 OpenAPI 简化 Lambda 服务一致的 apis 的小型库
你不妨读 更改日志
东都:
- 在本文中讨论 http/batch 的 labda 的亲/友
- 路径/ query var 检查是否打开 api doc
- 检查压缩处理
比用直道节点好多少?
- 使用打字符来代替被上帝遗忘的直线活字
- 处理路由映射( 多端, 单羊肉)
- 使用承诺和最高水平的.捕获量可转换为500
- 添加压缩
- 添加中央ORS
- 添加 JWT 处理
- 一致的错误处理
- 也可以提供静态内容
- 某种永恒的物体允许乐观地缓存
- 用于支持通过SaltMint, SNS, SQS, 电子邮件等进行非HTTP( 批量)处理
比使用快递更好吗?
- 没有req/res 架构来伪造 如此容易测试
- OpenAPI 第一个设计
- 轻得多
- 支持背景、 CRON、 API 间通讯、 AWS 批次退出框
其他服务
- 环境服务
- 简单重定向
CDK 自动构建
导言
先决条件
- 你每次做这样的自动化工作,我 高度建议 先开账单 别 如果你跳过这个台阶 下个月不小心花出1000美元https://docs.aws.amazon.com/AmazonCloud Watch/latest/monitor assessment cloudwatch.html 页面存档备份,存于互联网档案馆(中文(简体) )
- CDK V2 必须挂入您的账户( Namehttps://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html 页面存档备份,存于互联网档案馆(中文(简体) ) -- -- 例如(a)npx cdk 靴子圈 aws://1234567890.us-east-1(中文(简体) )
- 运行 CDK 的用户需要 -LOTS - AWS privs (我稍后会将它们全部列出). 现在,假设一堆)
- 政策 arn:aws:iams:: policy/ service-role/AWSLambdaVPC AccessExecutiveRole 互联网档案馆的存檔,存档日期2013-12-02 必须存在( 默认情况下应该存在)
- 政策 arn:aws:iam::aws:政策/服务-作用/AWSBatchServicesRole 必须存在( 您可能必须创建它 - 看 https://docs.aws.amazon.com/batch/latest/userguide/service IAM role.html 互联网档案馆的存檔,存档日期2011-12-21(中文(简体) )
- 你应该有一个VPC,你的Lambda会部署在, 你应该知道它的ID(例如, 页:1(中文(简体) )
- VPC应该有一个或多个子网,你应该知道他们的ID(例如, 05966bfadca940a88 (英语)(中文(简体) )
- VPC应该有一个安全小组, 它可能应该允许外出交通 如果你想要你的羊肉与互联网交谈。 你应该知道它的ID(例如, 02a89a55b0f2cb4ae (中文(简体) ) - 让开 警长.. 前缀)
Api 设置
- 您的相片层,除了依赖于 Epsilon,还需要: **"aws-cdk-lib":(Peer版本) **"构造": (Peer版本) **"行": (Peer版本)
嵌入设置
.dockerignore (英语)
一般来说, Docker 文件需要放在您 api 和 cdk 文件夹上方的文件夹中, 但是它必须忽略 在这种情况下, cdk 文件夹将无限重复
# Need this here to prevent infinite recusion of cdk folder at least
.github
.idea
.yarn
.git
modules/cdk
node_modules
嵌入符
FROM public.ecr.aws/lambda/nodejs:14
COPY modules/api/package.json modules/api/gql-codegen.yml modules/api/tsconfig.json ${LAMBDA_TASK_ROOT}/
COPY modules/api/src ${LAMBDA_TASK_ROOT}/src
COPY lambda-bootstrap-shell.sh ${LAMBDA_TASK_ROOT}
RUN npm install -g yarn
RUN yarn install
RUN yarn clean-compile
ENTRYPOINT ["sh","/var/task/lambda-bootstrap-shell.sh"]
CMD [ "dist/lambda.handler" ]
(原始内容存档于2018-09-26). lambda-bootstrap- shell.sh
#!/bin/sh
# Based on the default script in public.ecr.aws/lambda/nodejs:14, which is copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
# Modifications copyright Christopher Weiss, 2022
if [ -z "${EPSILON_RUNNING_IN_AWS_BATCH}" ]; then
if [ $# -lt 1 ]; then
echo "entrypoint requires the handler name to be the first argument" 1>&2
exit 142
fi
export _HANDLER="$1"
RUNTIME_ENTRYPOINT=/var/runtime/bootstrap
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
exec /usr/local/bin/aws-lambda-rie $RUNTIME_ENTRYPOINT
else
exec $RUNTIME_ENTRYPOINT
fi
else
echo "Running Epsilon inside AWS batch - triggering direct $1 $2"
exec node dist/aws-batch-epsilon-cli.ts --process $1 --data $2
fi
图QL 支持(v0.1.x和以上)
如果你只是做直的图形QL 那么你真的不需要使用 Epsilon (我建议只是 与直线 https://www.npmjs.com/package/apollo-server-lambda 互联网档案馆的存檔,存档日期2013-12-22) (中文(简体) ). 不过,如果你想搞砸的话 epsilon 允许您指定一个正则 表达式,所有匹配请求都委托给一个提供阿波罗服务器,绕过Epsilon.
要做到这一点,您必须包括下列图书馆(它们没有被标记为Epsilon的附属物,因为它们 如果您不支持 GraphQL , 则不需要 )
"apollo-server-lambda": "2.8.1",
"graphql": "14.4.2",
然后,在你的路由器配置中, 你必须设置一个阿波罗服务器和一个阿波罗Regex:
const typeDefs = gql`
type Query {
hello: String
}
`;
// Provide resolver functions for your schema fields
const resolvers = {
Query: {
hello: () => 'Hello world!',
},
};
const server: ApolloServer = new ApolloServer({ typeDefs, resolvers });
// ...
const cfg: RouterConfig = RouterUtil.openApiYamlToRouterConfig(yamlString, handlers, authorizers, options);
// ...
cfg.apolloServer = server;
cfg.apolloCreateHandlerOptions = {
origin: '*',
credentials: true,
} as CreateHandlerOptions;
cfg.apolloRegex = new RegExp('.*graphql.*');
使用量
使用 WebHandler 来简化 Lambda
您将配置路由器Config, 然后从此创建 WebHandler 。 你的羊肉达 函数应该看起来像 :
const handler: Handler = (event: APIGatewayEvent, context: Context, callback: Callback) => {
const routerConfig: RouterConfig = getMyRouterConfig(); // Implement this function
const commonHandler: WebHandler = new WebHandler(routerConfig);
commonHandler.lambdaHandler(event, context, callback);
};
export {handler};
使用认证/ AuthHandler 来简化基于 JWT 的符号认证
你的认证人Lambda应该这样(我这里假设你在AWS存储你的加密密钥) 系统管理器 这样你就可以保持它加密 在休息,你绝对应该这样做:
import {AuthHandler} from '@bitblit/epsilon/dist/auth/auth-handler';
import {Callback, Context, CustomAuthorizerEvent, Handler} from 'aws-lambda';
import {EnvironmentService} from '@bitblit/ratchet/dist/aws/environment-service';
import 'reflect-metadata';
const handler: Handler = (event: CustomAuthorizerEvent, context: Context, callback: Callback) => {
EnvironmentService.getConfig('MyConfigurationName').then(cfg => {
const commonAuth: AuthHandler = new AuthHandler('api.mycompany.com', cfg['encryptionKey']);
commonAuth.lambdaHandler(event, context, callback);
});
};
export {handler};
这将通过任何持有有效JWT标志的人。 注意,Epsilon还没有支持基于角色 在此版本中过滤 .
要创建有效的 JWT 令牌, 您的认证端点可以使用 认证/网络控件管理器 像这样的课 (在您验证了用户主/证书对后):
// Other authentication stuff happens up here.
const email: string = '[email protected]';
const roles: string[] = ['USER','NOT-AN-ADMIN'];
const userData: any = {'other': 'stuff'};
const myConfig: any = await EnvironmentService.getConfig('MyConfigurationName'); // same as above
const encryptionKey: string = cfg['encryptionKey'];
const adminUser: any = null; // Set this if the user is an admin doing run-as (this is the admin user)
const expSec: number = 3600; // How long until this token expires in seconds
const tokenHandler: WebTokenManipulator = new WebTokenManipulator(encryptionKey, 'api.mycompany.com');
const token: string = tokenHandler.createJWTString(email, userData, roles, expSec, admin);
关于增加新网关/阶段的说明
您需要认证攻击羊肉的通道(截至2018-10-13年
aws lambda add-permission --function-name "arn:aws:lambda:us-east-1:{accountId}:function:{lambda-function-name}"
--source-arn "arn:aws:execute-api:us-east-1:{account number}:{api id}/*/*/*"
--principal apigateway.amazonaws.com
--statement-id b57d8a0f-08e5-407c-9093-47d7e8e840bc
--action lambda:InvokeFunction
您需要记住去 IAM / Keys 并授权新堆栈用户使用您的 KMS 密钥( 如果您是 使用 KMS 通过 SystemManager 加密您的配置, 您应该这样做 。 )