我的团队有两个 AWS Lambda,分别用 Golang(1) 和 Java8(2) 编写。Lambda#1 正在向 Lambda#2 发送 JSON 负载;由于 Lambda 中 Golang 的性质,它必须作为字节数组发送。这就是问题开始的地方。我首先声明我的 Java 处理程序,如下所示:
public String handleRequest(String input, Context _context) {}
然而,在调用 Lambda#2 之前,Cloudwatch 日志会指示 JSON 映射错误,指出 START_OBJECT 无法映射到 String。很明显,它在将其传递给 Lambda 之前尝试自己进行一些映射。我接下来尝试的是自定义 POJO:
public String handleRequest(RequestObj input, Context _context){}
然而这也失败了,我相信这是由于 JSON 字符串中的一些转义字符串造成的。所以我想这对我来说归结为两个问题:
根据CW日志,Lambda使用FasterXML的Jackson来映射Lambda输入。有没有办法@JsonProperty在自定义 RequestObject 类中使用注释或类似的东西?文档说:
您不应依赖序列化框架的任何其他功能(例如注释)。
(但它仍然是杰克逊!!)
有没有办法告诉 Lambda 停止尝试映射输入,而只是手动解析原始字节数组?这将解决很多令人头痛的问题,以便能够使用注释进行我们自己的自定义解析。
提前致谢,如果需要,可以提供更多详细信息。
我正在尝试通过设置一个根据示例文档执行 Lambda 函数的 CampaignHook 来为我的 AWS Pinpoint 项目创建一个(测试版)自定义通道。
我的 lambda 函数似乎可以单独正常工作。但是,当我将 CampaignHook 指向 lambda 函数时,我收到此错误:
> aws lambda add-permission --function-name arn:aws:lambda:us-east-1:my-account-id:function:MyFunctionName \
--statement-id s1 \
--action lambda:InvokeFunction \
--principal pinpoint.us-east-1.amazonaws.com \
--source-arn 'arn:aws:mobiletargeting:us-east-1:my-account-id:/apps/my-pinpoint-project-id/campaigns/*'
=>
{
"Statement": "{\"Sid\":\"s1\",\"Effect\":\"Allow\",\"Principal\": {\"Service\":\"pinpoint.us-east-1.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-east-1:my-account-id:function:MyFunctionName\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:mobiletargeting:us-east-1:my-account-id:/apps/my-pinpoint-project-id/campaigns/*\"}}}"
}
> aws pinpoint update-application-settings \
--application-id my-pinpoint-project-id \
--write-application-settings-request '{\"CampaignHook\": { \"LambdaFunctionName\": \"arn:aws:lambda:us-east-1:my-account-id:function:MyFunctionName\", \"Mode\": \"DELIVERY\" }}'
=> An error occurred (BadRequestException) when calling the UpdateApplicationSettings operation: Could not properly invoke Lambda function specified in hook.
Run Code Online (Sandbox Code Playgroud)
我的函数是用 C# 编写的,处理程序的签名是:
> …Run Code Online (Sandbox Code Playgroud) 目前,我正在尝试动态创建eventon a来调用 lambda 函数,每当类似或 之类bucket的触发器发生时。s3:ObjectCreated:*s3:ObjectRemoved:*
我有以下代码
import boto3
client = boto3.client('s3',
aws_access_key_id="...",
aws_secret_access_key="...",
region_name="us-east-1")
response = client.put_bucket_notification(
Bucket='my_test_bucket',
NotificationConfiguration={
'CloudFunctionConfiguration': {
'Id': event_name,
'Events': [
's3:ObjectCreated:*',
's3:ObjectRemoved:*',
],
'CloudFunction': 'arn:aws:lambda:...',
}
}
)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行代码时,出现以下错误
An error occurred (InvalidArgument) when calling the PutBucketNotification
operation: Unable to validate the following destination configurations
Not authorized to invoke function [arn:aws:lambda:...]
Run Code Online (Sandbox Code Playgroud)
如何以编程方式授予my_test_bucket运行权限arn:aws:lambda:...?
我正在使用 VS Code aws 插件创建一个 aws lambda 函数,语言是 nodeJS。
我需要在请求中传递一个动态 ID,最好作为路径的一部分。
在nodeJS Express中我会这样做
/api/route/:id
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在 lambda 函数中执行此操作时,template.yaml如下所示
Events:
HelloWorld:
Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
Properties:
//***** this line
Path: /api/route/:id
Method: get
Run Code Online (Sandbox Code Playgroud)
它不起作用
任何帮助,将不胜感激
PS我可以像这样将它作为查询参数传递
https://awslambdafunction.com/api/route/?id=1234
Run Code Online (Sandbox Code Playgroud)
它确实有效,但我真的很想将它作为路径本身的一部分,如下所示
https://awslambdafunction.com/api/route/1234
Run Code Online (Sandbox Code Playgroud) 我正在尝试从 lambda 层导入自定义依赖项,但不起作用。
环境:nodejs8.10
我有一个由以下目录结构组成的层:
mylayer.zip-
|-nodejs-
|-util.js
Run Code Online (Sandbox Code Playgroud)
这里,util.js 有以下代码:
module.exports = function SomeFunction() {
console.log('Told you This Doesn't work');
}
Run Code Online (Sandbox Code Playgroud)
在 myLambda.js 中,我尝试SomeFunction使用以下代码进行调用:
const someFunction = require('/opt/nodejs/util')
exports.handler = async (event) => {
someFunction();
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
return response;
};
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误:
{
"errorMessage": "Cannot find module '/opt/nodejs/util'",
"errorType": "Error",
"stackTrace": [
"Function.Module._load (module.js:474:25)",
"Module.require (module.js:596:17)",
"require (internal/module.js:11:18)",
"Object.<anonymous> (/var/task/index.js:1:75)",
"Module._compile (module.js:652:30)",
"Object.Module._extensions..js (module.js:663:10)",
"Module.load (module.js:565:32)",
"tryModuleLoad (module.js:505:12)",
"Function.Module._load (module.js:497:3)" …Run Code Online (Sandbox Code Playgroud) amazon-web-services node.js ecmascript-6 aws-lambda aws-lambda-layers
问题
我正在关注本教程:https://docs.aws.amazon.com/toolkit-for-jetbrains/latest/userguide/key-tasks.html
操作系统:Win 10 专业版 64 位
行家:
C:\Users\MyUserName>mvn -version
Apache Maven 3.6.2 (40f52333136460af0dc0d7232c0dc0bcf0d9e117; 2019-08-28T01:06:16+10:00)
Maven home: C:\Program Files\apache-maven-3.6.2\bin\..
Java version: 1.8.0_221, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_221\jre
Default locale: en_AU, platform encoding: Cp1252
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
Run Code Online (Sandbox Code Playgroud)
爪哇:
C:\Users\MyUserName>java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
C:\Users\MyUserName>javac -version
javac 1.8.0_221
Run Code Online (Sandbox Code Playgroud)
Docker(已安装并正在运行):
C:\Users\MyUserName>docker -v
Docker version 19.03.2, build 6a30dfc
Run Code Online (Sandbox Code Playgroud)
IntelliJ Docker …
无法让角色访问两个表。template.yaml 的 YAML 示例:
Resources:
MyFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: path/to/something
Handler: index.handler
Runtime: nodejs10.x
Events:
Get:
Type: Api
Properties:
RestApiId: !Ref MyApi
Path: /path/to/other/thing
Method: post
Policies:
DynamoDBCrudPolicy:
TableName:
table1
table2
Run Code Online (Sandbox Code Playgroud)
我需要这个函数能够在 table1 和 table2 上读/写,但这不起作用。我试过:
- table1
- table2
Run Code Online (Sandbox Code Playgroud)
但这也行不通。还尝试过:
Policies:
- DynamoDBCrudPolicy:
TableName:
table1
- DynamoDBCrudPolicy:
TableName:
table2
Run Code Online (Sandbox Code Playgroud)
但这也会出错。我该如何正确地做到这一点?
yaml amazon-web-services aws-cloudformation aws-lambda aws-sam
我有一个 CDK 堆栈,可以创建 lambda 和 SNS 主题。策略设置为允许 lambda 发布到 SNS 主题。
我很难在 lambda 运行时代码中指定主题 ARN,因为从技术上讲它尚未创建,只是在堆栈中。
如何在 Lambda 代码中引用主题 ARN,以便 lambda 发布到该主题?Lambda 是用 Python 编写的。我正在使用该fromAsset方法 ( https://docs.aws.amazon.com/cdk/api/latest/docs/aws-lambda-readme.html ) 在堆栈中指定 lambda 运行时代码。
sns = boto3.client('sns')
responce = sns.publish(
TopicArn="arn would go here --- not sure what to put here w/ no arn",
Message="my_message"
)
Run Code Online (Sandbox Code Playgroud) 我在 AWS Lambda 中有一个函数可以检索 Stripe 中的用户详细信息。但是函数后面的代码首先执行。我缺少什么?
就我而言,该函数调用返回客户对象的 Stripe 函数。
我认为 Stripe 函数的细节与这个特定问题无关——问题是我的 async/await 的结构:
module.exports.getUserName = async (event, context)=>{
[code to get customerId from stripe]
var customerName
await stripe.customers.retrieve(customerId, function(err, customer){
if (err){}
else{
customerName = customer.name
}
})
console.log('This should run after stripe.customers.retrieve')
}
Run Code Online (Sandbox Code Playgroud)
现在console.log语句首先运行。我还尝试将 Stripe 函数包装在单独的异步函数中,并尝试添加 try/catch。但它还没有发挥作用。
我如何确定控制台日志语句在之后运行stripe.customers.retrieve?
我需要部署一个 lambda 函数,使用 python 包 pymysql 执行一个过程,我的 python 版本是 3.6,为此,我将使用 lambda 层来避免带来我的整个代码。为了实现这一目标,我遵循以下步骤:
创建一个单独的文件夹,将安装在虚拟环境中的 pymysql 包移动到其中cp -r /myvirtualenv/lib/python3.6/site-packages/pymysql ~/home/user/packagelambda/
在路径中~/home/user/packagelambda/将此包压缩为 zip 文件以作为 AWS lambda 层上传zip -r rdsconnection.zip *
将此 zip 文件作为新层上传到 aws lambda 仪表板
完成上述过程后,我进入代码并创建两个脚本来模块化我的执行,第一个脚本名为md_conenction.py,如下所示:
import json
import boto3
import pymysql
import csv
from datetime import datetime
def json_param():
s3 = boto3.resource('s3')
bucketname= "bucket"
file= "file.json"
object= s3.Object(bucketname,file)
body = object.get()['Body'].read().decode('utf8')
param= json.loads(body)
return param["host"], param["user"], param["password"], param["database"]
def …Run Code Online (Sandbox Code Playgroud) amazon-web-services python-3.x pymysql aws-lambda aws-lambda-layers
aws-lambda ×10
node.js ×3
java ×2
amazon-iam ×1
amazon-s3 ×1
amazon-sns ×1
aws-cdk ×1
aws-pinpoint ×1
aws-sam ×1
boto3 ×1
docker ×1
ecmascript-6 ×1
express ×1
jackson ×1
json ×1
pymysql ×1
python ×1
python-3.x ×1
yaml ×1