在AWS Lambda运行Stockfish引擎遇权限拒绝错误,求解决方法
解决AWS Lambda运行Stockfish的权限拒绝问题
1. 修复文件复制逻辑:用shutil.copy替代shutil.copytree
你的代码错误使用了shutil.copytree(用于复制目录)来处理单个可执行文件,这会导致/tmp下生成的不是可执行文件而是目录,直接触发权限拒绝。修改复制逻辑:
# 替换原copytree行 shutil.copy(stockfish_path, stockfish_new_path)
2. 确保复制后的文件拥有执行权限
复制完成后,明确为文件添加执行权限(重点是执行位,0o755比0o777更安全):
os.chmod(stockfish_new_path, 0o755)
3. 检查Stockfish版本与Lambda运行时架构匹配
- Lambda默认采用x86_64架构,确认你使用的
stockfish_14_x64_avx2是对应x86_64的版本; - 如果你的Lambda使用ARM架构(Graviton2),必须下载ARM版本的Stockfish,否则会因架构不兼容触发类似权限拒绝的错误。
4. 本地打包时预先设置可执行权限
在本地打包Lambda代码前,先给Stockfish文件添加执行权限:
chmod +x stockfish_14_x64_avx2
打包后上传到Lambda,此时/var/task下的文件本身就有执行权限,甚至可以直接在/var/task运行,无需复制到/tmp。
完整修正后的示例代码
import os, shutil import json from stockfish import Stockfish stockfish_path = '/var/task/stockfish_14_x64_avx2' stockfish_new_path = '/tmp/stockfish_14_x64_avx2' def lambda_handler(event, context): # 复制单个文件而非目录 shutil.copy(stockfish_path, stockfish_new_path) # 设置可执行权限 os.chmod(stockfish_new_path, 0o755) stockfish = Stockfish(path=stockfish_new_path) position = "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2" stockfish.set_fen_position(position) best_move = stockfish.get_best_move() return { "statusCode": 200, "body": json.dumps({"best_move": best_move}) }
内容的提问来源于stack exchange,提问作者Alan Chen
相关产品推荐
相关产品推荐

