标签: aws-lambda

AWS RDS 只读副本:如何避免复制少数表和列

我正在使用 RDS MariaDB,并且需要一个可以用于分析的从属数据库。我正在寻找 AWS 只读副本,但问题是它没有为我提供跳过包含一些敏感信息的少数表和列的复制的规定,我们不希望从数据库包含这些信息。

我可以使用 AWS 只读副本跳过少数表和列的复制吗?或者在 AWS 只读副本中,我可以编写可以从副本数据库中删除此信息的 AWS Lambda 吗?

java amazon-web-services amazon-rds mariadb aws-lambda

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

通过 CloudFormation ZipFile 部署 Lambda 函数时的错误处理程序

我正在部署一个lambda_handler使用 CloudFormation命名的 Lambda 函数(Python 3.6),方法是按此处所述指定内联代码。

Lambda 部署正确,但是在测试该功能时,我看到“错误处理程序”异常。

将Handler参数传递给 Lambda时引用处理程序的正确方法是什么?

amazon-web-services aws-cloudformation aws-lambda

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

SNS 调用的 AWS lambda 被限制,发送以重试并成功调用一次

我让 Lambda 订阅了 SNS 主题并将并发限制设置为 5。

一旦推送了 20 条 SNS 消息,Lambda 将运行 5 个实例并处理前 5 条 SNS 消息,这完全没问题。根据文档,其他消息将被视为受到限制并发送重试。再次似乎是预期的行为。

在这个阶段,我有 5 个 lambda 实例的 CloudWatch 日志,每个实例处理 1 条消息。还可以。

重试时间一到,我就会看到这 5 个实例进一步处理另一条消息,但是现在 5 个 lambda 实例中的每一个都有大约 8 个处理过的消息(应该有大约 4 个以导致 5 个实例处理总共 20 个消息)。实例处理了一些重试消息两次,两次都成功并且在不同的请求 ID 下。

似乎有时 SNS 消息可以传递两次,但鉴于上面的数字,看起来几乎每条消息都会传递和处理两次。

可以以某种方式避免这些吗?

Lambda 并发限制为 5,因为如果我推送 500 条消息,它将触发 500 个实例并在 lambda 创建连接时关闭我的 RDS。

所以再次提问 - 如果第一次处理成功结束,为什么重试消息会被处理两次。检测重复也很困难,因为它们每次都由不同的实例处理

concurrency amazon-web-services amazon-sns aws-lambda

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

名称 'conn' 未定义:NameError

我想将我的 aws iot mqtt 消息存储到我的 postgresql 中。为此,我已经将本地 posrtgresql 连接到亚马逊 RDS 实例。现在,我需要在 amazon lambda calculus 之间创建一个连接,然后将数据发送到 postgresql 数据库。但是每当我测试我的 lambda 演算时,它都会给我“名称'conn'未定义:NameError”错误。这是我在 aws lambda 中的 python 代码。我还在我的项目中包含了 psycopg2 库。

import sys
import logging
import rds_config
import psycopg2
#rds settings
rds_host  = "myhost"
name = "username"
password = "username_password"
db_name = "dbname"

logger = logging.getLogger()
logger.setLevel(logging.INFO)

try:
    conn = psycopg2.connect(host=rds_host, user=name, password=password, 
           dbname=db_name, connect_timeout=5)
