AWS Lambda 301重定向至Amplify站点后出现401错误求助
问题排查与解决方案
1. CORS头配置冲突
当设置Access-Control-Allow-Credentials: true时,Access-Control-Allow-Origin不能使用通配符*,必须指定具体的Amplify站点域名(比如https://your-amplify-domain.com)。浏览器会拒绝同时包含这两个配置的响应,导致CORS错误,同时可能掩盖真实的401问题。
解决方法:
修改Lambda返回的headers,将Access-Control-Allow-Origin替换为你的Amplify站点域名;如果不需要传递凭证(如Cookie、HTTP认证信息),直接移除Access-Control-Allow-Credentials: true配置即可。
修改后的返回示例:
return { 'statusCode': 301, 'headers': { 'Access-Control-Allow-Origin': 'https://your-amplify-site.example.com', 'Location': location }, }
2. Lambda执行角色权限不足
你的第三个Lambda包含DynamoDB的delete_item操作,而前两个Lambda没有该逻辑。如果Lambda的执行角色未被授予dynamodb:DeleteItem权限,会导致Lambda执行失败,API Gateway可能返回401错误,且失败响应不会携带你配置的CORS头,触发浏览器的CORS报错。
解决方法:
- 进入IAM控制台,找到该Lambda的执行角色
- 为角色添加包含
dynamodb:DeleteItem权限的策略,资源指定为recipes表的ARN(格式:arn:aws:dynamodb:us-west-2:你的账号ID:table/recipes) - 策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "dynamodb:DeleteItem", "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/recipes" } ] }
3. API Gateway配置差异
- 检查API Gateway的CORS配置是否覆盖Lambda返回的头:若OPTIONS响应中
Access-Control-Allow-Origin设为*,但Lambda返回具体域名,会导致冲突; - 确认API Gateway是否开启了额外授权(如AWS_IAM、Cognito),而请求未携带有效凭证,引发401;
- 检查集成请求是否正确传递
queryStringParameters,若index或host参数缺失,Lambda会抛出错误,返回非预期响应。
解决方法:
- 确保API Gateway的CORS设置与Lambda返回的头一致;若使用Lambda代理集成,关闭API Gateway对响应头的覆盖;
- 对比前两个正常Lambda对应的API资源配置,移除不必要的授权规则。
4. 代码参数校验缺失
代码中获取了title参数但未使用,若请求中无该参数会触发KeyError;转换index为整数时,若参数不是有效数字会触发ValueError,两种情况都会导致Lambda执行失败,返回错误响应。
解决方法:
添加参数校验逻辑,处理缺失或无效参数:
import json import boto3 def lambda_handler(event, context): query_params = event.get('queryStringParameters', {}) index_str = query_params.get('index') host = query_params.get('host') # 校验必填参数 if not index_str or not host: return { 'statusCode': 400, 'headers': { 'Access-Control-Allow-Origin': 'https://your-amplify-site.example.com' }, 'body': json.dumps({'error': '缺少必填参数'}) } # 校验index格式 try: index = int(index_str) except ValueError: return { 'statusCode': 400, 'headers': { 'Access-Control-Allow-Origin': 'https://your-amplify-site.example.com' }, 'body': json.dumps({'error': 'index参数格式无效'}) } # DynamoDB操作无需手动获取凭证,Lambda执行角色会自动注入 dynamodb = boto3.resource('dynamodb', region_name='us-west-2') table = dynamodb.Table('recipes') try: table.delete_item(Key={'recipe_index': index}) except Exception as e: return { 'statusCode': 500, 'headers': { 'Access-Control-Allow-Origin': 'https://your-amplify-site.example.com' }, 'body': json.dumps({'error': f'DynamoDB操作失败: {str(e)}'}) } location = f'https://{host}/' return { 'statusCode': 301, 'headers': { 'Access-Control-Allow-Origin': 'https://your-amplify-site.example.com', 'Location': location }, }
内容的提问来源于stack exchange,提问作者Art Vandalay
相关产品推荐
相关产品推荐

