我按照下面的示例设置 Lambda Edge 函数:
https://www.serverless.com/blog/lambda-at-edge-support-linked
代码:./handler.js
// SAME CODE STRUCTURE AS ORIGINAL, JUST ADDING A HEADER TO TEST
'use strict';
exports.handler = (event, context, callback) => {
const response = event.Records[0].cf.response;
const headers = response.headers;
headers['test-lambda-edge'] = [{ key: 'test-lambda-edge', value: 'working' }]
callback(null, response);
};
Run Code Online (Sandbox Code Playgroud)
配置:./serverless.yml
# SAME CONFIG AS ORIGINAL, JUST CHANGING eventType and origin
service: mylambda
provider:
name: aws
runtime: nodejs12.x
lambdaHashingVersion: 20201221
functions:
cfLambda:
handler: functions/handler.cloudfront
events:
- cloudFront:
eventType: origin-response
origin: https://example.org
Run Code Online (Sandbox Code Playgroud)
该功能正确部署: …
handler amazon-web-services node.js aws-lambda serverless-framework
我尝试通过 npm ( npm install -g serverless) 安装无服务器,但出现以下错误:
npm ERR! code EACCES
npm ERR! syscall rename
npm ERR! path /usr/local/lib/node_modules/serverless
npm ERR! dest /usr/local/lib/node_modules/.serverless-Ls3sFIzE
npm ERR! errno -13
npm ERR! Error: EACCES: permission denied, rename '/usr/local/lib/node_modules/serverless' -> '/usr/local/lib/node_modules/.serverless-Ls3sFIzE'
npm ERR! [Error: EACCES: permission denied, rename '/usr/local/lib/node_modules/serverless' -> '/usr/local/lib/node_modules/.serverless-Ls3sFIzE'] {
npm ERR! errno: -13,
npm ERR! code: 'EACCES',
npm ERR! syscall: 'rename',
npm ERR! path: '/usr/local/lib/node_modules/serverless',
npm ERR! dest: '/usr/local/lib/node_modules/.serverless-Ls3sFIzE'
npm ERR! }
npm ERR!
npm ERR! The operation was …Run Code Online (Sandbox Code Playgroud) AWS Lambda 最近添加了一个选项来指定更多临时存储(映射到/tmpLambda 容器中的目录的文件系统),从默认的 512 MB 到最大 10GB。
链接: https: //aws.amazon.com/blogs/aws/aws-lambda-now-supports-up-to-10-gb-ephemeral-storage/
在 AWS 控制台中,可通过控制台 > Lambda >(函数)> 配置 > 临时存储(位于已存在的“内存”选项旁边)访问此设置。
但到目前为止我还没有弄清楚如何通过配置非默认的临时存储大小serverless.yml。内存是通过键分配的memorySize(在provider节中或按函数重写)。
是否有类似的方法来配置更多临时存储?
我正在使用无服务器框架aws-node-typescript的示例。我的目标是将Prisma集成到其中。
到目前为止,我有:
\nserverless createprisma、运行prisma init、创建基本模型并成功User运行prisma migrate devusers通过复制现有hello函数创建第二个函数serverless deployPrismaClient,我收到内部服务器错误,并且该函数记录此错误:"ENOENT: no such file or directory, open \'/var/task/src/functions/users/schema.prisma\'"我的项目结构如下:
\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package-lock.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 prisma\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 migrations\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 20221006113352_init\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 migration.sql\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 migration_lock.toml\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 schema.prisma\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 serverless.ts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82 …Run Code Online (Sandbox Code Playgroud) 我尝试将我的应用程序从节点 16 更新到节点 18,完成更改版本后,我启动了我的应用程序并发送了 api 调用,并收到了以下输出。
\nWarning: found unsupported runtime 'nodejs18.x' for function 'rs-ms-v1'\n\xc3\x97 Unsupported runtime\nRun Code Online (Sandbox Code Playgroud)\n我们正在使用 serverless.yml 文件
\n我的无服务器库版本是3.33.0\ni检查了aws文档lambda函数开始支持nodejs18.x
\n请在下面附上您的解决方案。
\nnode.js aws-lambda serverless-framework serverless-architecture serverless
我正在使用无服务器框架使用S3,Lambda和API网关创建图像大小调整服务。这与此处的概念相似,但是将使用Serverless来设置和配置整个堆栈。
现在,我需要找到一种体面的方法来引用serverless.yml文件中生成的API网关的主机名。这就是我所拥有的资源。(只是一个片段)
imageBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: ${env:IMAGE_BUCKET}
WebsiteConfiguration:
RoutingRules:
-
RedirectRule:
Hostname: ${HOSTNAME HERE}
HttpRedirectCode: 302
RoutingRuleCondition:
HttpErrorCodeReturnedEquals: 404
Run Code Online (Sandbox Code Playgroud)
$ {HOSTNAME HERE}的显示位置,我需要为无服务器框架生成的API Gateway API的主机名。
现在,我能想到的最好的方法是在某个地方创建一个CNAME别名,并在我的API前面使用它。然后,我将该CNAME作为环境变量传递,然后在此文件中引用它。不过这对我来说并不理想。我希望有人能够将这个项目拉下来,并能够仅使用存储桶名称来运行它。反正有做到这一点吗?
amazon-web-services aws-cloudformation aws-api-gateway serverless-framework serverless-architecture
当我尝试通过serverless-domain-manager设置域时sls create_domain,它失败了:
BadRequestException:您提供的域名已与现有CloudFront分配相关联.从现有CloudFront分配中删除域名或使用其他域名.如果您拥有此域名且未在现有CloudFront分配中使用该域名,请与支持部门联系.没有创建api.example.com.
请注意,我的帐户在CloudFront中没有任何内容.这是我打开它时看到的:
在Associated Resources下我可以看到cloudfront的条目: arn:aws:cloudfront:: ...
amazon-web-services amazon-cloudfront amazon-route53 serverless-framework
有没有办法将无服务器框架中的资源定义拆分为多个文件?就像是:
resources:
- ${resources/base.yml}
- ${resources/foo.yml}
Run Code Online (Sandbox Code Playgroud)
我一直在尝试多种组合,但是我不断遇到关于找不到引用的错误。
我编写了一个lambda函数,它返回S3 Buckets中文档的预签名URL.
代码非常简单:
const url = s3.getSignedUrl('getObject', {
Bucket: BUCKET_NAME,
Key: myFile.Key,
Expires: 20
})
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({
"url": url
}),
};
Run Code Online (Sandbox Code Playgroud)
有趣的是当我在本地调用此函数(使用无服务器框架)时,如下所示:
sls invoke local -f getEconomyFile -d '{ "queryStringParameters": { "key": "myfile.pdf" } }'
Run Code Online (Sandbox Code Playgroud)
它的工作原理!我有一个网址给我文件.
但是当我部署到AWS Lambda时,该函数返回一个URL,该URL总是在文件上显示"access denied":
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>93778EA364B3506B</RequestId>
<HostId>
yqnPC0SeIVE3/Pl7/d+xHDJ78=
</HostId>
</Error>
Run Code Online (Sandbox Code Playgroud)
为什么它在本地工作而未部署?
谢谢 !
我一直在四处走动,但不清楚该怎么做。
我有一个简单的表,我想在其中对几列进行查询。据我了解,这意味着为要查询的每一列创建二级索引。我已经使用Serverless框架定义了表,serverless.yml并且收到了各种奇怪的错误消息。
当前的serverless.yml定义是:
resources:
Resources:
MessagesDynamoDBTable:
Type: 'AWS::DynamoDB::Table'
Properties:
AttributeDefinitions:
- AttributeName: messageId
AttributeType: S
- AttributeName: room
AttributeType: S
- AttributeName: userId
AttributeType: S
KeySchema:
- AttributeName: messageId
KeyType: HASH
- AttributeName: userId
KeyType: RANGE
LocalSecondaryIndexes:
- IndexName: roomIndex
KeySchema:
- AttributeName: room
KeyType: HASH
Projection:
ProjectionType: "KEYS_ONLY"
- IndexName: userId
KeySchema:
- AttributeName: userId
KeyType: HASH
Projection:
ProjectionType: "KEYS_ONLY"
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
TableName: ${self:custom.tableName}
Run Code Online (Sandbox Code Playgroud)
它的意思是类似于Slack服务-因此我想查询房间,用户等的条目。
根据我已经找到的文档,此定义很有意义。一个应该为索引中使用的列声明属性,而我已经这样做了。KeySchema-我确实只需要messageId字段,但是一条错误消息表明它需要RANGE索引,因此我将userId字段添加到KeySchema中只是为了关闭它。根据我已经找到的文档,二级索引字段看起来正确。
有了这个定义,当尝试使用 serverless deploy
An error occurred: …Run Code Online (Sandbox Code Playgroud) amazon-dynamodb serverless-framework dynamodb-queries amazon-dynamodb-index