我正在创建一个 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 方法,但这只会让事情变得更加混乱。我不知道我还能做什么来摆脱这些“\”字符,我明白它们为什么在那里,但我不知道如何阻止它。如有任何帮助,我们将不胜感激。
我有两种不同的无服务器配置。一种是 STAGE 配置,另一种是 SHARED 配置。
每个阶段必须具有相同的共享资源。
所以我有两个 YML 文件:
如何调用node serverless命令来部署“serverless.shared.yml”配置文件?
我可以通过编程访问 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
我有一个无服务器项目,应该部署一个队列,将该队列订阅到现有主题,并使用 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返回正常,除了订阅之外的所有内容都已部署。该主题位于不同的帐户中,但我能够创建一个队列并通过控制台手动订阅它。我究竟做错了什么?
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)
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
我正在使用 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) 我编写了一个 SAM 堆栈,我可以在 AWS 上构建、打包和部署它。我也可以使用 start-local 或 invoke 来测试。现在我需要测试其他 AWS 资源。我已将这些资源添加到我的 SAM 模板中。它在 AWS 上运行良好,但我正在寻找一种在 localstack(例如本地 dynamodb)中部署我的 SAM 堆栈的方法。现在我必须使用 CLI 创建资源,然后我可以部署我的 SAM 堆栈(在这种情况下只有 lambda,API GW)。我怎样才能做到这一点?
AWS 新手在这里
我必须通过 gitlab CI 作为 lambda 托管我的 python 脚本,并通过 AWS 上的 cloudwatch 触发它。
我正在学习以下教程:
在第一个教程中,我只获取该.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
我一直在尝试和在线搜索,但无法找到回复。是否可以使用无服务器框架实现以下目标:
我想使用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:区域使用多条路径,或者有什么推荐的方法可以解决这个问题(只需创建两个单独的处理程序)?
我正在使用以下 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 地址,我可以在网站上看到它。
那么,如何使用 …
serverless ×10
aws-lambda ×4
node.js ×3
amazon-ecs ×1
amazon-sns ×1
aws-fargate ×1
boto3 ×1
gitlab ×1
java ×1
json ×1
lambda ×1
localstack ×1
python ×1
python-3.x ×1
sam ×1