Развертывание лямбда-функции с использованием CodePipeline и шаблона CloudFormation, созданного CDK - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть функция Lambda, которую я пытаюсь развернуть с помощью CodePipeline.

Исходный код функции Lambda находится в том же проекте, что и приложение Lambda CDK. Поскольку оба они находятся в одном и том же хранилище, приложение CDK может ссылаться на исходный код Lambda напрямую.

В документах предлагается использовать lambda.Code.fromAsset(path), когда приложение CDK может напрямую ссылаться на код Lambda, поэтому я начал со следующегоопределение для моей лямбда-функции.

const fn = new lambda.Function(this, "Fn", {
  code: lambda.Code.fromAsset(path/to/lambda/source),
  handler: "index.handler",
  runtime: lambda.Runtime.NODEJS_10_X
});

В CodePipeline я использую CodeBuild для запуска cdk synth и синтезирую шаблон CloudFormation.

Проблема с определением моей лямбды таким образом заключается вВ шаблоне CloudFormation есть параметры для корзины с исходным кодом Lambda и ключ, которые кажутся случайными, например, AssetParameters3ffd...affdS3Bucket1CFF873D

Когда вы запускаете cdk deploy, CLI знает, что это за параметры, и заполняет их значениями.

В моем случае, однако, я не использую cdk deploy. Я хочу использовать CloudFormation в CodePipeline.

Это означает, что мне нужно заполнить параметры значениями для исходного артефакта Lambda, который выводится из моего шага CodeBuild. Получить значения легко, но у меня нет возможности узнать, как называются параметры.

Затем я попытался использовать следующее для определения имен параметров самостоятельно.

const fn = new lambda.Function(this, "Fn", {
  code: lambda.Code.fromCfnParameters({
    bucketNameParam: new core_1.CfnParameter(this, "LambdaSourceBucket"),
    objectKeyParam: new core_1.CfnParameter(this, "LambdaSourceKey"),
  }),
  handler: "index.handler",
  runtime: lambda.Runtime.NODEJS_10_X
});

Не повезло. cdk synth все еще изменяет имена параметров в шаблоне, например, AppLambdaSourceBucket8B89D730. Это лучше, чем раньше, но я все еще не могу быть уверен, какие параметры будут названы, поэтому я могу назначить их в моей CodePipeline.

Я не могу использовать lambda.Code.fromBucket(bucket, key), потому что ведро и ключ определяютсяCodePipeline / CodeBuild.

Я нашел этот пример, который делает почти то же самое, что и я, за исключением того, что их CodePipeline определен в том же приложении CDK, что и их функция Lambda. Это позволяет избежать проблемы, с которой я сталкиваюсь, потому что определение Lambda и определение CodePipeline могут ссылаться на один и тот же CfnParametersCode экземпляр.

К сожалению, я не могу совмещать свое определение CodePipeline с моей Lambda, как онисделано в этом примере. Я чувствую, что это все еще возможно без этого.

Чего мне не хватает?

1 Ответ

0 голосов
/ 10 ноября 2019

Я могу сделать это с new CfnParametersCode (что должно быть эквивалентно фабричному методу, который вы вызываете). Возможно, вы создаете это внутри другой конструкции, а не на уровне стека?

...