标签: aws-lambda

如何使用CloudFormation创建新版本的Lambda函数?

我正在尝试使用CloudFormation创建一个新版本的Lambda函数.

我想拥有相同Lambda函数的多个版本,以便我可以(a)指向不同版本的别名 - 比如DEV和PROD - 以及(b)能够回滚到早期版本

这是我的Lambda版本的定义:

LambdaVersion:
  Type: AWS::Lambda::Version
  Properties:
    FunctionName:
      Ref: LambdaFunction
Run Code Online (Sandbox Code Playgroud)

运行"aws cloudformation create-stack"时会创建一个版本,但随后的"aws cloudformation update-stack"命令不会执行任何操作.没有创建新的Lambda版本.

我正在尝试在将新的zip文件上传到S3然后运行"update-stack"之后创建一个新版本的Lambda函数.我可以使用CloudFormation做到吗?AWS :: Lambda :: Version真的坏了吗(如https://github.com/hashicorp/terraform/issues/6067#issuecomment-211708071所述)或者我只是没有得到什么?

更新1/11/17 亚马逊支持的官方回复:"...对于要发布的任何新版本,您需要定义一个添加(原文如此) AWS :: Lambda :: Version资源......"

AWS CloudFormation/Lambda团队,如果您正在阅读此内容 - 这是不可接受的.修理它.

amazon-web-services aws-cloudformation aws-lambda

34
推荐指数
6
解决办法
2万
查看次数

使用Cognito的AWS Lambda API网关 - 如何使用IdentityId访问和更新UserPool属性?

好吧,我现在已经进入了这个阶段并取得了重大进展,但仍然完全被基本面所困扰.

我的应用程序使用Cognito用户池来创建和管理用户 - 这些在S3上通过IdentityId标识.我的每个用户都有自己的S3文件夹,AWS会自动为他们提供一个等于用户IdentityId的文件夹名称.

我需要将IdentityId与其他Cognito用户信息相关联,但无法确定如何使用.

我需要的关键是能够识别用户名以及给定IdentityId的其他cognito用户属性 - 而且这非常困难.

因此,第一场战斗是在Cognito用户通过AWS API Gateway发出请求时,弄清楚如何获取IdentityId.最后我得到了解决方案,现在我有一个Cognito用户,他向API网关发出请求,而我后面的Lambda函数现在有了IdentityId.那一点有效.

但我完全不知道如何访问存储在用户池中的Cognito用户信息.我找不到任何明确的信息,当然也没有代码,它显示了如何使用IdentityId来获取Cognito用户的属性,用户名等.

看来,如果我使用"Cognito用户池"在API网关中授权我的方法,那么可以使用正文映射模板将Cognito用户信息(例如sub,用户名和电子邮件地址)放入上下文中,但我可以没有得到IdentityId.

但是如果我AWS_IAM在API网关中使用授权我的方法,那么身体映射模板会反过来 - 它为我提供了IdentityId而不是Cognito用户字段,例如sub和username以及email.

这让我发疯了 - 如何将IdentityId和所有Cognito用户字段和属性合并为一个数据结构?事实上,我似乎只能得到一个或另一个是没有意义的.

amazon-cognito aws-lambda aws-api-gateway

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

aws lambda:错误:运行时退出并出现错误:信号:被杀死

我正在尝试从 S3 中提取一个大文件并使用 Pandas 数据帧将其写入 RDS。

我一直在谷歌上搜索这个错误,但在任何地方都没有看到它,有谁知道这个极其通用的声音错误可能意味着什么?我以前遇到过内存问题,但扩展内存消除了该错误。

{
  "errorType": "Runtime.ExitError",
  "errorMessage": "RequestId: 99aa9711-ca93-4201-8b1e-73bf31b762a6 Error: Runtime exited with error: signal: killed"
}
Run Code Online (Sandbox Code Playgroud)

python amazon-web-services aws-lambda

33
推荐指数
3
解决办法
2万
查看次数

Lambda集成与Lambda代理:优点和缺点

您认为在AWS API Gateway中使用和不使用代理功能的Lambda集成的优点和缺点是什么(更具体地说,在使用无服务器框架时)?这是我现在的想法:

Lambda与代理集成

  • Pro:人们可以快速进行原型设计和编码,而无需担心所有必需的配置细节(并重新发明一些轮子,如通用模板映射等).
  • Pro:返回任何状态代码和自定义标题非常容易,同时还有一种通用的方法来读取请求的正文,标题和参数.
  • Con:一切都在代码中完成,因此自动生成文档有点困难.依赖关系(标题,模型,返回的状态代码)在代码中"隐藏".

没有代理的Lambda集成

  • Con:需要更多的工作来设置它,并且这种配置可能在不同的资源中重复.
  • Pro:它允许人们分离lambda接收和返回的内容,以及如何将其映射到不同的HTTP状态代码,标头和有效负载.
  • Pro:非常有用,因为它预先规定了它返回的内容,以及它在标题和有效负载方面的要求.
  • Pro:从长远来看,设置所有内容时的艰苦工作非常有用,因为可以将所有内容导出到Swagger,以便其他人可以使用它为它生成不同的SDK.

你的想法是什么?您通常使用Lambda Proxy还是普通的Lambda集成?你喜欢什么,为什么?

编辑:到目前为止,我倾向于总是选择不使用代理功能,因为提到的原因(解耦和说明依赖关系 - 标题,状态代码等 - 预先).

aws-lambda aws-api-gateway serverless-framework

32
推荐指数
2
解决办法
5982
查看次数

AWS Java SDK - 无法通过区域提供程序链查找区域

我已经完成了题为"以编程方式设置AWS区域1"的问题,但它没有提供我需要的所有答案.

Q1:我得到了SDKClientException-Unable to find a region via the region provider chain.我究竟做错了什么?还是我错过了一个错字.

public class CreateS3Bucket {

public static void main(String[] args) throws IOException {

    BasicAWSCredentials creds = new BasicAWSCredentials("aws-access-key", "aws-secret-key");
    AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(creds)).build();

    Region region = Region.getRegion(Regions.US_EAST_1);
    s3Client.setRegion(region);

    try {
        String bucketName = "testBucket" + UUID.randomUUID();
        s3Client.createBucket(bucketName);
        System.out.println("Bucket Created Successfully.");

    } catch(AmazonServiceException awse) {

        System.out.println("This means that your request made it AWS S3 but got rejected");
        System.out.println("Error Message:" +awse.getMessage());
        System.out.println("Error Message:" +awse.getErrorCode());
        System.out.println("Error Message:" +awse.getErrorType());
        System.out.println("Error Message:" …
Run Code Online (Sandbox Code Playgroud)

java amazon-s3 amazon-web-services aws-sdk aws-lambda

32
推荐指数
6
解决办法
4万
查看次数

密文指的是不存在的客户主密钥,

我有一个lambda可以访问S3.

之前,这个 lambda 程序运行良好。但最近我更改了S3的KMS密钥或其他一些安全组设置,(lambda源代码没有改变)

出现错误。

我猜这lambda并不S3在 VPC 上,因此安全组不相关。

那么,,,和KMS密钥有关吗???

S3已加密bf3cf318-1376-44de-a014-XXXXXXXXX,所以我必须向该 lambda 授予 kms 访问权限?但如何呢?

还是我完全错了??

[ERROR] ClientError: An error occurred (AccessDenied) when calling the GetObject operation: The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access.
Traceback (most recent call last):
  File "/var/task/app.py", line 48, in handler
    raise e
  File "/var/task/app.py", line 45, in …
Run Code Online (Sandbox Code Playgroud)

amazon-s3 amazon-web-services aws-lambda amazon-kms

32
推荐指数
2
解决办法
9万
查看次数

AWS Lambda函数返回"无法找到模块'索引'",但配置中的处理程序设置为索引

正如我的标题解释我收到以下错误:

 {
  "errorMessage": "Cannot find module 'index'",
  "errorType": "Error",
  "stackTrace": [
    "Function.Module._resolveFilename (module.js:338:15)",
    "Function.Module._load (module.js:280:25)",
    "Module.require (module.js:364:17)",
    "require (module.js:380:17)"
  ]
}
Run Code Online (Sandbox Code Playgroud)

我尝试了在创建-la-lambda-function-in-aws-from-zip-filesimple-node-js-example-in-aws-lambda中提供的两种解决方案.

我的配置目前看起来像:在此输入图像描述

我的文件结构是: 在此输入图像描述

我的index.js处理函数如下所示:

exports.handler = function(event, context) {
Run Code Online (Sandbox Code Playgroud)

还有什么可能导致这个问题,除了上面这两个答案中所述的内容?我已经尝试了两种解决方案,并且我还为该功能分配了更多内存,这就是为什么它无法运行.

编辑 - 为了尝试,我创建了一个更简单的原始代码版本,它看起来像这样:

var Q = require('q');
var AWS = require('aws-sdk');
var validate = require('lambduh-validate');
var Lambda = new AWS.Lambda();
var S3 = new AWS.S3();




theHandler = function (event, context) {

  console.log =('nothing');

}

exports.handler = theHandler();
Run Code Online (Sandbox Code Playgroud)

然而仍然无法使用相同的错误?

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

31
推荐指数
3
解决办法
3万
查看次数

使用Lambda从S3读取数据

我在AWS上的S3存储桶中存储了一系列json文件.

我希望使用AWS lambda python服务来解析此json并将解析后的结果发送到AWS RDS MySQL数据库.

我有一个稳定的python脚本,用于解析和写入数据库.我需要lambda脚本来遍历json文件(当它们被添加时).

每个json文件都包含一个简单的列表 results = [content]

在伪代码中我想要的是:

  1. 连接到S3存储桶(jsondata)
  2. 阅读JSON文件的内容(results)
  3. 为此数据执行我的脚本(results)

我可以列出我所拥有的桶:

import boto3

s3 = boto3.resource('s3')

for bucket in s3.buckets.all():
    print(bucket.name)
Run Code Online (Sandbox Code Playgroud)

赠送:

jsondata
Run Code Online (Sandbox Code Playgroud)

但我无法访问此存储桶来读取其结果.

似乎没有readload功能.

我希望有类似的东西

for bucket in s3.buckets.all():
   print(bucket.contents)
Run Code Online (Sandbox Code Playgroud)

编辑

我误解了一些事情.lambda必须自己下载,而不是在S3中读取文件.

这里看来,你必须给lambda一个下载路径,从中可以访问文件本身

import libraries

s3_client = boto3.client('s3')

def function to be executed:
   blah blah

def handler(event, context):
    for record in event['Records']:
        bucket = record['s3']['bucket']['name']
        key = record['s3']['object']['key'] 
        download_path = '/tmp/{}{}'.format(uuid.uuid4(), key) …
Run Code Online (Sandbox Code Playgroud)

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

31
推荐指数
2
解决办法
5万
查看次数

是否可以(或有效)使用AWS Lambda运行完整的后端(比如说,Elastic Beanstalk)

我对服务器世界比较陌生,所以请原谅我,如果其中一些是基本的(我的第一部分文字将解释我的逻辑以确保它没有缺陷).我的所有问题都会加粗,让你的帮助更容易:).

我一直在研究和教授自己的一些AWS技术,我注意到在他们的移动中心,如果你想要云逻辑,他们只允许"自动"设置Lambda功能.在阅读和研究之后,我发现了一些指向"无服务器"架构的资源(Lambda支持的引入).在过去,我的理解是Elastic Beanstalk被引入以帮助使服务器管理(尤其是移动设备)显着简化.

对于移动开发者,有两个选项(显然更多,但为了简单起见,我们会同意):

  • 设置一个Elastic Beanstalk,它至少有一个实例24/7运行并且每个url有多个端点
  • 使用API​​ Gateway,我们可以轻松地将URL路由到特定的Lambda函数.有了这个,我们可以处理任何请求(就像设置Elastic Beanstalk应用程序一样).

所有这一切都让我相信,一个完整的λ后端是完全有可能的,容易在有全天候运行的服务器成本的一小部分来创建.那是对的吗?

现在,假设上述情况正确,我们需要确定使用Lambda是否真的比Elastic Beanstalk更有益.

对于简单的服务器,我们可以设置一些Lambda函数并将其称为一天(与使用Elastic Beanstalk相比,它可能更简单,更便宜(至少对于小型项目而言).

但是,对于具有更多URL和数据库连接的更复杂的服务器,事情变得更有趣.

这些是我在上述情况下使用Lambda时遇到的问题

  • 每个网址都有自己的API网关,并拥有自己的Lambda功能.如果在多个函数中使用任何代码或模块,我们必须将其复制并粘贴到每个函数中.
  • 管理多个Lambda函数(和API网关)比管理单个项目/ repo /无论你想要调用你的代码库更加重要.
  • 每个需要数据库连接的函数都必须在函数内连接(比如说,在Node.js应用程序中有一个连续的连接).

避免前两个问题的唯一方法(我能想到的)是创建一个充当调度的强大函数(main函数从API网关获取一个参数并确定在Lambda函数中运行哪个文件).

我是否缺少任何要点来确定是否值得使用Lambda而不是Elastic Beanstalk?

amazon-web-services amazon-elastic-beanstalk aws-lambda

31
推荐指数
3
解决办法
7018
查看次数

使用VPC配置添加AWS Lambda会导致访问S3时出现超时

我正在尝试从AWS Lambda访问我的VPC上的S3和资源,但由于我将AWS Lambda配置为访问VPC,因此在访问S3时会超时.这是代码

from __future__ import print_function

import boto3
import logging
import json

print('Loading function')

s3 = boto3.resource('s3')

import urllib

def lambda_handler(event, context):
    logging.getLogger().setLevel(logging.INFO)
    # Get the object from the event and show its content type
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8')
    print('Processing object {} from bucket {}. '.format(key, bucket))
    try:
        response = s3.Object(bucket, key)
        content = json.loads(response.get()['Body'].read())
        # with table.batch_writer() as batch:
        for c in content:
            print('     Processing Item : ID' + str(c['id']))
            # ##################
            # Do custom processing …
Run Code Online (Sandbox Code Playgroud)

amazon-s3 amazon-web-services amazon-vpc aws-lambda

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