【发布时间】:2017-11-05 19:43:10
【问题描述】:
我需要在 AWS 中创建一个示例 lambda 函数,该函数能够在调用时启动或停止 EC2 实例。我尝试的第一件事是使用以下 pom 从项目中创建一个 jar
<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>
我将使用这个 pom 获得的 jar 文件上传到我的 lambda 函数中;我得到以下错误作为回报
{
"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)"
]
}
}
请注意,我正在使用 AWS Java SDK 来操作实例。我从错误中了解到该库不可用;所以我尝试使用 shade 插件将该库也包含到 jar 中。
<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>
当我这样做时,jar 文件的大小超过 50MB,因此我无法将其上传到 jar 文件中。下面给出了我用于 EC2 操作的代码。
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);
}
谁能告诉我这里做错了什么。
【问题讨论】:
标签: java amazon-web-services amazon-ec2 aws-lambda aws-sdk