gpt4 book ai didi

java - 如何从 AWS 云开发套件中的代码引用我的 lambda?

转载 作者:行者123 更新时间:2023-12-02 09:23:57 25 4
gpt4 key购买 nike

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());

还可以通过 S3 存储桶引用它。但是当我运行 cdk bootstrap 时,我得到一个生成的存储桶,其中包含生成的 jar 文件名称。我应该如何能够从代码中提前引用它?当然,现在我可以编写确切的存储桶+文件,但是从代码中定义它的目的就丢失了,对吗?

最佳答案

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

注意:我已经用我认为更好的方法来更新我的原始答案。为了避免混淆并使这个答案过于冗长,我删除了原来的答案,尽管其中大部分内容与这个答案很常见。我信用this answer帮助改进这个答案。

将依赖资源的 JAR 路径传递给 CDK

TL;DR

  • 为 Lambda JAR 的完整路径创建一个新属性。
  • 将依赖项和执行相关目标关联到构建的package 阶段。
  • 更新 cdk.json 以指向 package 阶段。
  • 通过系统属性将完整路径传递给您的 CDK 代码。
  • 使用系统属性传递给 Code.asset(...)

准备工作

我已将 Lambda 和 CDK 基础设施代码分离到单独的 Maven 模块中。目的是,一旦 Lambda 代码被编译并打包成 uber JAR(其代码加上所有依赖项的代码),基础设施模块就可以将其作为依赖项引用,将 Lambda JAR 的完整路径传递给App/Stack 类,它可以将其用作 Assets 。

为 Lambda JAR 的完整路径创建一个新属性。

pom.xml 的属性部分中,创建一个新属性来引用您的 Lambda JAR。像这样的事情:

<properties>
...
<lambda.jar>${GROUP_ID:ARTIFACT_ID:jar}</lambda.jar>
...
</properties>

使用依赖项插件,使用 Lambda 依赖项 JAR 的完整路径填充属性。

<build>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<goals>
<goal>properties</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
...
<plugins>
</build>

这将properties目标与process-resources阶段相关联。每当构建的该阶段发生时,您之前创建的属性都将使用本地存储库中 JAR 的完整路径进行填充。

将依赖项和执行相关目标关联到构建的单个阶段。

当您创建新的 CDK Java 项目时,它会输出一个名为 cdk.json 的文件,该文件默认指向 Maven exec:java 目标。为了正确填充新的 lambda.jar 属性,您需要将 exec:java 目标与上述相同的阶段相关联。

<build>
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
<configuration>
<mainClass>com.myorg.TestingApp</mainClass>
</configuration>
</plugin>
...
</plugins>
</build>

为了让您的代码能够访问您生成的 JAR 文件,您需要为您的 App 类创建一个系统属性(我无法让环境变量起作用)。您的 pom.xml 开头是这样的:

通过系统属性将完整路径传递给您的 CDK 代码。

在配置部分(mainClass 之后),为您的 Assets 目录添加一个系统属性,如下所示:

<systemProperties>
<systemProperty>
<key>lambda.jar</key>
<value>${lambda.jar}</value>
</systemProperty>
</systemProperties>

更新 cdk.json 以指向您使用过的公共(public)阶段。

CDK 项目的 cdk.json 应更改为指向 process-resources 阶段。完成后,它将如下所示:

{
"app": "mvn package"
}

这将导致两个目标连续运行,并且在执行时,Lambda JAR 的路径将作为系统属性传递。

从您的应用程序/堆栈代码访问该属性。

最后,现在系统属性已创建,您可以通过调用 System.getProperty("lambda.jar") 从代码中访问它。像这样的事情:

final Code code = Code.fromAsset(System.getProperty("lambda.jar"));

然后,您可以在定义 Lambda 函数时根据需要使用代码引用。

关于java - 如何从 AWS 云开发套件中的代码引用我的 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58477233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com