标签: serverless

java - 一旦由 Lambda/Serverless 部署,就无法删除 JSON 中的“\”字符

我正在创建一个 API(用 Java 编写),我通过无服务器部署该 API,该端口连接到 AWS Lambda 函数。API 函数的所有方面都很棒,除了返回的请求在所有引号前面包含“\”字符这一事实之外。

为了正确地看待这一点,我有一个 person 类,其中包含名称(字符串)和心情(字符串)的实例变量。然后我的类使用此类来获取并创建一个 Person 对象,然后使用 Jackson 将其解析为 JSON 格式。这是返回到处理函数(对于 lambda)的内容,并显示为“对象主体”。

public class Person{
    String name;
    String mood;
    //getters and setters and constructor
}
Run Code Online (Sandbox Code Playgroud)

然后,稍后在不同的班级中会有一些东西,比如

Person person = new Person("bob", "good");
Run Code Online (Sandbox Code Playgroud)

它将被传递到我的方法中,该方法应该将内容转换为 JSON:

private String convStrToJson(Person person) throws JsonProcessingException {

    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(person);
    return json;

}
Run Code Online (Sandbox Code Playgroud)

如果我要在输出中打印此内容,我会得到类似以下内容的信息:

{"name":"bob","mood":"good"}
Run Code Online (Sandbox Code Playgroud)

这就是我想要和期待的。但是,当通过 GET 请求部署和调用时,结果是:

"{\"name\":\"bob\",\"mood\":\"good\"}"
Run Code Online (Sandbox Code Playgroud)

我尝试了几种策略,包括添加解析方法,例如:

json = json.replace("\"", "");
Run Code Online (Sandbox Code Playgroud)

这会从两个输出中完全删除引号,或者:

json = json.replace("\\","");
Run Code Online (Sandbox Code Playgroud)

这根本没有任何影响。我还尝试了这两种方法作为 ReplaceAll 方法,但这只会让事情变得更加混乱。我不知道我还能做什么来摆脱这些“\”字符,我明白它们为什么在那里,但我不知道如何阻止它。如有任何帮助,我们将不胜感激。

java lambda json amazon-web-services serverless

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

使用不同的 yml 文件名部署无服务器 AWS 提供商

我有两种不同的无服务器配置。一种是 STAGE 配置,另一种是 SHARED 配置。

每个阶段必须具有相同的共享资源。

所以我有两个 YML 文件:

  • 无服务器.yml
  • 无服务器.shared.yml

如何调用node serverless命令来部署“serverless.shared.yml”配置文件?

amazon-web-services node.js serverless

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

如何从无服务器 cli 设置 Cloudformation 完全访问权限

我可以通过编程访问 aws 帐户,当我尝试部署基本功能时,我得到:

