标签: aws-serverless

无服务器yml上的CORS

我有一个React应用程序,试图从AWS访问无服务器。但是我有下面的错误

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://www.test.com' is therefore not allowed access. The response had HTTP status code 502.
Run Code Online (Sandbox Code Playgroud)

端点网址为https://key.execute-api.ap-southeast-2.amazonaws.com/dev/samplefunction

在serverless.yml上的设置是

login:
    handler: login.login
    events:
      - http:
          path: login
          method: post
          cors:
            origin: 'https://admin.differentdomain.com'
            headers:
              - MY_CUSTOM_HEADER
              - Content-Type
              - X-Amz-Date
              - Authorization
              - X-Api-Key
              - X-Amz-Security-Token
Run Code Online (Sandbox Code Playgroud)

我还有其他地方需要进行CORS配置吗?

serverless-framework serverless aws-serverless

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

AWS SAM(无服务器架构模式)与无服务器框架之间有什么区别?

我们正在研究项目,我们正在努力在nodejs中构建无服务器应用程序。我谈到了AWS SAM和Serverless。哪个最适合实现无服务器应用程序

amazon-web-services serverless-framework aws-serverless

7
推荐指数
2
解决办法
1886
查看次数

在无服务器框架中禁用SLS_DEBUG =*

使用无服务器框架(在Mac OS X High Sierra上)时,SLS_DEBUG环境变量设置为启用详细的调试信息

export SLS_DEBUG=*
Run Code Online (Sandbox Code Playgroud)

问题:现在如何禁用它(除了转移到新终端)?export SLS_DEBUG=false没有做到这一点.

macos serverless-framework serverless-architecture serverless aws-serverless

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

无服务器API网关将请求转换为base64

我有一个无服务器的应用程序,它将文件上传到s3(通过POST请求)并为它们提供服务(通过GET请求)

我正在使用serverless-apigw-binaryserverless-apigwy-binary插件允许我以图像的形式返回二进制数据.为了允许URL与浏览器一起使用,我必须将二进制类型设置为*/*.

为了上传图像,POST端点采用类似{"base64":"..."}的正文.但是,使用此配置,整个主体将作为base64编码的字符串传递.如何防止请求体application/json被转换?

serverless.yml下文:

service: image-service

custom:
  envName: ${opt:stage, self:provider.stage}
  domains:
    prod: api.<mydomain>
    dev: dev-api.<mydomain>
  customDomain:
    basePath: images
    domainName: ${self:custom.domains.${self:custom.envName}}
    certificateName: "*.<mydomain>"
  apigwBinary:
    types:
      - '*/*'

provider:
  name: aws
  runtime: nodejs8.10
  region: eu-west-1
  memorySize: 1536

  role: ImageRenderingRole

  environment:
    ENV_NAME: ${self:custom.envName}
    APP_NAME: image-service
    BUCKET: <mybucket>

plugins:
  - serverless-offline
  - serverless-domain-manager
  - serverless-apigw-binary
  - serverless-apigwy-binary

functions:
 uploadImage:
   handler: handler.uploadImage
   events:
     - http:
      path: /
      method: POST

  getImage:
    handler: handler.getImage
    events:
      - http: …
Run Code Online (Sandbox Code Playgroud)

aws-api-gateway serverless-framework aws-serverless

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

从 AWS Lambda 提供 zip 文件

我需要一个端点(无服务器)来为压缩在 zip 文件中的一系列文件提供服务。为此,我使用node-zip。这可以在本地创建一个带有平面文件文本的简单 zip 文件:

const fs = require('fs')
const zip = new require('node-zip')()

const flat_text = 'This is a flat text file'

zip.file('a_file.txt', flat_text)
fs.writeFileSync('/tmp/a_file.zip', zip.generate({base64: false, compression: 'DEFLATE'}), 'binary')
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在 lambda 中实现它时,下载的 zip 文件已损坏:

