如何正确创建可以使用 Eclipse 上传到 AWS lambda 的 zip 文件?

Posted

技术标签:

【中文标题】如何正确创建可以使用 Eclipse 上传到 AWS lambda 的 zip 文件?【英文标题】:How to correctly create a zip file that can be uploaded to AWS lambda using Eclipse? 【发布时间】:2021-12-08 13:05:55 【问题描述】:

如何从可以上传到 AWS Lambda 函数的现有 Java 项目创建 zip 文件?

我找不到有关如何执行此操作的任何明确步骤。我想将我的 Eclipse 项目导出为 zip 文件,然后将其上传到 AWS Lambda。目前,我使用 Eclipse 中的 AWS Toolkit 上传项目,但现在我想使用 zip 文件手动完成。

步骤是什么?

这就是我尝试的方式。这是我将项目导出为 zip 的地方:

然后,我去 AWS 并选择上传一个 zip 文件:

我选择我的 zip 文件,然后测试代码,这是我得到的错误:


  "errorMessage": "Error loading class com.amazonaws.lambda.demo.LambdaFunctionHandler: com/amazonaws/auth/AWSCredentialsProvider",
  "errorType": "java.lang.NoClassDefFoundError"

编辑:如果我使用 Toolkit 上传,则该功能有效,因此我知道所有资源都在文件夹中,我只需要弄清楚如何使用它。 这是函数的代码:

public class LambdaFunctionHandler extends IOException implements RequestHandler<SNSEvent, String> 

    private static AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1)
            .withCredentials(DefaultAWSCredentialsProviderChain.getInstance()).build();

    public LambdaFunctionHandler() 
    

    @Override
    public String handleRequest(SNSEvent event, Context context) 
        try 
            System.out.println("Hello world");
            return "SUCCESS2";
         catch (Exception e) 
            System.out.println("caught exception");
        
        return "FAILURE2";
    
    




编辑#2:这是我的pom.xml 文件:

<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>com.amazonaws.lambda</groupId>
  <artifactId>demo</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.6.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <encoding>UTF-8</encoding>
          <forceJavacCompilerUse>true</forceJavacCompilerUse>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.2</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-bom</artifactId>
        <version>1.12.91</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-events</artifactId>
      <version>1.3.0</version>
    </dependency>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-lambda-java-core</artifactId>
      <version>1.1.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.hierynomus/sshj -->
    <dependency>
        <groupId>com.hierynomus</groupId>
        <artifactId>sshj</artifactId>
        <version>0.29.0</version>
    </dependency>
    <dependency>
        <groupId>com.jcraft</groupId>
        <artifactId>jsch</artifactId>
        <version>0.1.55</version>
    </dependency>
  </dependencies>
</project>

【问题讨论】:

【参考方案1】:

您可以在 Eclipse 中创建一个 Maven 项目,然后将其导出为可以上传到 AWS 管理控制台的 JAR 文件。这样做很容易。要了解如何执行此用例,请参阅此 AWS 教程。它使用 IntelliJ(只需将其切换为 Eclipse),并遵循文档的其余部分。

此 Lambda 函数的示例用例是检测位于 Amazon Simple Storage Service (Amazon S3) 存储桶中的图像中的个人防护装备 (PPE)。它会引导您完成所有步骤,包括部署 Lambda 函数。

Creating an AWS Lambda function that detects images with Personal Protective Equipment

在通过控制台构建和部署时,您永远不会遇到在此工具中看到的问题。

更新 这个 Lambda 函数有效——刚刚测试过。以下是 Lambda 控制台中的结果。

放置在 DynamoDB 表中的数据:

您的错误是找不到信用提供者。使用 Lambda 时,您无需在 Java 代码中设置凭据。权限在 IAM 角色中设置。您需要为 IAM 角色设置策略,以便它可以调用服务。所以在这个示例用例中,我们为 lambda-support 设置策略。

另一个更新

在 Eclipse 中,我使用您的代码构建了一个项目(我认为这个 PPE 非常先进 - 所以我们将创建一个名为 Getting Started with Lambda 的新项目)。效果很好:

【讨论】:

我已经尝试过了,但没有成功。我完全按照该链接中的说明进行操作。我导出到 .jar。我去了AWS并上传了.jar,但仍然是同样的错误。 部署此 JAR 文件时,您会看到什么。您是否正确设置了 IAM 角色 什么意思?我单击上传 .zip 文件或 .jar 文件(我都尝试过),然后我尝试对其进行测试,但我收到了一个错误,如我的问题所示。我相信我的 IAM 角色设置得很好,因为我可以通过 Toolkit 上传。我还能如何检查?但我认为这不是问题。 另外,当我部署时,它说它是成功的,但是当我运行它时,我得到了错误。我正在做你提到的一切,但没有任何帮助。 我将尝试使用您的 Eclipse 代码执行此 Lambda 函数。我想知道使用我的 IDE 是否还有其他问题。

以上是关于如何正确创建可以使用 Eclipse 上传到 AWS lambda 的 zip 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用指定版本2.3的JSF Facet创建Eclipse动态Web项目?

eclipse中如何向开源中国(码云)上传代码

eclipse中git的使用

使用eclipse上传代码到SVN服务器-----学习总结

eclipse git 如何拉取代码

eclipse上传代码到gitbub