M1 Mac上如何让CDK为x86_64打包Lambda层以统一资产哈希值?
解决M1 MacBook与GitHub Actions上CDK快照测试资产哈希不一致问题
问题背景
在M1 MacBook本地和GitHub Actions环境中运行CDK快照测试时,出现资产哈希值不一致的情况。对比两地生成的cdk.out目录后,发现差异源于Lambda层的资产打包:
- 本地打包时,
charset_normalizer安装的是aarch64架构的库文件(md.cpython-310-aarch64-linux-gnu.so等) - GitHub Actions打包时,对应文件为x86_64架构版本(
md.cpython-310-x86_64-linux-gnu.so等)
曾尝试在BundlingOptions中指定platform: 'linux/amd64',但未解决问题。
根本原因
仅在CDK的bundling配置中指定平台无效,因为构建Docker镜像时未指定目标架构。M1 MacBook默认构建arm64架构的镜像,容器内运行pip时会下载对应arm架构的依赖库,导致本地打包产物与GitHub Actions(x86_64环境)的产物存在差异。
解决方案
需要在两个层面指定x86_64架构:构建Docker镜像时指定平台,同时保留bundling阶段的平台配置。
修改CDK代码中的镜像构建配置
在cdk.DockerImage.fromBuild方法中添加platform参数,强制构建amd64架构的镜像:
const lambdaLayer = new lambda.LayerVersion(this, 'layer', { code: Code.fromAsset(pathToLayerSource, { bundling: { image: cdk.DockerImage.fromBuild(pathToLayerSource, { file: 'Dockerfile', platform: 'linux/amd64' // 关键:构建镜像时指定amd64平台 }), command: ['bash', '-c', 'rsync -a --exclude Pipfile /tmp/build/ /asset-output'], platform: 'linux/amd64', // 确保bundling容器以amd64架构运行 }, }), description: `Layer for ${Generator.SERVICE_NAME} stack`, layerVersionName: commons.getIdentifierForStage(Generator.SERVICE_NAME), });
验证效果
修改后重新在本地执行CDK打包,检查Lambda层的python目录下的charset_normalizer相关文件,确认已变为x86_64架构的版本。此时本地生成的资产哈希值应与GitHub Actions环境一致,快照测试可正常通过。
内容的提问来源于stack exchange,提问作者oschlueter
相关产品推荐
相关产品推荐

