Как упаковать AWS CDK в слой Lambda? - PullRequest
1 голос
/ 24 февраля 2020

Каков наилучший способ связать AWS CDK в качестве лямбда-слоя, пожалуйста?

Мне нужно вызвать CDK из Java процесса, поэтому sh для использования Java 11, а затем установите Nodejs и CDK как 2 отдельных слоя. В настоящее время я загружаю Nodejs двоичные файлы и затем использую что-то вроде следующего:

    LayerVersion nodeLayer = LayerVersion.Builder.create(this, "node-layer")
            .description("Layer containing Node.js")
            .code(
                    Code.fromAsset(somePathToNodejs)
            )
            .build();

, а затем обращаюсь к слою в конструкторе / компоновщике Lambda.

CDK устанавливается как npm install -g aws-cdk, поэтому я не знаю, как лучше связать это подобным образом.

1 Ответ

1 голос
/ 25 февраля 2020

В итоге я использовал контейнер Docker для установки модуля aws-cdk в заданный путь c, а затем заархивировал контейнер и скопировал его в каталог, подключенный к привязке, чтобы он был доступен на базовом хосте .

Я построил проект с использованием Gradle и gradle-docker-plugin Бена Мущко. Я не тратил время, пытаясь использовать меньшее изображение Node для ускорения сборки.

task createCdkDockerfile(type: Dockerfile) {
    from 'node:latest'
    defaultCommand('/bin/bash', '-c', "apt-get update && apt-get install -y zip && mkdir -p /nodejs && npm config set prefix /nodejs/bin && npm install -g aws-cdk && pushd /nodejs/bin && zip -r --symlinks /opt/aws-cdk.zip *")
}

task buildCdkImage(type:DockerBuildImage) {
    dependsOn createCdkDockerfile
    images.add('my-aws-cdk:latest')
}

ext.maybeConvertWindowsPath = { path ->
    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        path = "/${path.replace("\\", "/").replace(":", "")}"
    }
    return path
}

task createCdkContainer(type: DockerCreateContainer) {
    def dockerBindDir = new File(buildDir, "docker")
    dockerBindDir.mkdirs()
    dependsOn buildCdkImage
    targetImageId buildCdkImage.getImageId()
    hostConfig.autoRemove = true
    hostConfig.binds = ["${maybeConvertWindowsPath(buildDir.toString())}/docker" : "/opt"]
}

task startCdkContainer(type: DockerStartContainer) {
    dependsOn createCdkContainer
    targetContainerId createCdkContainer.getContainerId()
}

task waitCdkContainer(type: DockerWaitContainer) {
    dependsOn startCdkContainer
    targetContainerId createCdkContainer.getContainerId()
}

Файл zip доступен по адресу ${buildDir}/docker/aws-cdk.zip.

Добавление CDK в качестве слоя согласно примеру Nodejs в моем вопросе, что-то вроде этого:

LayerVersion nodeLayer = LayerVersion.Builder.create(this, "aws-cdk-layer")
        .description("Layer containing AWS CDK")
        .code(
                Code.fromAsset(somePathTo-aws-cdk.zip)
        )
        .build();

Точки, на которые следует обратить внимание:

  • , если основаны на Windows, молнии на Windows, тогда разархивирование на Linux вызовет проблемы с файлами, которые должны быть исполняемыми и больше не исполняемыми, т.е. сам cdk.
  • каталоги привязки при монтировании, кажется, имеют проблемы при Windows, поэтому возникает необходимость для очистки имени файла.
  • при архивировании, важно использовать параметр --symlinks, иначе исполняемый файл cdk не сможет найти файл cdk.js.

Я бы предпочел использовать tar для архивирования файла, но fromAsset() не примет tar-файлы.

...