标签: aws-lambda

Java Lambda 函数接受 JSON 输入时出现问题

我的团队有两个 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 字符串中的一些转义字符串造成的。所以我想这对我来说归结为两个问题:

  1. 根据CW日志,Lambda使用FasterXML的Jackson来映射Lambda输入。有没有办法@JsonProperty在自定义 RequestObject 类中使用注释或类似的东西?文档说:

    您不应依赖序列化框架的任何其他功能(例如注释)。

    (但它仍然是杰克逊!!)

  2. 有没有办法告诉 Lambda 停止尝试映射输入,而只是手动解析原始字节数组?这将解决很多令人头痛的问题,以便能够使用注释进行我们自己的自定义解析。

提前致谢,如果需要,可以提供更多详细信息。

java json amazon-web-services jackson aws-lambda

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

AWS Pinpoint 自定义通道:无法正确调用挂钩中指定的 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)

amazon-iam aws-lambda aws-pinpoint

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

如何以编程方式授予 s3 存储桶调用 lambda 的权限?

我在做什么

目前,我正在尝试动态创建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:...?

python amazon-s3 amazon-web-services boto3 aws-lambda

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

使用动态路径创建 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)

node.js express aws-lambda visual-studio-code

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

无法从 aws-lambda 解析“nodejs/”目录下的自定义依赖项

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

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

在 IntelliJ for AWS Lambda 应用程序中运行 Docker:Docker 抛出 404 客户端错误 (docker.errors.ImageNotFound)

问题

我正在关注本教程: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 …

java intellij-idea docker aws-lambda

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

AWS SAM YAML - 多次附加相同的策略,或在同一 DynamoDB 策略上附加多个表

无法让角色访问两个表。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

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

在 Lambda 运行时代码中引用 ARN(在 CDK 堆栈中创建)

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

amazon-sns aws-lambda aws-cdk

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

我的 async/await 函数未在 AWS Lambda 中等待。我缺少什么?

我在 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?

node.js aws-lambda

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

为 pymysql 导入 AWS lambda 层

我需要部署一个 lambda 函数,使用 python 包 pymysql 执行一个过程,我的 python 版本是 3.6,为此,我将使用 lambda 层来避免带来我的整个代码。为了实现这一目标,我遵循以下步骤:

  • 在我的本地计算机中创建一个 python virtualenv
  • 安装 pymysql 包
  • 创建一个单独的文件夹,将安装在虚拟环境中的 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

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