我想通过Lambda函数部署AWS CDK堆栈。该用例将支持与Trek10's Serverless CI/CD pipeline中描述的功能类似的功能,其中相关代码为here。
简而言之,AWS CodePipelines仅支持监听单个Git分支中的更改。我想听听与回购和分支创建有关的GitHub事件,并响应这些事件创建CodePipeline实例,以便每个Git存储库的每个分支都有一个管道。我希望Lambda听GitHub事件并创建CDK堆栈。 Trek10示例使用Python并直接调用CloudFormation。我希望Lambda更加简单,而改用CDK。这是一个使用Typescript的简单Lambda,它是从AWS CDK issue派生的:
// 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的最简单的工作示例是什么?
答案 0 :(得分:1)
您最终如何打包cdk在lambda中运行?是通过层完成的,还是有一种更简单的方法?
答案 1 :(得分:0)
最近,我在Lambda中有一个CDK部署程序的理想用例,但是找不到如何执行此操作的完整示例。 我使用kadishmal example from CDK Github设法将CDK放入Lambda层,从那里删除AWS SDK模块(Lambda已经拥有),将其包含在Lambda中,然后从那里运行CDK部署/销毁。 Lambda及其所有图层的大小限制为250mb,因此我还必须使用Webpack来优化构建大小。
Here a Github repository的基本示例-部署S3存储桶并销毁它的堆栈模板。