GitHub Actions执行SAM部署测试时遇InvalidSignatureException错误求助
解决GitHub Actions中pytest调用DynamoDB的InvalidSignatureException错误
问题概述
按照视频步骤搭建AWS SAM部署的Python后端CI/CD流水线,推送main.yml后,GitHub Actions执行pytest时触发签名不匹配错误:
botocore.exceptions.ClientError: An error occurred (InvalidSignatureException) when calling the GetItem operation: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.
排查与修复步骤
1. 验证AWS凭证正确性
- 检查GitHub仓库Secrets中存储的
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY是否与AWS控制台生成的凭证完全一致,避免多余空格、换行符或复制错误。 - 若Secret Key丢失,重新生成AWS访问密钥并更新GitHub Secrets(Secret Key仅在生成时可见,无法找回)。
2. 配置IAM权限
确保GitHub Actions使用的IAM用户拥有DynamoDB表的必要操作权限,建议创建最小权限的自定义策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["dynamodb:GetItem", "dynamodb:PutItem"], "Resource": "arn:aws:dynamodb:us-east-1:你的AWS账户ID:table/resume-website-app-tbl" } ] }
将该策略附加到目标IAM用户,避免使用过度宽泛的权限(如AmazonDynamoDBFullAccess)。
3. 确认区域一致性
- 检查DynamoDB表是否位于
us-east-1区域(与main.yml中AWS_DEFAULT_REGION设置一致)。 - app.py中boto3依赖环境变量获取区域,测试环节已配置
AWS_DEFAULT_REGION,无需额外修改,但需确保表的区域与配置完全匹配。
4. 优化代码逻辑(辅助修复)
- 移除硬编码表名:app.py中直接写死表名,改为从环境变量读取,与测试逻辑对齐:
import os table_name = os.environ.get('TABLENAME', 'resume-website-app-tbl') table = dynamodb.Table(table_name) - 修正返回格式:原app.py返回纯数字字符串,与test_handler.py中对
visit_count字段的断言不匹配,需改为返回JSON格式:
同时添加异常捕获,确保错误时返回符合断言的格式:'body': json.dumps({"visit_count": visit_count})try: # 原业务逻辑 except Exception as e: return { 'statusCode': 500, 'headers': { 'Access-Control-Allow-Headers': '*', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': '*' }, 'body': json.dumps({"visit_count": -1}) }
验证修复
完成上述步骤后,重新推送代码触发GitHub Actions流水线,确认pytest测试通过,签名错误消失。
内容的提问来源于stack exchange,提问作者Justin Henson
相关产品推荐
相关产品推荐

