Ich muss in AWS eine Lambda-Beispielfunktion erstellen, die eine EC2-Instanz beim Aufruf starten oder stoppen kann. Das erste, was ich versuchte, war ein Glas aus dem Projekt mit dem folgenden pomAWS Lambda-Funktion in Java
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Ec2Ops</groupId>
<artifactId>Ec2Ops</artifactId>
<version>0.0.1</version>
<name>Ec2Ops</name>
<description>Application to perform EC2Operations</description>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.136</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- configure the plugin here -->
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
ich die JAR-Datei ich in meine Lambda-Funktion mit diesem Pom bekam hochgeladen zu schaffen; dort im Gegenzug
{
"errorMessage": "com/amazonaws/services/ec2/AmazonEC2",
"errorType": "java.lang.NoClassDefFoundError",
"stackTrace": [
"com.ec2ops.handler.Ec2OpsHandler.handleRequest(Ec2OpsHandler.java:14)",
"com.ec2ops.handler.Ec2OpsHandler.handleRequest(Ec2OpsHandler.java:9)"
],
"cause": {
"errorMessage": "com.amazonaws.services.ec2.AmazonEC2",
"errorType": "java.lang.ClassNotFoundException",
"stackTrace": [
"java.net.URLClassLoader.findClass(URLClassLoader.java:381)",
"java.lang.ClassLoader.loadClass(ClassLoader.java:424)",
"java.lang.ClassLoader.loadClass(ClassLoader.java:357)",
"com.ec2ops.handler.Ec2OpsHandler.handleRequest(Ec2OpsHandler.java:14)",
"com.ec2ops.handler.Ec2OpsHandler.handleRequest(Ec2OpsHandler.java:9)"
]
}
}
Bitte beachten Sie, ich bin mit AWS Java SDK der Instanz zu manipulieren. Ich bin die folgende Fehlermeldung erhalten Ich habe aus dem Fehler verstanden, dass die Bibliothek nicht verfügbar ist; Also habe ich versucht, die Bibliothek mit dem Schatten-Plugin in das Glas zu integrieren.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
Wenn ich ist, dass Größe der JAR-Datei das tue mehr als 50 MB, daher kann ich diese in die JAR-Datei nicht laden. Der Code, den ich für den EC2-Betrieb verwende, ist unten angegeben.
public boolean startInstance(String instanceId) {
AmazonEC2 ec2 = new AmazonEC2Client();
StartInstancesRequest startInstanceRequest = new StartInstancesRequest()
.withInstanceIds(instanceId);
StartInstancesResult instancesResult = ec2
.startInstances(startInstanceRequest);
List<InstanceStateChange> stateChangeList = instancesResult
.getStartingInstances();
return checkStateOfInstance(stateChangeList, 16, instanceId) || checkStateOfInstance(stateChangeList, 80, instanceId);
}
Kann mir jemand sagen, was ich hier falsch mache.