Tag: aws lambda

在Amazon Lambda上运行Spring Boot

我正在尝试在Amazon Lambda上部署Spring Boot应用程序。 我注意到如果快速连续调用处理程序 – spring尝试重新加载自己,重新设置datsources,重新加载bean等 无论如何,如果已经调用了main方法,那么告诉Spring Boot不要重新初始化自己吗? 谢谢Damien

如何从用Java编写的AWS Lambda函数中读取S3文件?

我编写了一个AWS Lambda函数,其目标是在调用时 – 它读取文件的内容,例如x.db,从中获取一个特定的值并返回给调用者。但是这个x.db文件不时变化。 所以我想将这个x.db文件上传到S3并从AWS Lambda函数读取它就像读取文件一样。 File xFile = new File(“S3 file in x.db”); 如何从用Java编写的AWS Lambda函数中读取这样的x.db S3文件?

AWS Lambda性能问题

我使用与aws lambda(java)集成的aws api网关,但我在这种方法中看到了一些严重的问题。 删除服务器并让您的应用程序开箱即用的概念非常好,但这是我面临的问题。 我的lambda做了两件简单的事情 – validation从客户端收到的有效负载,然后将其发送到kinesis流,以便从另一个lambda进行进一步处理(你会问为什么我不直接发送到流,只使用1个lambda我只想说我想分离逻辑并有一层抽象,并且能够告诉客户他正在发送无效数据。) 在lambda的实施中,我集成了弹簧DI。 到现在为止还挺好。 我开始进行性能测试。 我模拟了50个并发用户,每个请求发出4个请求,请求之间有5秒。 所以发生了什么 – 在lambda的冷启动中,我初始化了spring的应用程序上下文,但似乎在lambda未启动时有如此多的同时请求正在做一些奇怪的事情。 这是上下文初始化时间的屏幕截图。 我们从截图中看到的是,初始化上下文的时间有很大差异。 我对所发生的事情的假设是,当接收到如此多的请求且没有“活动”lambda时,它会为每个请求初始化一个lambda容器,同时它“阻塞”其中一些(具有大量时间的那些) 18s)直到其他已经开始准备好了。 所以也许它可以同时启动容器的内部限制。 问题是如果你没有平均分配的流量,这将不时发生,一些请求将会超时。 我们不希望这种情况发生。 接下来的事情就是在没有弹簧容器的情况下进行一些测试,因为我的想法是“好的,初始化很重,让我们只做普通的旧java对象初始化”。 不幸的是,同样的事情发生了(可能只是减少了一些请求的3s容器初始化)。 以下是测试数据的更详细截图: 所以我记录了整个lambda执行时间(从构造到结束),kinesis客户端初始化以及实际将数据发送到流,因为这些是lambda中最重的操作。 我们仍然有18岁或者其他什么时候,但有趣的是,时代在某种程度上是成比例的。 因此,如果整个lambda需要18秒,大约7-8s是客户端初始化,6-7用于将数据发送到流,而剩下4-5秒用于lambda中的其他操作,目前只是validation。 另一方面,如果我们采用其中一个小时间(这意味着它重用已经开始的lambda),即820ms,则kinesis客户端初始化需要100ms,数据发送需要340ms,validation需要400ms。 所以这再次推动了我内心因为一些限制而睡觉的想法。 下一个屏幕截图显示了当lamda已经启动时下一轮请求发生的情况: 所以我们没有这么大的时间,是的,我们在一些请求中仍然有一些相对较大的增量(对我而言也很奇怪),但事情看起来好多了。 所以我正在寻找一个实际上知道幕后发生了什么的人的澄清,因为对于使用云的严肃应用程序来说这不是一个好的行为,因为它具有“无限”的可能性。 另一个问题与区域中帐户内所有lambda中lambda-200并发调用的另一个限制有关。 对我而言,对于拥有大量流量的大型应用程序来说,这也是一个很大的限制。 因此,我的商业案例(我不知道将来)或多或少是火,忘了请求。 我开始考虑改变网关直接将数据发送到流的方式的逻辑,另一个lambda负责validation和进一步处理。 是的,我正在失去当前的抽象(目前我不需要),但我多次增加应用程序的可用性。 你怎么看?

