Java 如何引用AWS云开发工具包中代码中的lambda? import software.amazon.awscdk.services.lambda.Function; 函数helloLambda=新函数(helloStack,“hellocdkworld123”,FunctionProps.builder() .functionName(“HelloLambda”) .code(code.fromAsset(“target/cdkhello-0.1.jar”))//

Java 如何引用AWS云开发工具包中代码中的lambda? import software.amazon.awscdk.services.lambda.Function; 函数helloLambda=新函数(helloStack,“hellocdkworld123”,FunctionProps.builder() .functionName(“HelloLambda”) .code(code.fromAsset(“target/cdkhello-0.1.jar”))//,java,amazon-web-services,aws-cdk,clouddevelopmentkit,Java,Amazon Web Services,Aws Cdk,Clouddevelopmentkit,首先,假设调用Lambda时要执行的方法是sayHello,来自com.myorg.functions.HelloLambda类,那么解决方案的这一部分是正确的。更困难的部分实际上是使用Lambda代码访问JAR 注意:我已经用我认为更好的方法更新了我的原始答案。为了避免混淆和使此答案过于冗长,我删除了原始答案,尽管其中大部分答案与此答案很常见。我对帮助改进此答案表示感谢 将依赖资源的JAR的路径传递给CDK 太长,读不下去了 为Lambda JAR的完整路径创建一个新属性 将依赖性和执行相关

首先,假设调用Lambda时要执行的方法是
sayHello
,来自
com.myorg.functions.HelloLambda
类,那么解决方案的这一部分是正确的。更困难的部分实际上是使用Lambda代码访问JAR

注意:我已经用我认为更好的方法更新了我的原始答案。为了避免混淆和使此答案过于冗长,我删除了原始答案,尽管其中大部分答案与此答案很常见。我对帮助改进此答案表示感谢

将依赖资源的JAR的路径传递给CDK 太长,读不下去了
  • 为Lambda JAR的完整路径创建一个新属性
  • 将依赖性和执行相关目标关联到构建的
    阶段
  • 更新
    cdk.json
    以指向
    阶段
  • 通过系统属性将完整路径传递给CDK代码
  • 使用系统属性传递到
    code.asset(…)
准备工作 我已经将Lambda和CDK基础设施代码分离成单独的Maven模块,目的是一旦Lambda代码被编译,打包成一个uber JAR(它的代码加上所有依赖项的代码),基础结构模块可以将其称为依赖项,将Lambda JAR的完整路径传递给App/Stack类,以便将其用作资产

为Lambda JAR的完整路径创建一个新属性。 在
pom.xml
的properties部分中,创建一个新属性来引用Lambda JAR。如下所示:

import software.amazon.awscdk.services.lambda.Function;

Function helloLambda = new Function(helloStack, "hellocdkworld123", FunctionProps.builder()
              .functionName("HelloLambda")
              .code(Code.fromAsset("target/cdkhello-0.1.jar")) // <- x ?
              .runtime(Runtime.JAVA_8)
              .handler("com.myorg.functions.HelloLambda::sayHello") <- y?
              .build());

...
${GROUP\u ID:ARTIFACT\u ID:jar}
...
使用依赖插件,使用Lambda依赖项的JAR的完整路径填充属性。

...
org.apache.maven.plugins
maven依赖插件
3.1.1
性质
包裹
...
这将
属性
目标与
流程资源
阶段相关联。每当构建阶段发生时,您先前创建的属性将填充到本地存储库中JAR的完整路径

将依赖关系和执行相关目标关联到构建的单个阶段。 当您创建一个新的CDK Java项目时,它会输出一个名为
CDK.json
的文件,默认情况下该文件指向Maven
exec:Java
目标。为了正确填充新的
lambda.jar
属性,您需要将
exec:Java
目标与上述相同的阶段相关联


...
org.codehaus.mojo
execmaven插件
1.6.0
JAVA
包裹
com.myorg.TestingApp
...
为了让您的代码能够访问您生成的JAR文件,您需要为您的应用程序类创建一个系统属性(我无法让环境变量工作)。您的
pom.xml
从以下内容开始:

import software.amazon.awscdk.services.lambda.Function;

Function helloLambda = new Function(helloStack, "hellocdkworld123", FunctionProps.builder()
              .functionName("HelloLambda")
              .code(Code.fromAsset("target/cdkhello-0.1.jar")) // <- x ?
              .runtime(Runtime.JAVA_8)
              .handler("com.myorg.functions.HelloLambda::sayHello") <- y?
              .build());
通过系统属性将完整路径传递给CDK代码。 在配置部分(在
mainClass
之后),为资产目录添加一个系统属性,如下所示:

import software.amazon.awscdk.services.lambda.Function;

Function helloLambda = new Function(helloStack, "hellocdkworld123", FunctionProps.builder()
              .functionName("HelloLambda")
              .code(Code.fromAsset("target/cdkhello-0.1.jar")) // <- x ?
              .runtime(Runtime.JAVA_8)
              .handler("com.myorg.functions.HelloLambda::sayHello") <- y?
              .build());

lambda.jar
${lambda.jar}
更新
cdk.json
以指向您使用的公共阶段。 您的cdk项目的
cdk.json
应该更改为指向
流程资源
阶段。一旦完成,它将如下所示:

import software.amazon.awscdk.services.lambda.Function;

Function helloLambda = new Function(helloStack, "hellocdkworld123", FunctionProps.builder()
              .functionName("HelloLambda")
              .code(Code.fromAsset("target/cdkhello-0.1.jar")) // <- x ?
              .runtime(Runtime.JAVA_8)
              .handler("com.myorg.functions.HelloLambda::sayHello") <- y?
              .build());
它将导致两个目标相继运行,并且在执行时,Lambda的JAR的路径将作为系统属性传递

从应用程序/堆栈代码访问属性。 最后,现在已经创建了系统属性,您可以通过调用
system.getProperty(“lambda.jar”)
从代码中访问它

import software.amazon.awscdk.services.lambda.Function;

Function helloLambda = new Function(helloStack, "hellocdkworld123", FunctionProps.builder()
              .functionName("HelloLambda")
              .code(Code.fromAsset("target/cdkhello-0.1.jar")) // <- x ?
              .runtime(Runtime.JAVA_8)
              .handler("com.myorg.functions.HelloLambda::sayHello") <- y?
              .build());
final code=code.fromAsset(System.getProperty(“lambda.jar”);

然后,在定义Lambda函数时,您可以在任何需要的地方使用代码引用。

引用生成的bucket的用例是什么?我认为
代码的全部目的。
选项让您不必关心bucket和文件名。如果您是deplo,则可以通过S3引用Lambda代码在其他系统/应用程序中将Lamda代码复制到S3。问题是要让任何东西都正常工作。我根本不知道如何引用我的lambda并使其正常工作。当执行上面声明的lambda时,我在aws控制台中获取类not found exception。