有没有办法在AWS Lambda上使用PyGithub

问题描述 投票:0回答:2

我是 PyGithub 的忠实粉丝。我想在 AWS Lambda 上使用这个库。但不幸的是,我无法编译和使用 PyGithub 的源文件。

我尝试从 pypi 下载它,然后将其压缩为 zip --> 上传。

## app.py file
from github import Github

# using username and password
g = Github("username", "password")

def handler(event, context):
    for repo in g.get_user().get_repos():
        print(repo.name)
        repo.edit(has_wiki=False)

但是它抛出了一个错误。

{
  "errorMessage": "Unable to import module 'app': No module named 'jwt'",
  "errorType": "Runtime.ImportModuleError"
}

有什么方法可以在 Lambda 上使用这个库吗?

python amazon-web-services aws-lambda
2个回答
1
投票

是的。一种方法是通过 lambda 层

为了验证这种可能性,我刚刚使用

pygithub
创建了一个自定义图层,并可以确认它有效

使用的技术包括最近的AWS博客中描述的docker工具

我创建图层如下:

  1. 创建空文件夹,例如

    mylayer

  2. 转到文件夹并创建

    requirements.txt
    文件,其内容为

PyGithub
  1. 运行以下 docker 命令(对于使用 python 3.8 的 lambda):
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
  1. 创建图层为zip:
zip -r mypygithublayer.zip python > /dev/null
  1. 在AWS控制台中基于

    mypygithublayer.zip
    创建lambda层。不要忘记将
    Compatible runtimes
    指定为
    python3.8

  2. 使用以下 lambda 函数测试 lambda 中的层:

import json

from github import Github

def lambda_handler(event, context):
    
    print(dir(Github))

函数正确执行:

['FIX_REPO_GET_GIT_REF', '_Github__get_FIX_REPO_GET_GIT_REF', '_Github__get_per_page', '_Github__set_FIX_REPO_GET_GIT_REF', '_Github__set_per_page', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'create_from_raw_data', 'dump', 'get_emojis', 'get_events', 'get_gist', 'get_gists', 'get_gitignore_template', 'get_gitignore_templates', 'get_hook', 'get_hooks', 'get_installation', 'get_license', 'get_licenses', 'get_oauth_application', 'get_organization', 'get_organizations', 'get_project', 'get_project_column', 'get_rate_limit', 'get_repo', 'get_repos', 'get_user', 'get_users', 'load', 'oauth_scopes', 'per_page', 'rate_limiting', 'rate_limiting_resettime', 'render_markdown', 'search_code', 'search_commits', 'search_issues', 'search_repositories', 'search_topics', 'search_users']

0
投票

您还可以将 Marcin 答案的输出作为 zip 文件上传到 Lambda 函数代码源。请记住将 lambda_function.py 包含在根目录中,并压缩该文件夹的内容,而不是实际文件夹,因为 lambda_function.py 必须位于根目录中。

© www.soinside.com 2019 - 2024. All rights reserved.