我正在尝试在 AWS 基础设施上使用无服务器部署现有的 Node js 应用程序。
我的 yaml 是这样的:
service: todo-app-api
provider:
name: aws
runtime: nodejs10.x
functions:
app:
handler: server.run
events:
- http:
path: /
method: ANY
cors: false
- http:
path: /{proxy+}
method: ANY
cors: false
plugins:
- serverless-offline
Run Code Online (Sandbox Code Playgroud)
SLS 部署工作正常,并且可以很好地创建 lambda 和其他资源。但是当调用获取内部服务器错误时,当我看到 aws 日志时,它给出的错误详细信息为
"errorType": "Error",
"errorMessage": "Unsupported framework",
"stack": [
"Error: Unsupported framework",
" at getFramework (/var/task/node_modules/serverless-http/lib/framework/get-framework.js:69:9)",
" at module.exports (/var/task/node_modules/serverless-http/serverless-http.js:14:21)",
" at Object.<anonymous> (/var/task/server.js:31:22)",
" at Module._compile (internal/modules/cjs/loader.js:778:30)",
" at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)",
" at Module.load (internal/modules/cjs/loader.js:653:32)", …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置 CodePipeline 来管理一个非常简单的 Lambda 函数的部署。
我完全陷入了部署步骤的问题,无法弄清楚可能出了什么问题。
当管道尝试运行 CodeDeploy 操作时,它失败并显示错误...
BundleType must be either YAML or JSON
这是我的应用程序规范...
version: 0.0
Resources:
- my-function:
Type: AWS::Lambda::Function
Properties:
Name: "my-function"
Run Code Online (Sandbox Code Playgroud)
我的管道没有构建步骤,因为它只是一个简单的 js 文件,没有依赖项,因此不需要构建。
我尝试添加一个操作来部署到 S3,我可以确认发送到 s3 的 zip 文件包含 appspec.yml 和 index.js,并且它们都位于根目录中。
我见过的大多数示例都使用构建规范,但我不确定为什么我需要这个,或者如果我有一个它会做什么。
我只是用无服务器端点来检查一些令牌。假设路径是“/checktoken”。并且只想使用我的 Ip 地址访问它,这就是为什么将我的 Lambda 连接到 VPC(2 个私有子网和安全组)。
但问题是,即使我使用我的 IP 地址将安全组入/出站规则设置为 https,我也可以向具有不同 IP 地址的端点发出请求。
我使用 AWS = CloudFront + Route53 作为 DNS,使用 Lambda + Api Gateway 作为端点。
我在 Api 网关中使用资源策略创建了一个白名单 IP,该 IP 有效,但这不是我想要的解决方案。
所需的解决方案是 vpc 的安全组应仅允许来自其规则中白名单 IP 的请求。
我无法再在 AWS Lambda 中上传新代码,因为它呈灰色。
我是帐户持有人,因此应该拥有所有权利。有谁知道这可能是什么原因造成的?
是否有可能 NodeJS 8.10 的功能不再受支持,我需要创建一个新功能?
我有一个与 Lambda 函数集成的 API 网关(HTTP 类型)。我试图从本地主机调用该函数,如下所示:
const jwt = getAuthToken();
const formBody = new FormData();
formBody.set('user', 'test');
const res = await fetch('https://example.execute-api.eu-west-1.amazonaws.com/default/GetShareValue', {
method: 'POST',
body: formBody,
headers: {
'Authorization': jwt
}
});
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误消息:
从源“http://localhost:3000”获取“https://example.execute-api.eu-west-1.amazonaws.com/default/GetShareValue”的访问已被 CORS 策略阻止:对预检的响应请求未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明响应满足您的需求,请将请求模式设置为“no-cors”以在禁用 CORS 的情况下获取资源。
我了解不正确的 CORS 设置将阻止浏览器显示 Lambda 函数返回的内容。但是,我的 API 网关指定了 CORS 设置:
根据此线程,在 Lambda 函数的响应中设置标头非常重要。我已将它们设置为相同。这是我的 Lambda 函数:
exports.handler = async (event, context) => {
let body;
let statusCode = '200';
const headers = {
'Content-Type': 'application/json',
"Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,X-Amz-Security-Token,Authorization,X-Api-Key,X-Requested-With,Accept,Access-Control-Allow-Methods,Access-Control-Allow-Origin,Access-Control-Allow-Headers",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "*",
"X-Requested-With": …Run Code Online (Sandbox Code Playgroud) 我正在使用 S3 上传管理器将大文件上传到 S3。
if _, err := uploader.UploadWithContext(ctx, &s3manager.UploadInput{
Bucket: aws.String(s.Config.GetS3ExportBucket()),
Key: aws.String(key),
Body: bytes.NewReader(buf.Bytes()),
ContentEncoding: aws.String("gzip"),
ContentType: aws.String("application/json"),
}); err != nil {
return fmt.Errorf("failed to upload file, %w", err)
}
Run Code Online (Sandbox Code Playgroud)
根据此AWS 文档,我也向我的 lambda 提供了权限。
#Created Policy for IAM Role
resource "aws_iam_policy" "s3_write_policy" {
name = "${local.namespace}-s3-write-access"
description = "Allow Lambda to access s3 where back will be written"
policy = data.aws_iam_policy_document.s3_write_policy.json
}
data "aws_iam_policy_document" "s3_write_policy" {
statement {
sid = "WriteObjectActions"
effect = "Allow"
actions …Run Code Online (Sandbox Code Playgroud) 我想在 C# Lambda 调用之间使用缓存,我知道如果 Lambda 从冷启动,这是不可能的,但如果在短时间内被多次调用,我们可以使用缓存。
我尝试过创建一个静态变量,但这似乎在每次调用后都会重新初始化?
有人有主意吗?下面是一个示例,我希望每次将 TestCache 变量增加 1,但这总是返回 1。
using Amazon.Lambda.APIGatewayEvents;
using Amazon.Lambda.Core;
using System.Collections.Generic;
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
namespace MyTestLambda
{
public class Global
{
private readonly Dictionary<string, string> allOriginHeaders = new Dictionary<string, string>
{
{ "Access-Control-Allow-Origin", "*" }
};
public static int TestCache = 0;
public APIGatewayProxyResponse Handler(APIGatewayProxyRequest apigProxyEvent)
{
TestCache += 1;
return new APIGatewayProxyResponse
{
Body = TestCache.ToString(), …Run Code Online (Sandbox Code Playgroud) 我已经设置了与 SQS 的 lambda 集成,并具有固定的保留并发性,以限制对后端服务的请求。我需要使用 DLQ 来跟踪和存储错误。
使用 SQS 的重新驱动策略与 lambda 函数的 DeadLetterConfig 之间的行为有何差异?
我对队列中有大量消息但 lambda 并发性有限时的行为特别感兴趣。
我正在创建定义我们的产品环境的模板。在我们的系统中,我们将使用许多 Lambda,它会生成巨大的 Cloudformation 模板文件,其中包含许多(甚至是大量的)条目,如下所示。可以将一个模板文件拆分为多个单独的文件(例如,一个文件用于一项功能,或者至少一个文件用于一项服务)。我知道有子堆栈机制,但在子堆栈中我无法将函数定义存储在本地文件中(我只能给出模板 URL),并且我不确定是否可以将参数传递给子堆栈。正如下面的示例所示,有许多参数和对其他资源的引用。
APILambadFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: ../lambda_functions/
Handler: getUserInfo.lambda_handler
FunctionName: !Sub ${CreatorUsername}-getUserInfo
Runtime: python3.7
VpcConfig:
SecurityGroupIds:
- !Ref SecurityGroupLamda
SubnetIds:
- !Ref PrivateSubnet1
- !Ref PrivateSubnet2
Role:
Fn::GetAtt: [ RoleLamdaRestAPI, Arn ] # Rola dla wszystkich Lamd restowych
Environment:
Variables:
DB_HOST: !GetAtt 'PostgresDB.Endpoint.Address'
DB_PORT: !GetAtt 'PostgresDB.Endpoint.Port'
DB_NAME: !Sub '{{resolve:ssm:/${CreatorUsername}/${EnvType}/PostgresSQL/DBName:1}}'
DB_USERNAME: !Sub '{{resolve:ssm:/${CreatorUsername}/${EnvType}/PostgresSQL/Username:1}}'
CREATOR_USERNAME: !Ref CreatorUsername
ENV_TYPE: !Ref EnvType
Events:
GetUserInfo:
Type: Api
Properties:
Path: /user
Method: get
RestApiId: !Ref ApiGatewayApi
Run Code Online (Sandbox Code Playgroud) 我有一个提供配置对象的 AWS lambda 函数。每当更新此 lambda 函数(即再次部署)时,我都需要触发另一个 lambda 函数,该函数检测这些配置对象中的更改并采取一些操作。如何监控此 lambda 部署,我需要订阅哪个云监视事件?
aws-lambda ×10
amazon-s3 ×1
amazon-sqs ×1
amazon-vpc ×1
aws-sam ×1
c# ×1
cors ×1
go ×1
serverless ×1
terraform ×1