You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 17:15:36