如何使用当前版本的boto3运行AWS Glue 1.0 Python Shell作业?

2022-03-12 00:00:00 python aws-glue boto3

问题描述

我需要为AWS Glue Python3 shell作业使用较新的boto3包(Glue版本:1.0)。我将S3中的以下滚轮文件作为外部Python库包括在内:

boto3-1.13.21-py2.py3-none-any.whl 

但是,即使我看到以下日志,boto3.__version__也会打印出1.9.203

Successfully installed boto3-1.13.21 botocore-1.16.26 docutils-0.15.2 jmespath-0.10.0 python-dateutil-2.8.1 s3transfer-0.3.3 six-1.15.0 urllib3-1.25.10

由于某些原因,Glue Python Shell作业不允许我用轮子文件覆盖boto3包版本。有什么方法可以覆盖吗?


解决方案

使用当前版本的boto3运行AWS Glue 1.0Python Shell作业的步骤。

  1. 从pip下载.whl文件的当前版本。
  • https://pypi.org/project/botocore/#files

  • https://pypi.org/project/boto3/#files

    在我撰写此答案时,当前版本

    • boto3-1.20.10-py3-one-any.wh.
    • botocore-1.23.10-py3-one-any.whl
  1. 创建一个存储桶和文件夹,用于存储可能用于粘合Python作业的python WHL文件。
  • s3://glue/python/lib/
  1. 将boto3和botocore WHL文件上载到步骤2中创建的S3存储桶中的新文件夹。
  • s3://glue/python/lib/botocore-1.23.10-py3-none-any.whl,
  • s3://glue/python/lib/boto3-1.20.10-py3-none-any.whl
  1. 创建一个Glue 1.0 Python shell作业,同时展开安全配置,在";Python库路径&q;中添加路径,路径之间用逗号分隔

    s3://glue/python/lib/botocore-1.23.10-py3-none-any.whl,s3://glue/python/lib/boto3-1.20.10-py3-none-any.whl
    
  2. 创建一个新的python脚本,并让它在脚本顶部删除预先导入的boto3包。

    import sys
    sys.path.insert(0, '/glue/lib/installation')
    keys = [k for k in sys.modules.keys() if 'boto' in k]
    for k in keys:
        if 'boto' in k:
            del sys.modules[k]
    
  3. 导入boto3

    import boto3
    

这是我的最终模板通常的样子

import sys
sys.path.insert(0, '/glue/lib/installation')
keys = [k for k in sys.modules.keys() if 'boto' in k]
for k in keys:
    if 'boto' in k:
        del sys.modules[k]

import logging
import boto3
import botocore


def main():
    handler = logging.StreamHandler(sys.stdout)
    formatter = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(process)d: %(message)s')
    handler.setFormatter(formatter)
    logger = logging.getLogger("GlueLogger")
    logger.setLevel(logging.INFO)
    logger.addHandler(handler)
    logger.info(f"Received sys.argv: {sys.argv}")
    logger.info(f"Using boto3 api version:{boto3.__version__}")


if __name__ == "__main__":
    main()

相关文章