当前位置: 首页 > 知识库问答 >
问题:

是否可以从Lambda内部部署AWS CDK堆栈?

欧阳英彦
2023-03-14

我想用Lambda函数部署AWS CDK堆栈。用例是支持类似于Trek10无服务器CI/CD管道中描述的功能,相关代码如下。

简而言之,AWS代码管道仅支持在单个Git分支中侦听更改。我想听听与创建repo和分支相关的GitHub事件,并创建代码管道实例来响应这些事件,以便每个Git存储库的每个分支都有一个管道。我想要一个Lambda来监听GitHub事件并创建CDK堆栈。Trek10示例使用Python并直接调用CloudFormation。我希望Lambdas更简单,使用CDK代替。

下面是一个简单的Lambda,使用从AWS CDK问题派生的Typecript:

// index.ts
import {ScheduledEvent} from 'aws-lambda';
import {CloudFormationDeploymentTarget, DEFAULT_TOOLKIT_STACK_NAME} from 'aws-cdk/lib/api/deployment-target';
import {CdkToolkit} from 'aws-cdk/lib/cdk-toolkit';
import {AppStacks} from 'aws-cdk/lib/api/cxapp/stacks';
import {Configuration} from 'aws-cdk/lib/settings';
import {execProgram} from "aws-cdk/lib/api/cxapp/exec";
import * as yargs from 'yargs';
import {SDK} from 'aws-cdk/lib/api/util/sdk';
export const handleCloudWatchEvent = async (event: ScheduledEvent): Promise<void> => {
    try {
        const aws = new SDK();
        const argv = await yargs.parse(['deploy', '--app', 'bin/pipeline.js', '--staging', '/tmp', '--verbose', '--require-approval', 'never']);

        const configuration = new Configuration(argv);
        await configuration.load();
        const appStacks = new AppStacks({
            configuration,
            aws,
            synthesizer: execProgram,
        });

        const provisioner = new CloudFormationDeploymentTarget({ aws });
        const cli = new CdkToolkit({ appStacks, provisioner });
        const toolkitStackName = configuration.settings.get(['toolkitStackName']) || DEFAULT_TOOLKIT_STACK_NAME;

        await cli.deploy({
            stackNames: [],
            exclusively: argv.exclusively as boolean,
            toolkitStackName,
            roleArn: argv.roleArn as string,
            requireApproval: configuration.settings.get(['requireApproval']),
            ci: true,
            reuseAssets: argv['build-exclude'] as string[],
            sdk: aws
        });

        return;
    } catch (e) {
        console.error(e);
        return;
    }

};

但是,我得到一个错误,如上面提到的问题所述:

ERROR   { Error: Cannot find module '../package.json'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
    at Function.Module._load (internal/modules/cjs/loader.js:562:25)
    at Module.require (internal/modules/cjs/loader.js:692:17)
    at new SDK (/var/task/node_modules/aws-cdk/lib/api/util/sdk.ts:92:39)
    at Runtime.exports.handleCloudWatchEvent [as handler] (/resources/index.ts:204:21)
    at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)
    at process._tickCallback (internal/process/next_tick.js:68:7) code: 'MODULE_NOT_FOUND' }

我不想修补sdk.ts:https://github.com/aws/aws-cdk/blob/master/packages/aws-cdk/lib/api/util/sdk.ts#L92因为这似乎是一个非常肮脏的解决方案,所以我正在寻找另一个解决方案。

从Lambda函数中调用CDK的最简单工作示例是什么?

共有3个答案

常温文
2023-03-14

我创建了这个存储库,它使用Gradle的5分钟方法

带有NodeJS运行时和附加层的示例Lambda处理程序函数如下所示:

exports.handler = async (event) => {
    const spawnSync = require('child_process').spawnSync;
    const process = spawnSync('cdk', ['--version'], {
        stdio: 'pipe',
        stderr: 'pipe'
    });
    console.log(process.status);
    console.log(process.stdout.toString());
};
洪研
2023-03-14

最近,我在Lambda中有一个CDK部署器的理想用例,但找不到任何好的和完整的例子来说明如何做到这一点。使用CDK Github中的kadishmal示例,我成功地将CDK放入Lambda层,从那里删除AWS SDK模块(Lambda已经有了它),将其包含到Lambda中,并从那里运行CDK部署/销毁。Lambda及其250mb的所有层都有大小限制,因此我还必须使用Webpack来优化构建大小。

这里是一个Github存储库,其中包含一个基本示例—一个部署S3 bucket并销毁它的堆栈模板。

西门洛城
2023-03-14

你最后是怎么打包cdk在lambda内部运行的?这是通过层完成的,还是有更简单的方法?

 类似资料:
  • 是否可以在 VNet 中部署 Azure 函数? 如果我在 VNet 中创建了应用服务环境,然后在创建函数时选取了该应用服务计划,这是否意味着 Azure 函数部署在 VNet 内部,并具有与 VNet 定义的相同限制等?

  • 在IDE中构建并运行良好: 但在“CLI”中失败: 最简单的项目: 这里是: 如何从CLI构建和运行这个项目? 类似于: Maven:运行程序的生命周期阶段?

  • 问题内容: 修改中的局部变量会产生编译错误: 正常 与Lambda 任何想法如何解决这个问题? 问题答案: 任何一种包装纸都是好的。 对于 Java 8+ ,请使用: …或数组: 使用 Java 10+ : 注意: 如果使用并行流, 请 非常小心。您可能无法获得预期的结果。诸如Stuart的其他解决方案可能更适合这些情况。 对于除 当然,这对于之外的其他类型仍然有效。您只需要将包装类型更改为或该类

  • 在中修改局部变量会导致编译错误: 典型的 和Lambda 你知道怎么解决这个问题吗?

  • 我正在努力使倒计时功能,这将停止时,计时器达到0。到目前为止发生的是,当计时器到达0(我没有按任何键)时,它一直向我发送默认的消息,直到我单击一个按钮,它才停止。 我想在中插入一些代码,这将停止计时器(一旦它为零,显示消息并停止向我发送垃圾邮件)。我已经尝试了等的多个变体。 当前上下文中不存在名称“计时器”。 代码:

  • 直到今天,我才知道java有堆,堆是由JVM创建的。此外,这个内存是由操作系统分配给JVM实例的,即堆驻留在JVM实例中。 这表明,JVM和堆相距甚远。 所以,我现在很困惑,有谁能让我知道,我以前是错的还是我不能理解这幅画?