我是 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 上使用这个库吗?
是的。一种方法是通过 lambda 层。
为了验证这种可能性,我刚刚使用
pygithub
创建了一个自定义图层,并可以确认它有效。
使用的技术包括最近的AWS博客中描述的docker工具:
我创建图层如下:
创建空文件夹,例如
mylayer
。
转到文件夹并创建
requirements.txt
文件,其内容为
PyGithub
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"
zip -r mypygithublayer.zip python > /dev/null
在AWS控制台中基于
mypygithublayer.zip
创建lambda层。不要忘记将 Compatible runtimes
指定为 python3.8
。
使用以下 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']
您还可以将 Marcin 答案的输出作为 zip 文件上传到 Lambda 函数代码源。请记住将 lambda_function.py 包含在根目录中,并压缩该文件夹的内容,而不是实际文件夹,因为 lambda_function.py 必须位于根目录中。