如何从 AWS 云开发工具包中的代码引用我的 lambda?
How do I reference my lambda from code in AWS Cloud Development Kit?
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 bucket引用。但是当我 运行 cdk bootstrap 时,我得到了一个带有生成的 jar 文件名称的存储桶。我应该如何能够事先从代码中引用它?当然,现在我可以编写确切的存储桶 + 文件,但是从代码中定义它的目的就丢失了吗?
首先,假设调用Lambda时要执行的方法是sayHello
,来自com.myorg.functions.HelloLambda
class,那么你的那部分解决方案是正确的。更困难的部分实际上是使用您的 Lambda 代码访问 JAR。
注意: 我已经用我认为更好的方法更新了我的原始答案。为了避免混淆和使这个答案过于冗长,我删除了原来的答案,尽管其中大部分与这个答案很常见。我感谢 this answer 帮助改进了这个答案。
将依赖资源的 JAR 路径传递给 CDK
TL;DR
- 为您的 Lambda JAR 的完整路径创建一个新的 属性。
- 将依赖和执行相关的目标关联到构建的
package
阶段。
- 更新
cdk.json
以指向 package
阶段。
- 通过系统 属性 将完整路径传递给您的 CDK 代码。
- 使用系统 属性 传递给
Code.asset(...)
。
准备
我已经将 Lambda 和 CDK 基础设施代码分离到单独的 Maven 模块中。目的是一旦 Lambda 代码被编译,打包成一个超级 JAR(它的代码加上它的所有依赖项的代码),基础设施模块可以将它作为依赖项引用,将 Lambda JAR 的完整路径传递给App/Stack class 可以将其用作资产。
为您的 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 文件,您需要为您的应用程序创建一个系统 属性(我无法让环境变量工作)class。您的 pom.xml
开头是这样的:
通过系统 属性 将完整路径传递给您的 CDK 代码。
在配置部分(在 mainClass
之后),为您的资产目录添加一个系统 属性,如下所示:
<systemProperties>
<systemProperty>
<key>lambda.jar</key>
<value>${lambda.jar}</value>
</systemProperty>
</systemProperties>
更新 cdk.json
以指向您使用的公共阶段。
您的 CDK 项目的 cdk.json
应该更改为指向 process-resources
阶段。完成后将如下所示:
{
"app": "mvn package"
}
它将导致两个目标连续 运行,并且在执行时,您的 Lambda 的 JAR 的路径将作为系统 属性.
传递
通过您的 App/Stack 代码访问 属性。
最后,现在系统 属性 已创建,您可以通过调用 System.getProperty("lambda.jar")
从您的代码中访问它。像这样:
final Code code = Code.fromAsset(System.getProperty("lambda.jar"));
然后,您可以在定义 Lambda 函数时根据需要使用代码参考。
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 bucket引用。但是当我 运行 cdk bootstrap 时,我得到了一个带有生成的 jar 文件名称的存储桶。我应该如何能够事先从代码中引用它?当然,现在我可以编写确切的存储桶 + 文件,但是从代码中定义它的目的就丢失了吗?
首先,假设调用Lambda时要执行的方法是sayHello
,来自com.myorg.functions.HelloLambda
class,那么你的那部分解决方案是正确的。更困难的部分实际上是使用您的 Lambda 代码访问 JAR。
注意: 我已经用我认为更好的方法更新了我的原始答案。为了避免混淆和使这个答案过于冗长,我删除了原来的答案,尽管其中大部分与这个答案很常见。我感谢 this answer 帮助改进了这个答案。
将依赖资源的 JAR 路径传递给 CDK
TL;DR
- 为您的 Lambda JAR 的完整路径创建一个新的 属性。
- 将依赖和执行相关的目标关联到构建的
package
阶段。 - 更新
cdk.json
以指向package
阶段。 - 通过系统 属性 将完整路径传递给您的 CDK 代码。
- 使用系统 属性 传递给
Code.asset(...)
。
准备
我已经将 Lambda 和 CDK 基础设施代码分离到单独的 Maven 模块中。目的是一旦 Lambda 代码被编译,打包成一个超级 JAR(它的代码加上它的所有依赖项的代码),基础设施模块可以将它作为依赖项引用,将 Lambda JAR 的完整路径传递给App/Stack class 可以将其用作资产。
为您的 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 文件,您需要为您的应用程序创建一个系统 属性(我无法让环境变量工作)class。您的 pom.xml
开头是这样的:
通过系统 属性 将完整路径传递给您的 CDK 代码。
在配置部分(在 mainClass
之后),为您的资产目录添加一个系统 属性,如下所示:
<systemProperties>
<systemProperty>
<key>lambda.jar</key>
<value>${lambda.jar}</value>
</systemProperty>
</systemProperties>
更新 cdk.json
以指向您使用的公共阶段。
您的 CDK 项目的 cdk.json
应该更改为指向 process-resources
阶段。完成后将如下所示:
{
"app": "mvn package"
}
它将导致两个目标连续 运行,并且在执行时,您的 Lambda 的 JAR 的路径将作为系统 属性.
传递通过您的 App/Stack 代码访问 属性。
最后,现在系统 属性 已创建,您可以通过调用 System.getProperty("lambda.jar")
从您的代码中访问它。像这样:
final Code code = Code.fromAsset(System.getProperty("lambda.jar"));
然后,您可以在定义 Lambda 函数时根据需要使用代码参考。