module.exports.weekly = async (event, context) => {
    const flat_text = 'This is a flat text file'
    zip.file('a_file.txt', flat_text)
    return {
        headers: {
            'Content-Type': 'application/zip, application/octet-stream',
            'Content-disposition': `attachment; filename=${`any_name_${new Date().toJSON().slice(0, 10)}.zip`}`
        },
        body:  zip.generate({base64: false, compression: 'DEFLATE'}),
        statusCode: 200
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我会收到损坏的 zip …

amazon-web-services node.js aws-serverless

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

IntelliJ + AWS Toolkit + 无服务器应用程序:“必须能够在项目中找到处理程序才能部署到 Lambda”

我使用 HelloWorld 样式模板应用程序在 IntelliJ 中创建了一个新的无服务器项目。我设法在我的 AWS 账户中远程构建、部署和运行了这个应用程序。我什至设法将它与 API 网关集成,以便通过 Internet 访问它。

随着项目的建立,它有 1 个名为 HelloWorldFunction 的 Lambda 函数。它的处理程序称为“helloworld.App::handleRequest”,我可以在 template.yaml 文件中看到它的配置。

现在我想在同一个应用程序项目中创建另一个 Lambda 函数。因此,在 IntelliJ 中,我遵循以下步骤:

  • AWS Explorer > Lambda
  • 右键单击 Lambda
  • 单击“创建新的 AWS Lambda ...”
  • 输入函数名称(例如 MyNewLambdaFunction)
  • 输入运行时(Java 8)和 S3 存储桶以及 IAM 角色(一切正常)
  • 然后我需要输入“处理程序”的名称,这就是我的问题开始的地方

我在这里尝试了不同的名称,例如“MyNewHandler”或“helloworld.App::handleRequest”(显然这不起作用,因为它已被HelloWorldFunction 使用)、“helloworld.App2::handleRequest”、.. .. 等等。

每次我尝试使用其他名称或方式来定义处理程序时,都会收到以下错误消息:

必须能够在项目中找到处理程序才能部署到 Lambda

题:

我是否需要先在 template.yaml 文件中配置新的 Lambda 函数,或者我需要怎样调用 Handler 才能使其工作?

我确信这只是一个菜鸟错误,但我一直在谷歌上搜索这个并没有找到任何遇到同样问题的人。我还在 AWS 上阅读了有关处理程序的内容,但它仅在概念层面对其进行了描述,而不是在有多个 Lambda 的实践中进行了描述。

谢谢你的帮助!

安迪

intellij-idea aws-lambda aws-serverless

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

AWS SAM - 通过 SAM 模板在 API 网关方法中强制执行请求验证

我正在开发一个 SAM 应用程序,该应用程序具有 lambda 函数,并以 API 网关作为事件源。API 端点是一种 POST 方法,需要在请求正文中提供一组参数。API Gateway 为我们提供了通过使用 AWS 控制台指定请求模型来验证请求正文的功能。

请参阅下面的 AWS 控制台选项屏幕截图:

在此输入图像描述

在此输入图像描述

我需要通过 SAM 模板设置类似的选项,并能够将模型与请求正文链接,但无法设置请求验证器选项,也无法找到任何文档或示例。

以下是我的 SAM 模板

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Description: SAM Template

Parameters: 
  Stage: 
    Type: String
    Default: dev

Resources:
  MyApiGateway:
    Type: AWS::Serverless::Api
    Properties:
      Name: My AWS Serverless API
      StageName: !Ref Stage
      Models: 
        ExchangeRate: 
          $schema: "http://json-schema.org/draft-04/schema#"
          properties: 
            base: 
              type: string
            target: 
              type: string
          required: 
            - base
            - target
          title: User
          type: object

  ExchangeRateFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: functions/exchange-rate/
      Handler: …
Run Code Online (Sandbox Code Playgroud)

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

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

如何获取相对 package.json 依赖项以在 Windows 上使用 AWS 的 sam build 命令?

我的目标是使用层在我们的几个 lambda 函数之间共享库代码,并能够在本地调试和运行测试。

npm 能够从本地文件系统安装依赖项。当我们更改库代码时,我们希望该库的所有用户都能获取更新的代码,而无需设置专用的 npm 服务器。我可以使用相对路径在本地进行调试,但那是在我涉及sam build. sam build在存储库的根目录创建一个隐藏文件夹并构建该文件夹并最终运行npm install,但是这次文件夹结构不同。文件中使用的相对路径package.json现在已损坏。我们不能使用显式路径,因为我们的存储库位于用户文件夹下,这当然对于不同的开发人员来说是不同的。

这就是我所做的:

我使用创建了一个项目sam init,并采用了项目的默认值(除了 的名称sam-app-2nodejs 12.x(选项11)。

该命令创建了一个名为 的文件夹sam-app-2,它是以下所有文件名的引用。

我创建了一个dependencies/nodejs文件夹。

我添加dep.js到该文件夹​​:

exports.x = 'It works!!';
Run Code Online (Sandbox Code Playgroud)

我还添加package.json到同一文件夹:

{
  "name": "dep",
  "version": "1.0.0",
  "description": "",
  "main": "dep.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
Run Code Online (Sandbox Code Playgroud)

在 hello-world(包含 …

amazon-web-services node.js npm aws-serverless

7
推荐指数
2
解决办法
8940
查看次数

您如何在 serverless.yml 文件中引用函数 (Lambda) 的函数 ARN?

考虑 serverless.yml 文件上的这个 lambda 函数:

functions:
  s3toEc2Lambda:
    handler: s3toec2lambda.S3toEc2Lambda
    name: "${self:service}-s3toEc2Lambda"
    role: S3toEc2LambdaRole
Run Code Online (Sandbox Code Playgroud)

并考虑在资源部分创建的这个 SNS:有人知道如何从 lambda 函数 s3toEc2Lambda 通知 Sns ARN 端点吗?

resources:
  Resources:
    WordpressFrontEndSnsS3toEc2:
      Type: AWS::SNS::Topic
      Properties:
        TopicName: "wordpress-front-end-s3-ec2"

    WordpressFrontEndSnsS3toEc2Lambda:
      Type: AWS::SNS::Subscription
      Properties:
        Endpoint: { "Fn::GetAtt": ["s3toEc2Lambda", "Arn" ] }                    <------ HERE    <------
        #Endpoint: ${self:functions.s3toEc2Lambda}                               <------ OR HERE <------
        #Endpoint: { "Fn::GetAtt": ["${self:functions.s3toEc2Lambda}", "Arn" ] } <------ OR HERE <------
        Protocol: lambda
        TopicArn: !Ref 'WordpressFrontEndSnsS3toEc2'
Run Code Online (Sandbox Code Playgroud)

对我来说总是出现这样的错误消息:“模板错误:Fn::GetAtt 的实例引用未定义的资源 s3toEc2Lambda”

谢谢你 !

amazon-web-services amazon-sns aws-lambda aws-serverless aws-cloudformation-custom-resource

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

预配置并发对 Lambda 函数的响应时间影响较小

我们使用无服务器架构以及 AWS Lambda 和 API 网关。lambda 的执行时间在几毫秒范围内客户端的最终响应在几秒钟内收到(这远远超过了 lambda 的执行时间,即使考虑到冷启动场景也考虑了 init 持续时间)。

\n

在使用 API 网关日志进行调试时,会出现以秒为单位的集成延迟,这使得端到端响应相当慢。为了消除初始化持续时间或冷启动,我在 CloudWatch 中添加了规则,用于定期调用 lambda 以使它们保持温暖。

\n

初始化持续时间被完全删除,这也有助于减少集成延迟。有些 Lambda 无法安排,因为调用它们需要身份验证,为此我添加了 5 的预配置并发。

\n

该 Lambda 在日志中也有初始化持续时间。Lambda 配置是消除冷启动的另一种选择,但这不会对 API 网关上 Lambda 响应可用的时间产生影响。

\n

我已按照以下链接将预配置并发分配给 Lambda:

\n\n

我添加了配置的 Lambda 的 CloudWatch 日志:

\n

Duration: 1331.38 ms Billed Duration: 1332 ms Memory Size: 256 MB Max Memory Used: 130 MB Init Duration: 1174.18 ms

\n

我在 …

aws-lambda aws-api-gateway aws-serverless

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