标签: aws-lambda

无服务器 Nodejs 应用程序在调用时出现错误“不支持的框架”

我正在尝试在 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)

amazon-web-services aws-lambda serverless

1
推荐指数
1
解决办法
3776
查看次数

AWS:CodeDeploy for Lambda 无法读取应用程序规范

我正在尝试设置 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,并且它们都位于根目录中。

我见过的大多数示例都使用构建规范,但我不确定为什么我需要这个,或者如果我有一个它会做什么。

aws-lambda aws-codepipeline aws-codebuild

1
推荐指数
1
解决办法
1756
查看次数

如何使用 vpc 安全组来限制对 Lambda 的入站访问?

我只是用无服务器端点来检查一些令牌。假设路径是“/checktoken”。并且只想使用我的 Ip 地址访问它,这就是为什么将我的 Lambda 连接到 VPC(2 个私有子网和安全组)。

但问题是,即使我使用我的 IP 地址将安全组入/出站规则设置为 https,我也可以向具有不同 IP 地址的端点发出请求。

我使用 AWS = CloudFront + Route53 作为 DNS,使用 Lambda + Api Gateway 作为端点。

我在 Api 网关中使用资源策略创建了一个白名单 IP,该 IP 有效,但这不是我想要的解决方案。

所需的解决方案是 vpc 的安全组应仅允许来自其规则中白名单 IP 的请求。

amazon-web-services amazon-vpc aws-lambda

1
推荐指数
2
解决办法
9943
查看次数

无法再在 AWS Lambda 中上传函数代码。选项显示为灰色

我无法再在 AWS Lambda 中上传新代码,因为它呈灰色。

我是帐户持有人,因此应该拥有所有权利。有谁知道这可能是什么原因造成的?

在此输入图像描述

是否有可能 NodeJS 8.10 的功能不再受支持,我需要创建一个新功能?

amazon-web-services aws-lambda

1
推荐指数
1
解决办法
2473
查看次数

尽管已设置标头,但调用 API 网关仍返回 CORS 错误

我有一个与 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)

amazon-web-services cors aws-lambda aws-api-gateway

1
推荐指数
1
解决办法
3290
查看次数

AWS Golang S3 管理器上传:访问被拒绝

我正在使用 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)

amazon-s3 go amazon-web-services aws-lambda terraform

1
推荐指数
1
解决办法
1410
查看次数

您可以缓存一个变量以在 C# AWS Lambda 函数调用之间使用

我想在 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)

c# amazon-web-services aws-lambda

1
推荐指数
1
解决办法
4213
查看次数

SQS Lambda - 重新驱动策略与 DeadLetterConfig

我已经设置了与 SQS 的 lambda 集成,并具有固定的保留并发性,以限制对后端服务的请求。我需要使用 DLQ 来跟踪和存储错误。

使用 SQS 的重新驱动策略与 lambda 函数的 DeadLetterConfig 之间的行为有何差异?

我对队列中有大量消息但 lambda 并发性有限时的行为特别感兴趣。

amazon-sqs amazon-web-services aws-lambda

1
推荐指数
1
解决办法
2183
查看次数

AWS Cloudformation SAM 文件 - 如何拆分为许多较小的文件?

我正在创建定义我们的产品环境的模板。在我们的系统中,我们将使用许多 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-cloudformation aws-lambda aws-sam

1
推荐指数
1
解决办法
3584
查看次数

当部署另一个 lambda 函数时调用 lambda 函数

我有一个提供配置对象的 AWS lambda 函数。每当更新此 lambda 函数(即再次部署)时,我都需要触发另一个 lambda 函数,该函数检测这些配置对象中的更改并采取一些操作。如何监控此 lambda 部署,我需要订阅哪个云监视事件?

amazon-web-services aws-lambda

1
推荐指数
1
解决办法
763
查看次数