AWS CDKをLambdaレイヤーとしてバンドルするための最良の方法は何ですか?
JavaプロセスからCDKを呼び出す必要があるため、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
ので、これを同様の方法でバンドルする最善の方法がわかりません。
最終的にDockerコンテナーを使用してaws-cdk
モジュールを特定のパスにインストールし、コンテナーを圧縮してバインドマウントされたディレクトリにコピーし、基になるホストで使用できるようにしました。
Gradleとgradle-docker-plugin
BenMuschkoによるプロジェクトを作成しました。ビルドを高速化するために、より小さなノードイメージを使用しようとして時間を費やしたことはありません。
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();
注意すべき点:
cdk
それ自体で問題が発生します。--symlinks
オプションを使用することが重要です。そうしないと、cdk
実行可能ファイルがcdk.js
ファイルを見つけることができません。tar
ファイルを圧縮するためにを使用することをお勧めしますが、fromAsset()
tarファイルは受け入れません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加