AWS CDK Java - 文件上传到 S3

AWS CDK Java - File Upload to S3

我正在使用 AWS CDK (Java) 通过以下代码将我的 lambda 上传到 S3。我不希望 CDK 解压我的 jar 文件。这似乎是实现此目的的唯一方法(它确实有效),但它在 AssetOptions.builder().exclude() 上使用了已弃用的代码。在 Java 中是否有更好的方法可以在不使用弃用代码的情况下执行此操作?

List<ISource> lambdaSources = new ArrayList<>();
for(String lambda: lambdas) {   
    AssetOptions assetOptions = AssetOptions.builder().exclude(
        Arrays.asList("**", "!" + lambda + "-" + VERSION + SUFFIX)).build();
    lambdaSources.add(Source.asset("../" + lambda + "/build/libs/", assetOptions));
}

我想我可能找到了一种更好的方法,将代码上传与 lambda 创建相结合。如果有更好的方法,我仍然对CDK中专家的想法感兴趣。

顺便说一句,“lambda”只是我创建的一个实体,用于保存我拥有的各种函数的相关属性。

Function.Builder fnBuilder = Function.Builder.create(this, "Builder"); 
 fnBuilder.code(lambda.getCode())
    .functionName(lambda.getName())
    .handler(lambda.getHandler())
    .memorySize(lambda.getSize())
    .role(lambda.constructRole(this))
    .runtime(LambdaDetails.RUNTIME)
    .timeout(lambda.duration())
    .securityGroups(Arrays.asList(lambda.constructSecurityGroup(this)))
    .vpcSubnets(lambda.constructSubnets(this))
    .build();

我不是 CDK 团队的成员,也不是 CDK 专家,我没有具体的 Java 代码可以提供。但是,我在使用 TypeScript CDK 时发现了有关弃用警告的其他上下文,这可能会有所帮助。

TLDR:我选择忽略弃用。原因如下:

AWS CDK 源代码是用 TypeScript 编写的,jsii 用于为其他支持的语言(Java、.NET、Python 等)生成 AWS CDK Construct 库.).我在下面描述的内容应该仍然与 Java.

的 CDK 相关

我同意避免弃用代码通常是一种很好的做法。但该特定弃用警告似乎至少部分是某些 CDK 重构的误导性结果(见下文)。我称它为 'misleading',因为它导致像我这样的一些开发人员(错误地)将其解释为将来不再支持 exclude。由于没有提供明确的替代方案,这非常令人担忧。

然而,在阅读了更多 github 存储库之后,exclude 功能看起来仍然可用并受支持,尽管确切的语法可能会发生变化。

阅读 aws-cdk 源代码后,拉取请求 7708 and 12700 (from only 10 days ago), along with related issues 9447 and 10125,从实际的角度来看,exclude 似乎并没有被弃用。一些评论直接指出了误解。在 TypeScript 源代码中,exclude 正在从 assets 模块中的 AssetOptions(它已被弃用 属性)移动到 CopyOptions(通过 FileOptions) 在 core 模块中(未弃用)。

这里有一个关键点:因为 assets.AssetOptions 继承自 core.CopyOptions —— 而后者又继承自 copy.FileOptions —— excludeAssetOptions 接口...至少对于 CDK V1!

对于 V2,一些人表示他们希望弃用整个资产模块,而不仅仅是将一些共享类型移至核心。我找不到关于最终 V2 更改的明确参考,但我将我所发现的精神解释为我可以安全地继续使用带有 exclude 的 glob 模式来自定义 S3 部署。如果 assets 模块确实在 V2 中消失了,我希望所需的代码更新是次要的——甚至可能像导入 and/or 类型名称更改或两个(当然是 YMMV)一样简单。