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”))//
首先,假设调用Lambda时要执行的方法是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的完整路径创建一个新属性 将依赖性和执行相关
sayHello
,来自com.myorg.functions.HelloLambda
类,那么解决方案的这一部分是正确的。更困难的部分实际上是使用Lambda代码访问JAR
注意:我已经用我认为更好的方法更新了我的原始答案。为了避免混淆和使此答案过于冗长,我删除了原始答案,尽管其中大部分答案与此答案很常见。我对帮助改进此答案表示感谢
将依赖资源的JAR的路径传递给CDK
太长,读不下去了
- 为Lambda JAR的完整路径创建一个新属性
- 将依赖性和执行相关目标关联到构建的
阶段包
- 更新
以指向cdk.json
阶段包
- 通过系统属性将完整路径传递给CDK代码
- 使用系统属性传递到
code.asset(…)
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
的文件,默认情况下该文件指向Mavenexec: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。