except:
     logger.error("ERROR: Unexpected error: Could not connect to postgreSQL 
          instance.")

logger.info("SUCCESS: Connection to RDS postgreSQL instance succeeded")
def handler(event, context): …
Run Code Online (Sandbox Code Playgroud)

postgresql amazon-web-services python-3.x aws-lambda

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

如何从 AWS API 将变量传递给 Python Lambda

我试过搜索,但我的 googlefu 失败了。

我有一个基本的 python lambda 函数:

def lambda_handler(event, context):
    foo = event['bar']
    print(foo)
Run Code Online (Sandbox Code Playgroud)

然后我尝试做一个 POST,像这样在 curl 中:

curl -X POST https://correctaddress.amazonaws.com/production/test \
-H 'x-api-key: CORRECTKEY' \
-H 'content-type: application/json' \
-H 'bar: Hello World' \
Run Code Online (Sandbox Code Playgroud)

这KeyError: 'bar'可能失败了,因为我认为我作为 event['bar'] 传递的不是这样传递的。

我试过event['body']['bar']也失败了。

如果我这样做event['querystringparameters']['bar'],如果我使用 GET 会起作用,例如:

curl -X POST https://correctaddress.amazonaws.com/production/test?bar=HelloWorld -H 'x-api-key: CORRECTKEY'
Run Code Online (Sandbox Code Playgroud)

我知道我缺少关于事件字典的一些基本知识,以及它从 POST 中提取的内容,但我似乎找不到正确的文档(不确定它是否会出现在 API 或 Lambda 的文档中)。

我的最终目标是能够使用像这样的请求在 python 中写一些东西:

import requests, json

url = "https://correctaddress.amazonaws.com/production/test"
headers = {'Content-Type': "application/json", 'x-api-key': "CORRECTKEY"}
data …
Run Code Online (Sandbox Code Playgroud)

python aws-lambda aws-api-gateway

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

node js无法处理sns事件消息内容

我正在尝试从节点 js lambda 项目中的 SNS 事件中的消息获取内容

这是处理消息的代码

exports.handler = (event, context, callback) => {

var message = event.Records[0].Sns.Message;
console.log('Message received from SNS:', message); 

message.Events.forEach(element => {
    console.log(element);

   });
};
Run Code Online (Sandbox Code Playgroud)

示例事件:

{ 
 "Records": 
  [ 
    { 
     "EventSource": "aws:sns",
     "EventVersion": "1.0",
     "EventSubscriptionArn": "",
     "Sns": 
       { 
         "Type": "Notification",
         "MessageId": "bc86f105-c320",
         "TopicArn": "arn:aws:sns:ewerwrewrw",
         "Subject": "dwqweq23234",
         "Message": 
           {
           "Events":
             [
               {"EventTimestamp":"2018-03-16T10:51:22Z"},
               {"EventTimestamp":"2018-03-16T10:51:22Z"}
             ],
            "EventDocVersion":"2014-08-15"
           },
          "Timestamp": "2018-03-16T10:51:22.691Z",
          "SignatureVersion": "1",
          "Signature": "",
          "SigningCertUrl": "",
          "UnsubscribeUrl": "",
          "MessageAttributes": {} 
      } 
    } 
  ]
 }
Run Code Online (Sandbox Code Playgroud)

这是我在 CloudWatch 日志中得到的信息:

从 SNS …

javascript node.js amazon-sns aws-lambda

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

AWS Lambda Python 3 检查事件变量存在

 try: 
        event['ids']
 except NameError: 
        ids = None
Run Code Online (Sandbox Code Playgroud)

这是抛出一个KeyError。我只想检查事件变量是否存在并设置为 none 或如果存在则传递值。我也尝试使用

if (len(event['ids']) < 1) 
Run Code Online (Sandbox Code Playgroud)

但得到一个错误。我错过了什么吗?我可能会也可能不会通过我的所有事件键并想要检查是否存在。

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

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

用于 REST API 访问的 AWS Lambda 的命名约定

我正在使用无服务器框架构建 API。端点在 Amazon API Gateway 上定义,其中每个签名都映射到单独的 Lambda。

这里的 Lambda 命名约定是什么?例如,候选人POST /user可能是:

  • userPost
  • createUser

architecture amazon-web-services aws-lambda

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

async 和 Parse 的问题

我正在使用 Parse Server 并且在异步函数未按预期运行时遇到问题。我在 AWS Lambda 上的 Node.js 8.10 上运行它。这是我的函数的(非常简化的)版本:

Parse.Cloud.job("updateSubscriptions", async (req, res) => {
  try {
    winston.info("Updating subscriptions...");

    var Subscription = Parse.Object.extend("Subscription");
    var query = new Parse.Query(Subscription);

    await query.find().then(
      function () {
        winston.debug("Got subscriptions.");
      },
      function(error) {
        winston.error("Error querying subscriptions.");
      }
    );
    winston.debug("Wrapping up.");
  } catch (e) {
    winston.error("Uh oh.");
  }
});
Run Code Online (Sandbox Code Playgroud)

我想要(并期望)的是获得输出“更新订阅...获得订阅。结束。”

实际发生的是我看到“正在更新订阅...”,仅此而已。看来该函数实际上并未等待异步调用,和/或 Lambda 提前终止了该进程。

有谁知道我在这里做错了什么?

node.js parse-platform aws-lambda

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

lambda.invoke 是否需要 promise 包装器?

我有以下Promise.all示例。

承诺包装器是否需要lambda.invoke?

引用了这个线程

function get1(id) {
    return new Promise((resolve, reject) => {
        const params = {
            FunctionName: 'myLambda', // the lambda function we are going to invoke
            InvocationType: 'RequestResponse',
            Payload: { id },
        };

        lambda.invoke(params, (err, data) => {
            if (err) {
                reject(new Error('error'));
            } else {
                const result = JSON.parse(data.Payload);
                resolve(result);
            }
        });
    }).catch(e => Promise.resolve({ error: 'Error has occurred.' }));
}

exports.getDetails = list => Promise.all(list.map(get1))
    .then((response) => {
        return result;
    }).catch((error) => …
Run Code Online (Sandbox Code Playgroud)

javascript amazon-web-services node.js promise aws-lambda

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