2017-06-05 16 views
1

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.

Antwort

0

Ich habe erfolgreich herausgefunden, wie diese Lambda-Funktion funktioniert. Dies ist für alle, die nach einer Antwort in Bezug auf die Implementierung von AWS-Diensten in AWS Lambda suchen. Es gibt sehr wenig Dokumentation darüber.

Da das AWS-SDK zu groß ist, ist es für Lambda nicht möglich, das Glas aufzunehmen, wenn dieses enthalten ist. Was wir also tun können, ist nur das Paket, das benötigt wird; In Anbetracht der Frage ist die einzige SDK-Bibliothek, auf die ich verweisen muss, EC2, daher fügte ich die Abhängigkeit zu meinem Pom nur für EC2 hinzu, wie unten angegeben.

<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-ec2 --> 
<dependency> 
    <groupId>com.amazonaws</groupId> 
    <artifactId>aws-java-sdk-ec2</artifactId> 
    <version>1.9.0</version> 
</dependency>