通过GitHub Actions部署Lambda函数时遇ValidationException错误
GitHub Actions部署AWS Lambda遇Layers验证错误解决方案
问题重现
使用以下GitHub Actions工作流部署Lambda函数:
name: Deploy TFM_dev to aws lambda on: push: branches: - mybranch jobs: deploy_source: name: deploy lambda from source environment: DEV runs-on: ubuntu-latest steps: - name: checkout source code uses: actions/checkout@v1 - name: Zip run: cd src && zip -r function.zip . - name: default deploy uses: appleboy/lambda-action@master with: aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws_region: ${{ vars.AWS_REGION }} function_name: mylambda zip_file: src/function.zip
部署时持续返回如下验证错误:
ValidationException: 1 validation error detected: Value '[]' at 'layers' failed to satisfy constraint: Member must satisfy constraint: [Member must have length less than or equal to 140, Member must have length greater than or equal to 1, Member must satisfy regular expression pattern: (arn:[a-zA-Z0-9-]+:lambda:[a-zA-Z0-9-]+:\d{12}:layer:[a-zA-Z0-9-_]+:[0-9]+)|(arn:[a-zA-Z0-9-]+:lambda:::awslayer:[a-zA-Z0-9-_]+), Member must not be null]
已知该工作流在另一个Lambda函数上可正常运行(使用完全相同的层),目标Lambda函数本身测试正常,更换自定义层版本后错误依旧,不清楚如何设置layers参数,同时疑惑为何另一个部署无需设置该参数。
原因分析
appleboy/lambda-action@master版本的默认行为发生了变化:未显式指定layers参数时,该Action会向AWS Lambda API传递空数组[],而AWS API要求若传入layers数组,每个元素必须是有效的层ARN,不允许空数组存在。- 另一个Lambda函数可能在部署前已通过控制台、CLI等方式配置了层,且旧版本的
lambda-action不会主动传递layers参数(保留原有层配置),当前master分支版本强制传递空数组触发了验证错误。
解决方法
方法1:显式指定有效层ARN
在部署步骤的with字段中添加layers参数,填入目标Lambda需要的层ARN,多个ARN用逗号分隔:
- name: default deploy uses: appleboy/lambda-action@master with: aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws_region: ${{ vars.AWS_REGION }} function_name: mylambda zip_file: src/function.zip layers: "arn:aws:lambda:us-east-1:123456789012:layer:custom-layer:3,arn:aws:lambda:::awslayer:AmazonLinux2-Python3.11"
注意ARN格式必须严格符合AWS要求:自定义层ARN为arn:aws:lambda:<区域>:<账号ID>:layer:<层名>:<版本号>,AWS官方层ARN为arn:aws:lambda:::awslayer:<层名>。
方法2:使用稳定版本的Action,避免传递空数组
将appleboy/lambda-action@master替换为该Action的稳定历史版本(比如@v0.2.0,可根据Action发布历史选择合适版本),旧版本通常不会在未指定layers时传递空数组,从而保留Lambda原有层配置:
- name: default deploy uses: appleboy/lambda-action@v0.2.0 with: aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws_region: ${{ vars.AWS_REGION }} function_name: mylambda zip_file: src/function.zip
方法3:确认目标Lambda层配置有效性
检查目标Lambda当前的层配置,确保所有层ARN格式正确、处于可用状态,且与部署使用的AWS账号、区域一致。若Lambda无需层,可先在控制台移除所有层,再重新运行部署工作流。
内容的提问来源于stack exchange,提问作者tiff
相关产品推荐
相关产品推荐