使用slf4j登录AWS Lambda

我正在使用lambda函数并用Java编写它。 当我阅读文档时,我正在查找记录Lambda函数,并且它们支持log4j – http://docs.aws.amazon.com/lambda/latest/dg/java-logging.html#java-wt-logging-using- log4j 。 我想知道我们是否可以使用Slf4j注释来使用日志记录,因为Slf4j只是一个绑定注释。 有没有人尝试过使用Slf4j之前使用lambda?

Maven部署包并上传到AWS-Lambda

我在将maven部署包上传到Amazon s3时遇到了问题。 从Eclipse,我能够成功生成.jar文件,但是我在上传到服务器时遇到了问题。 这是我的Java代码: package main.java.mavantestproj; import java.util.Map; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; import com.amazonaws.services.lambda.runtime.Context; public class LambdaFunctionHandler { public String handleRequest(Map input, Context context) { context.getLogger().log(“Input: ” + input); AmazonDynamoDBClient client = new AmazonDynamoDBClient(new ProfileCredentialsProvider(“mytest”)); client.setRegion(com.amazonaws.regions.Region.getRegion(Regions.US_WEST_2)); client.describeTable(“ProductCatalog”); // TODO: implement your handler return null; } } 在目标文件夹中我有2个jar子。 即lambda-java-example-1.0-SNAPSHOT.jar&original-lambda-java-example-1.0-SNAPSHOT.jar 在这第一个jar子是35MB,第二个jar子是4KB。 我没有得到哪一个上传到S3来运行我的lambda函数。

AWS Lambda:如何从简单的java类调用lambda函数

我创建了简单的Lambda函数并将其上传到AWS Lambda。 import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; public class Hello implements RequestHandler { @Override public String handleRequest(String input, Context context) { String output = “Bonjour, ” + input + “!”; return output; } } } 我想使用java类从其他项目调用此Lambda函数。 我正在使用aws-java-sdk-lambda-1.10.22来调用该函数。 但我无法成功。 这是我的InvokeLambda类,它是一个单独的项目。 import java.nio.ByteBuffer; import java.nio.charset.Charset; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.regions.Region; import com.amazonaws.regions.Regions; import […]

在JAVA中使用Lambda的AWS DynamoDB触发器

我试图在dynamodb流事件上触发用Java编写的AWS lambda函数。 亚马逊有一个相同的指南,在这里使用NodeJS http://docs.aws.amazon.com/lambda/latest/dg/wt-ddb-create-test-function.html NodeJS的测试输入(来自上面的链接)看起来像一个SNS事件,所以我尝试在Java中使用相应的SNSEvent类作为我的处理程序方法的输入。 import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.events.SNSEvent; import com.amazonaws.services.lambda.runtime.events.SNSEvent.SNSRecord; import java.util.List; public class RecomFunction { public void handler(SNSEvent event, Context context) { LambdaLogger logger = context.getLogger(); List records = event.getRecords(); if (records != null) { for (SNSRecord record : records) { if (record != null) { logger.log(“SNS record: ” + record.getSNS().getMessage()); […]

如何使用javac在不同平台上创建二进制相同的类文件?

我用Java编写AWS Lambda函数。 我用来上传我的lambdas( Terraform )的工具想要使用我的jar文件的SHA-256哈希来跟踪是否需要上传一个新版本的lambda。 问题是,不同操作系统平台(Windows和Linux)上的不同JDK会创建略微不同的字节码(即使使用相同的“更新”版本的JDK)。 这意味着,如果我在Windows上上传lambda,然后在Linux上重新运行该进程 – 它将检测jar的不同哈希代码并不必要地重新上传lambda jar。 问题 :如何强制javac在不同的OS平台上创建相同的字节码?

AWS Lambda如何处理多个请求?

AWS Lambda如何处理多个请求? 我想知道这是一个multithreading类型的模型吗? 如果我从API网关调用Lambda。 并且在10秒内向API发出1000个请求。 将创建多少个容器以及多少个线程。

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.”); } […]