无互联网VPC下Glue Python Shell添加外部库及生成egg/whl问询
解决无互联网VPC下Glue Python Shell作业添加外部依赖的问题
我来帮你搞定这个问题——在无网VPC环境下给Glue Python Shell作业加外部依赖,核心思路是提前准备好离线包,而不是在作业运行时尝试在线安装。下面是一步步的具体操作:
一、提前生成离线Python包(whl/egg)
因为你的VPC没网,必须在有互联网的环境下先把pyathena、pytest及其所有依赖包下载好,保存为Glue支持的whl/egg格式。建议用和Glue版本匹配的Python环境操作,避免兼容性问题(比如Glue 3.0对应Python 3.7,Glue 4.0对应Python 3.9)。
操作步骤:
- (可选但推荐)创建虚拟环境隔离本地环境:
# 以Python 3.7为例(对应Glue 3.0) python3.7 -m venv glue-deps-venv source glue-deps-venv/bin/activate
- 用
pip download下载所有依赖到本地目录:
# 把pyathena、pytest及其依赖下载到local-packages文件夹 pip download pyathena pytest -d ./local-packages/
执行完后,local-packages目录里会出现所有需要的whl/egg文件(比如pyathena-3.10.0-py3-none-any.whl、pytest-7.4.0-py3-none-any.whl等)。
二、上传离线包到S3
Glue需要从S3读取依赖包,所以把本地的包上传到你的S3存储桶:
# 替换成你的S3路径 aws s3 cp ./local-packages/ s3://your-glue-bucket/dependencies/python-packages/ --recursive
三、配置Glue Python Shell作业
- 打开AWS Glue控制台,找到你的Python Shell作业,点击编辑。
- 在作业参数区域,找到Python路径(Python path)字段,填入你的S3包路径:
这个路径会让Glue自动加载该S3目录下的所有Python包。s3://your-glue-bucket/dependencies/python-packages/ - 确保你的Glue作业IAM角色拥有访问该S3路径的权限(需要
s3:GetObject权限)。 - 保存作业配置。
四、修改Python脚本(移除在线安装代码)
删掉之前尝试在线安装的代码,直接导入依赖就行——因为Glue会自动加载S3上的包:
import pyathena import pytest def main(): # 示例:用pyathena连接Athena from pyathena import connect cursor = connect( s3_staging_dir='s3://your-athena-staging-bucket/', region_name='us-east-1' ).cursor() cursor.execute("SELECT * FROM your_database.your_table LIMIT 5") results = cursor.fetchall() for row in results: print(row) if __name__ == "__main__": main()
为什么之前的方法失败?
你之前用easy_install.main()尝试安装时,这个命令本质还是会去PyPI下载包,但你的VPC没有互联网连接,所以必然会出现连接超时/无法访问的错误。正确的思路是离线准备依赖包,让Glue直接加载S3上的本地包,而不是运行时在线下载。
内容的提问来源于stack exchange,提问作者Praful




