j256 / cloudwatch-logback-appender Goto Github PK
View Code? Open in Web Editor NEWAppender that publishes logback log entries to AWS CloudWatch
License: ISC License
Appender that publishes logback log entries to AWS CloudWatch
License: ISC License
CloudWatchAppender suddenly does not send any log events to CloudWatch Logs after I add one more appender.
Previously
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>/var/log/%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%-25thread] %-5level %-36logger{36} - %msg%n%xThrowable</pattern>
</encoder>
</appender>
<appender name="CLOUDWATCH" class="com.j256.cloudwatchlogbackappender.CloudWatchAppender">
<region>ap-southeast-1</region>
<logGroup>backend-server</logGroup>
<logStream>dev</logStream>
<layout>
<pattern>[%thread] %level %logger{36} - %msg%n%xThrowable</pattern>
</layout>
</appender>
<root level="debug">
<appender-ref ref="FILE" />
<appender-ref ref="CLOUDWATCH" />
</root>
</configuration>
Added one more appender
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>/var/log/%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%-25thread] %-5level %-36logger{36} - %msg%n%xThrowable</pattern>
</encoder>
</appender>
<appender name="CLOUDWATCH-DEBUG" class="com.j256.cloudwatchlogbackappender.CloudWatchAppender">
<region>ap-southeast-1</region>
<logGroup>backend-server/dev</logGroup>
<logStream>DEBUG</logStream>
<layout>
<pattern>[%thread] %level %logger{36} - %msg%n%xThrowable</pattern>
</layout>
</appender>
<appender name="CLOUDWATCH-ERROR" class="com.j256.cloudwatchlogbackappender.CloudWatchAppender">
<region>ap-southeast-1</region>
<logGroup>backend-server/dev</logGroup>
<logStream>ERROR</logStream>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<layout>
<pattern>[%thread] %level %logger{36} - %msg%n%xThrowable</pattern>
</layout>
</appender>
<root>
<appender-ref ref="FILE" />
<appender-ref ref="CLOUDWATCH-DEBUG" />
<appender-ref ref="CLOUDWATCH-ERROR" />
</root>
</configuration>
I did not change anything else except the logback.xml file. Any idea?
aws-sdk and logback version used in this library seems outdated.
I'm having this error and I suspect sdk version mismatch caused this. (I'm using 1.11.285 in my application)
Exception in thread "CloudWatchAppender" java.lang.NoSuchMethodError: com.amazonaws.http.ExecutionContext.setCredentials(Lcom/amazonaws/auth/AWSCredentials;)V
at com.amazonaws.services.ec2.AmazonEC2Client.invoke(AmazonEC2Client.java:12365)
at com.amazonaws.services.ec2.AmazonEC2Client.describeTags(AmazonEC2Client.java:7603)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.lookupInstanceName(CloudWatchAppender.java:623)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.createLogsClient(CloudWatchAppender.java:502)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.writeEvents(CloudWatchAppender.java:407)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.run(CloudWatchAppender.java:374)
at java.lang.Thread.run(Thread.java:748)
Can you bump them?
I'm just looking at several of the Logback appenders for CloudWatch and noticed you require that the key and secret be in logback.xml
and use BasicAWSCredentials
. If you switched to DefaultAWSCredentialsProviderChain
then users could inject their credentials several different ways (env var, sys props, .aws/credentials, ec2 container creds) w/o having to check them in their VCS.
cloudwatchlogappender's latest version does not work with the latest versions of logback/slf4j
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>com.j256.cloudwatchlogbackappender</groupId>
<artifactId>cloudwatchlogbackappender</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.5</version>
</dependency>
Exception in thread "main" java.lang.NoSuchMethodError: 'void ch.qos.logback.classic.spi.LoggingEvent.setMarker(org.slf4j.Marker)'
at com.j256.cloudwatchlogbackappender.CloudWatchAppender.copyEvent(CloudWatchAppender.java:410)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender.append(CloudWatchAppender.java:218)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender.append(CloudWatchAppender.java:60)
at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:85)
at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51)
at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:272)
at ch.qos.logback.classic.Logger.callAppenders(Logger.java:259)
at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:426)
at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:386)
at ch.qos.logback.classic.Logger.info(Logger.java:584)
at org.example.App.doLogs(App.java:17)
at org.example.App.main(App.java:13)
The appender does not try to flush remaining messages to CloudWatch on stop, so final messages typically don't get written. These messages are specially important in the case of failures that cause an exit or short-lived workloads.
I'm using logstash/logstash-logback-encoder with cloudwatch-logback-appender in a REST API service and in some instances the log events are missing all MDC entries.
My guess what is happening that the log event has a reference to the MDC, and I'm clearing the MDC at the end of my request processing[1]. If the event sits in the appender internal queue too long, it will read the MDC data after it has been cleared.
If that is the case then one solution would be to store a copy of MDC contents to the LoggingEvent in the synchronous path, similarly as thread name is handled here:
[1] See the logback MDC servlet filter for an example: https://logback.qos.ch/xref/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.html
Good work on this appender, it works like a charm. The only bug I've found is that the AmazonEC2Client
created in lookupInstanceName
does not apply the region given in the config. Should be a one-line fix
hey.
I've been using your project. in my dependencies, besides your package, I also needes the aws sdk. Since I didn't want to import the full sdk (which adds almost 100MB to the output jar), I've figured out which parts of the sdk you use. following the aws sdk instructions, I ended up with something like this (for gradle but I guess you can figure out the maven equivalent):
[...]
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "io.spring.gradle:dependency-management-plugin:1.0.3.RELEASE"
}
}
apply plugin: "io.spring.dependency-management"
[...]
dependencyManagement {
imports {
mavenBom 'com.amazonaws:aws-java-sdk-bom:1.11.228'
}
}
dependencies {
[...]
compile group: "com.j256.cloudwatchlogbackappender", name: "cloudwatchlogbackappender", version: "1.10"
compile 'com.amazonaws:aws-java-sdk-cloudwatch'
compile 'com.amazonaws:aws-java-sdk-ec2'
compile 'com.amazonaws:aws-java-sdk-logs'
}
It would be nice to find something like this in the README.
Cheers
logback has replaced Layout interface with Encoder interface since logback 0.9.19 in appenders. Maybe cloudwatch-logback-appender should follow that convention?
When a batch of log events contains one (or more) events that are larger than AWS set limit of 256 kB, submitting the whole batch fails and the events will be appended to emergency appender. I'm not actually sure what would be preferable behavior here; I feel like it would make sense to filter such events preemptively and maybe write only those particular events to emergency appender (and emit appropriate warning), allowing the rest of the events to be processed successfully.
Admittedly having log events be over 256k is bit stupid on my part, but such things do happen occasionally.
I'm using the following:
<logStream>general-%{instanceName}-%{instanceId}</logStream>
The reason being, that I have several docker instances with the same InstanceName for which I'd like to create separate streams for.
However, In CloudWatch the stream created end up as:
general-unknown-i-08887b38c3ca3....
Now, even if the name was not properly inferred, shouldn't I be seeing the instanceId twice instead of an "unknown" within the name?
This one is working: stream-%instance-%date{yyyyMMdd,UTC}-%uuid
This one is not working: stream-%date{yyyyMMdd,UTC}-%uuid
This one as well doesn't work: stream-%address-%date{yyyyMMdd,UTC}-%uuid
Is there a way to print the issues and see why it's not working when %instance is not specified?
Send the logs to aws cloud watch as other languages does
Error ar the startup of spring boot application:
Fail to retrieve token : com.amazonaws.SdkClientException: Failed to connect to service endpoint
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.9</version>
</dependency>
<dependency>
<groupId>com.j256.cloudwatchlogbackappender</groupId>
<artifactId>cloudwatchlogbackappender</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
</dependency>
<appender name="cloudWatchAppender" class="com.j256.cloudwatchlogbackappender.CloudWatchAppender">
<region>${META_LOG_AWS_DEFAULT_REGION}</region>
<logGroup>${META_LOG_AWS_GROUP_NAME}</logGroup>
<logStream>${META_LOG_AWS_STREAM_NAME}</logStream>
<accessKeyId>596fe817-5aef-4a13-8d56-f76dc6db26c9</accessKeyId>
<secretKey>196d6918-466b-48c1-b5c6-af3d51d21f81</secretKey>
<layout>
<pattern>[%thread] %level %logger{20} - %msg%n%xThrowable</pattern>
</layout>
</appender>
On c# and nodejs, the same parameters in the same machine, worked. It was not necessary other configurations
2022-08-31 16:05:24.340 [] [] [] [] WARN 19696 --- [CloudWatchAppender] i.InstanceMetadataServiceResourceFetcher : Fail to retrieve token
com.amazonaws.SdkClientException: Failed to connect to service endpoint:
at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:100)
at com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.getToken(InstanceMetadataServiceResourceFetcher.java:91)
at com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.readResource(InstanceMetadataServiceResourceFetcher.java:69)
at com.amazonaws.internal.EC2ResourceFetcher.readResource(EC2ResourceFetcher.java:66)
at com.amazonaws.util.EC2MetadataUtils.getItems(EC2MetadataUtils.java:403)
at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:372)
at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:368)
at com.amazonaws.util.EC2MetadataUtils.fetchData(EC2MetadataUtils.java:422)
at com.amazonaws.util.EC2MetadataUtils.fetchData(EC2MetadataUtils.java:416)
at com.amazonaws.util.EC2MetadataUtils.getInstanceId(EC2MetadataUtils.java:136)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.lookupInstanceName(CloudWatchAppender.java:712)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.createLogsClient(CloudWatchAppender.java:622)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.writeEvents(CloudWatchAppender.java:534)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.run(CloudWatchAppender.java:497)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:735)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:706)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1593)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1498)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:82)
... 14 common frames omitted
2022-08-31 16:05:24.342 [] [] [] [] WARN 19696 --- [CloudWatchAppender] com.amazonaws.util.EC2MetadataUtils : Unable to retrieve the requested metadata (/latest/meta-data/instance-id). Failed to connect to service endpoint:
com.amazonaws.SdkClientException: Failed to connect to service endpoint:
at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:100)
at com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.getToken(InstanceMetadataServiceResourceFetcher.java:91)
at com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.readResource(InstanceMetadataServiceResourceFetcher.java:69)
at com.amazonaws.internal.EC2ResourceFetcher.readResource(EC2ResourceFetcher.java:66)
at com.amazonaws.util.EC2MetadataUtils.getItems(EC2MetadataUtils.java:403)
at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:372)
at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:368)
at com.amazonaws.util.EC2MetadataUtils.fetchData(EC2MetadataUtils.java:422)
at com.amazonaws.util.EC2MetadataUtils.fetchData(EC2MetadataUtils.java:416)
at com.amazonaws.util.EC2MetadataUtils.getInstanceId(EC2MetadataUtils.java:136)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.lookupInstanceName(CloudWatchAppender.java:712)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.createLogsClient(CloudWatchAppender.java:622)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.writeEvents(CloudWatchAppender.java:534)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.run(CloudWatchAppender.java:497)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:735)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:706)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1593)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1498)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:82)
... 14 common frames omitted
EC2 instance credentials via the DefaultAWSCredentialsProviderChain
are temporary and expire, throwing an exception and preventing any logs from being written: https://aws.amazon.com/premiumsupport/knowledge-center/security-token-expired/
Using a different constructor for AWS client should resolve the issue
Could you please tell me how to set log stream name as a (today's date + guid) ?
Hey!
I am trying to use your library but i am getting this error.
Exception in thread "CloudWatchAppender" java.lang.NoSuchMethodError: com.amazonaws.services.logs.AWSLogsClient.createLogGroup(Lcom/amazonaws/services/logs/model/CreateLogGroupRequest;)V
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.verifyLogGroupExists(CloudWatchAppender.java:505)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.initialize(CloudWatchAppender.java:490)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.writeEvents(CloudWatchAppender.java:402)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.run(CloudWatchAppender.java:369)
at java.lang.Thread.run(Thread.java:748)
I have included in my pom.xml
<dependency>
<groupId>com.j256.cloudwatchlogbackappender</groupId>
<artifactId>cloudwatchlogbackappender</artifactId>
<version>1.8</version>
</dependency>
Before of this, because I am using the aws-sdk, I have included:
<properties>
<project.aws>1.11.109</project.aws>
</properties>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>${project.aws}</version>
</dependency>
Can you figure out what is happening?
Thanks!
Have you guys ever run into this? Running this app in an IDE works like a champ. However, when running the app as an executable jar from the CLI it shuts down as soon as the logback code is hit with no errors. Commenting out the cloudwatch appender definitions & references in logback-spring.xml works, as does not instantiating the StandardEncryptableEnvironment in the main method of the SpringApplication class. Obviously neither solution is workable :(
Here's our main class:
package com.somepackagename;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import com.ulisesbocchio.jasyptspringboot.environment.StandardEncryptableEnvironment;
@SpringBootApplication
public class MyApplication {
public static void main(String... args) {
new SpringApplicationBuilder()
.environment(new StandardEncryptableEnvironment())
.sources(MyApplication.class).run(args);
}
}
We're using v1.10 of your appender and Logback with slf4j v1.7.12. It is perfectly happy with our configuration, and our test cases all pass with flying colors. Let me know if you've run across this issue or have any ideas. Thanks!
CloudWatch doesn't support log-streams with ':' in them maybe. What other characters are not allowed?
Hi,
while testing the appender on my local environment, i am getting this:
java.lang.IllegalStateException: Socket not created by this factory
at org.apache.http.util.Asserts.check(Asserts.java:34)
at org.apache.http.conn.ssl.SSLSocketFactory.isSecure(SSLSocketFactory.java:435)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:186)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:326)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:610)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:445)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:822)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:576)
at com.amazonaws.http.AmazonHttpClient.doExecute(AmazonHttpClient.java:362)
at com.amazonaws.http.AmazonHttpClient.executeWithTimer(AmazonHttpClient.java:328)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:307)
at com.amazonaws.services.logs.AWSLogsClient.invoke(AWSLogsClient.java:1799)
at com.amazonaws.services.logs.AWSLogsClient.putLogEvents(AWSLogsClient.java:1515)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.writeEvents(CloudWatchAppender.java:448)
at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.run(CloudWatchAppender.java:374)
at java.lang.Thread.run(Thread.java:748)
My appender config file is pretty standard and 1:1 from the docs. Anybody an idea?
Thanks
If I am using this at my local machine, and I get this following error.
com.amazonaws.SdkClientException: Failed to connect to service endpoint: at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:100) at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:70) at com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.readResource(InstanceMetadataServiceResourceFetcher.java:75) at com.amazonaws.internal.EC2ResourceFetcher.readResource(EC2ResourceFetcher.java:66) at com.amazonaws.util.EC2MetadataUtils.getItems(EC2MetadataUtils.java:403) at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:372) at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:368) at com.amazonaws.util.EC2MetadataUtils.fetchData(EC2MetadataUtils.java:422) at com.amazonaws.util.EC2MetadataUtils.fetchData(EC2MetadataUtils.java:416) at com.amazonaws.util.EC2MetadataUtils.getInstanceId(EC2MetadataUtils.java:136) at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.lookupInstanceName(CloudWatchAppender.java:712) at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.createLogsClient(CloudWatchAppender.java:622) at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.writeEvents(CloudWatchAppender.java:534) at com.j256.cloudwatchlogbackappender.CloudWatchAppender$CloudWatchWriter.run(CloudWatchAppender.java:497) at java.lang.Thread.run(Thread.java:748)
Can you make it so the "addr" can use the local IP ?
The env variable "AWS_REGION"->"eu-west-1" of deafultProvideChain not work. I will take every "us-east-1".
This library saved me a lot of time! Thanks.
It would be great to have a logback property to specify the endpoint_url in order to send logs to localstack.
Localstack is a tool for running AWS services in a docker container on port 4566.
I used apigateway, lambda, dynamodb, and s3 during development and in tests (including GitHub actions). Thus, to use AWS services with localstack you have to send all requests to localhost:4566 instead of the real AWS endpoints.
It took me some time to figure out which AWS SDK dependencies are needed to use the library. The entire AWS SDK has about 80 MiB but it seems, the components aws-java-sdk-logs and aws-java-sdk-ec2 are sufficient. Maybe this should be added to the README.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.