用户:arn:aws:iam::xxxx:user/myname 无权对资源执行:cloudformation:DescribeStacks:arn:aws:cloudformation:eu-west-1:xxxxxx:stack/hello-world-dev/*

我检查了我的密钥,它们是正确的,我假设我的用户没有 cloudformation 访问权限。

我的问题是,是否可以在 yaml 文件中设置我的用户的权限?例如cloudformation完全访问、lambda完全访问等。

您可以在下面找到我的 functiona 和 yaml 文件:

处理程序.js

module.exports.helloWorld = (event, context, callback) => {
  const response = {
    statusCode: 200,
    headers: {
      'Access-Control-Allow-Origin': '*', // Required for CORS support to work
    },
    body: JSON.stringify({
      message: 'Go Serverless v1.0! Your function executed successfully!',
      input: event,
    }),
  };

  callback(null, response);
};
Run Code Online (Sandbox Code Playgroud)

无服务器.yaml

service: hello-world

provider:
  name: aws
  runtime: nodejs8.10
  region: eu-west-1
  # iamRoleStatements:
  #   - Effect: "Allow"
  #     Action:
  #      - cloudformation: …
Run Code Online (Sandbox Code Playgroud)

node.js aws-cloudformation aws-lambda serverless aws-serverless

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

SNS 订阅不是使用 Serverless 创建的

我有一个无服务器项目,应该部署一个队列,将该队列订阅到现有主题,并使用 lambda 来处理队列中的消息。这是我的 yaml:

service: "ssul-${opt:branch}"

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

functions:
  update:
    reservedConcurrency: 10
    handler: index.update
    events:
    - sqs:
        arn: {Fn::GetAtt: [Queue, Arn]}
        batchSize: 1

resources:
  Resources:
    Queue:
      Type: "AWS::SQS::Queue"
      Properties:
        MessageRetentionPeriod: 10800
        VisibilityTimeout: 900
        QueueName: "updates-${opt:branch}"
    Subscription:
      Type: "AWS::SNS::Subscription"
      Properties:
        TopicArn: "${env:TOPIC_ARN}"
        Protocol: sqs
        Endpoint:
          Fn::GetAtt: [Queue, Arn]
Run Code Online (Sandbox Code Playgroud)

我运行sls deploy --branch master返回正常,除了订阅之外的所有内容都已部署。该主题位于不同的帐户中,但我能够创建一个队列并通过控制台手动订阅它。我究竟做错了什么?

amazon-sns aws-lambda serverless

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

警告 - 部署后未设置 cfnRole 和创建不必要的文件

部署后没有 cfnRole 警告和不必要的文件被创建

Serverless: Safeguards Processing...
Serverless: Safeguards Results:

   Summary --------------------------------------------------

   passed - no-unsafe-wildcard-iam-permissions
   passed - framework-version
   warned - require-cfn-role
   passed - allowed-runtimes
   passed - no-secret-env-vars
   passed - allowed-regions
   passed - allowed-stages

   Details --------------------------------------------------

   1) Warned - no cfnRole set
      details: http://slss.io/sg-require-cfn-role
      Require the cfnRole option, which specifies a particular role for CloudFormation to assume while deploying.
Run Code Online (Sandbox Code Playgroud)
  1. 我去过详细写的网站。详情:http : //slss.io/sg-require-cfn-role 反正我不知道怎么解决。
  2. s_hello.py & s_hello2.py 总是在部署后生成。这是我的 serverless.yaml 文件
    service: myapp
    app: sample-app
    org: xxx
    provider:
      name: aws
      runtime: python3.7
    stage: …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services python-3.x aws-cloudformation aws-lambda serverless

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

DynamoDB 记录未通过地图循环添加

我正在使用 Axios 从 API 获取价格(通常为数千),然后想将其存储在 DynamoDB 中。如果我在本地调用 lambda 函数,一切都会按预期工作,但如果我部署该函数并使用 AWS CLI 调用它,则它不再在 DynamoDB 中存储任何值。我在请求中收到的数据以及来自 Axios 调用的响应是相同的。

我以某种方式认为这是调用 DynamoDB 的异步函数的范围问题,但我无法解决它。期待您的建议。如果您需要更多代码,请告诉我。

更新价格.js

import { updatePrice } from "./libs/pricing-lib";
import {
    success,
    failure
} from "./libs/response-lib";

export async function main(event, context) {
    try {
        let result = await updatePrice(event.pathParameters.id, event.pathParameters.date);
        return success(result);
    } catch(e) {
        return failure(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

dynamodb-lib-js

import AWS from "aws-sdk";
export function call(action, params) {
    const dynamoDb = new AWS.DynamoDB.DocumentClient();
    return dynamoDb[action](params).promise();
}
Run Code Online (Sandbox Code Playgroud)

定价-lib.js

export async function updatePrice(stockid, from) …
Run Code Online (Sandbox Code Playgroud)

node.js amazon-dynamodb aws-lambda serverless

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

如何使用 localstack 部署 SAM 堆栈?

我编写了一个 SAM 堆栈,我可以在 AWS 上构建、打包和部署它。我也可以使用 start-local 或 invoke 来测试。现在我需要测试其他 AWS 资源。我已将这些资源添加到我的 SAM 模板中。它在 AWS 上运行良好,但我正在寻找一种在 localstack(例如本地 dynamodb)中部署我的 SAM 堆栈的方法。现在我必须使用 CLI 创建资源,然后我可以部署我的 SAM 堆栈(在这种情况下只有 lambda,API GW)。我怎样才能做到这一点?

sam amazon-web-services serverless localstack

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

AWS:无法导入模块“处理程序”:没有名为“numpy”的模块

AWS 新手在这里

我必须通过 gitlab CI 作为 lambda 托管我的 python 脚本,并通过 AWS 上的 cloudwatch 触发它。

我正在学习以下教程:

  1. https://docs.gitlab.com/ee/user/project/clusters/serverless/aws.html
  2. https://serverless.com/blog/serverless-python-packaging/

在第一个教程中,我只获取该.gitlab-ci.yml文件并将其添加到第二个教程中显示的教程中(但我选择 3.7 作为运行时而不是 python 3.6)

我有以下serverless.yml文件

service: numpy-test

provider:
  name: aws
  runtime: python3.7

functions:
  numpy:
    handler: handler.main

plugins:
  - serverless-python-requirements

custom:
  pythonRequirements:
    dockerizePip: non-linux

package:
  exclude:
    - venv/**
Run Code Online (Sandbox Code Playgroud)

和以下.gitlab-ci.yml文件:

service: numpy-test

provider:
  name: aws
  runtime: python3.7

functions:
  numpy:
    handler: handler.main

plugins:
  - serverless-python-requirements

custom:
  pythonRequirements:
    dockerizePip: non-linux

package:
  exclude:
    - venv/**
Run Code Online (Sandbox Code Playgroud)

当我推送.gitlab-ci.yml文件时,它运行没有任何错误。

在此处输入图片说明

我可以看到在我的 AWS lambda …

python amazon-web-services gitlab serverless-framework serverless

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

如何在无服务器中为一个处理程序定义多个路径?

我一直在尝试和在线搜索,但无法找到回复。是否可以使用无服务器框架实现以下目标:

我想使用get.handler具有以下定义的代码来获取一个项目和获取所有项目。所以:

  • 如果我点击api.example.com/items/我检索所有项目
  • 如果我打api.example.com/items/1234我检索项目id = 1234
 - get_items:
    handler: project/items/get.handler
    events:
      - http:
          path: items/{itemId}
          method: get
Run Code Online (Sandbox Code Playgroud)

到目前为止get.handler我检查event.pathParameters? event.pathParameters.itemId : null特定项目是否存在并调用某个getItem(itemdId)函数,如果它不存在,则调用一个getAll()函数。

如果我在它工作的路径中传递项目 id,但是当我发出请求时,api.example.com/items/我收到以下错误: not a valid key=value pair (missing equal-sign) in Authorization header. 这意味着我的路径有问题,我必须将项目 ID 传递给路径参数。

我的问题是:有没有办法可以在该- http:区域使用多条路径,或者有什么推荐的方法可以解决这个问题(只需创建两个单独的处理程序)?

amazon-web-services serverless-framework serverless

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

AWS Fargate - 如何使用 python boto3 获取任务的公共 IP 地址

我正在使用以下 python 脚本创建新的 fargate 任务。

import boto3
import json


def handler():
  client = boto3.client('ecs')
  response = client.run_task(
  cluster='fargate-learning', # name of the cluster
  launchType = 'FARGATE',
  taskDefinition='fargate-learning:1', # replace with your task definition name and revision
  count = 1,
  platformVersion='LATEST',
  networkConfiguration={
        'awsvpcConfiguration': {
            'subnets': [
                'subnet-0a024d8ac87668b64', # replace with your public subnet or a private with NAT
            ],
            'assignPublicIp': 'ENABLED'
        }
    })

  print(response)
  return str(response)


if __name__ == '__main__':
    handler()
Run Code Online (Sandbox Code Playgroud)

这是我从 boto3 得到的回应。

https://jsonblob.com/5faf3ae6-bc31-11ea-8cae-53bd90c38587

尽管脚本正在分配公共 ip 地址,但我无法在响应中看到公共 ip 地址,我可以在网站上看到它。

aws fargate ip 地址

那么,如何使用 …

amazon-web-services amazon-ecs boto3 serverless aws-fargate

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