【问题标题】:AWS Lambda Function in javajava中的AWS Lambda函数
【发布时间】: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


    【解决方案1】:

    我已经成功地找到了如何让这个 lambda 函数工作。这适用于正在寻找有关在 AWS lambda 中实施 AWS 服务相关操作的答案的任何人。这方面的文档很少。

    由于 AWS 开发工具包太大,当包含 jar 时,lambda 无法容纳它。所以我们能做的就是包含需要的包;考虑到这个问题,我需要参考的唯一 SDK 库是 EC2,因此我只为 EC2 将依赖项添加到我的 pom 中,如下所示。

    <!-- 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> 
    

    【讨论】:

      猜你喜欢
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 2021-07-25
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多