首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以从Lambda中部署AWS CDK堆栈?

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

Stack Overflow用户
提问于 2019-11-10 01:34:14
回答 3查看 2.1K关注 0票数 9

我想使用Lambda函数从部署AWS CDK堆栈。用例是支持与Trek10's Serverless CI/CD pipeline中描述的功能类似的功能,其中相关代码为here

简而言之,亚马逊网络服务CodePipelines只支持监听单个Git分支内的变化。我想要监听与创建存储库和分支相关的GitHub事件,并创建CodePipeline实例来响应这些事件,以便每个Git存储库的每个分支都有一个管道。我想要一个Lambda来监听GitHub事件并创建CDK栈。Trek10示例使用Python并直接调用CloudFormation。我希望Lambdas更简单,并使用CDK。

下面是一个简单的Lambda,它使用从这个AWS CDK issue派生的Typescript

代码语言:javascript
复制
// 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;
    }

};

但是,我得到了上面提到的问题中描述的错误:

代码语言:javascript
复制
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.tshttps://github.com/aws/aws-cdk/blob/master/packages/aws-cdk/lib/api/util/sdk.ts#L92,因为这似乎是一个非常糟糕的解决方案,所以我正在寻找另一个解决方案。

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

EN

回答 3

Stack Overflow用户

发布于 2019-11-21 07:47:32

你是怎么把cdk打包在lambda里面运行的呢?这是通过层完成的,还是有更简单的方法?

票数 2
EN

Stack Overflow用户

发布于 2020-10-24 20:21:16

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

使用一个基本的示例--部署并销毁S3存储桶的堆栈模板。

票数 1
EN

Stack Overflow用户

发布于 2021-08-25 23:25:36

我创建了this repository,它使用Gradle & Docker的5分钟方法在目标位置安装CDK,并将Lambda Layer压缩文件挂载到您的本地系统上,您可以直接使用它在AWS控制台中手动上传,或者使用CDK。

一个带有NodeJS运行时和附加了层的示例Lambda处理函数看起来如下所示:

代码语言:javascript
复制
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());
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58781821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档