Skip to content

Commit c1c6dd3

Browse files
author
Joe Snell
committed
Add code
1 parent 19fe07f commit c1c6dd3

File tree

4 files changed

+106
-2
lines changed

4 files changed

+106
-2
lines changed

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,19 @@
11
# Python Extension Framework
22

33
This is a framework for building [AWS Lambda Extensions](https://aws.amazon.com/blogs/compute/introducing-aws-lambda-extensions-in-preview/).
4+
5+
## Quickstart
6+
7+
To get started you can use the default `Extension` class, or extend it.
8+
9+
Example:
10+
11+
```python
12+
from lambda_extension_framework import Extension
13+
14+
def handler(event):
15+
print(event)
16+
17+
extension = Extension()
18+
extension.register([EventType.INVOKE], handler)
19+
```

lambda_extension_framework/main.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#!/usr/bin/env python3
2+
3+
import os
4+
import sys
5+
from pathlib import Path
6+
from enum import Enum
7+
8+
from lambda_extension_framework.utils import get, post
9+
10+
class EventType(Enum):
11+
INVOKE='INVOKE'
12+
SHUTDOWN='SHUTDOWN'
13+
14+
class Extension:
15+
def __init__(self, name=None, runtime_api_endpoint=None):
16+
self.handlers = {}
17+
self.name = name or Path(__file__).parent.name
18+
self.runtime_api_endpoint = runtime_api_endpoint or os.environ['AWS_LAMBDA_RUNTIME_API']
19+
20+
@staticmethod
21+
def handle_signal(signal, frame):
22+
sys.exit(0)
23+
24+
def register(self, events, handler):
25+
response = post(
26+
url=f'https://{self.runtime_api_endpoint}/2020-01-01/extension/register',
27+
data={
28+
'events': events
29+
},
30+
headers={
31+
'Lambda-Extension-Name': self.name,
32+
}
33+
)
34+
35+
extension_id = response.headers['Lambda-Extension-Identifier']
36+
return self.process_events(extension_id, handler)
37+
38+
def process_events(self, extension_id, handler):
39+
while True:
40+
response = get(
41+
url=f"https://{self.runtime_api_endpoint}/2020-01-01/extension/event/next",
42+
headers={
43+
'Lambda-Extension-Identifier': extension_id
44+
},
45+
timeout=None
46+
)
47+
48+
if response['eventType'] == EventType.SHUTDOWN:
49+
sys.exit(0)
50+
else:
51+
handler(response)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import json
2+
from urllib import request
3+
4+
def get(url, headers=None):
5+
kwargs = {
6+
'url': url,
7+
'headers': headers or {}
8+
}
9+
10+
req = request.Request(**kwargs)
11+
response = request.urlopen(req)
12+
return response.read().decode('utf8')
13+
14+
def post(url, headers=None, data=None):
15+
kwargs = {
16+
'url': url,
17+
'headers': headers or {}
18+
}
19+
20+
if data:
21+
kwargs['data'] = json.dumps(data)
22+
kwargs['headers']['Content-Type'] = 'application/json'
23+
24+
req = request.Request(**kwargs)
25+
response = request.urlopen(req)
26+
return response.read().decode('utf8')

pyproject.toml

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,20 @@
11
[tool.poetry]
2-
name = "python-extension-framework"
2+
name = "lambda-extension-framework"
33
version = "0.1.0"
4-
description = ""
4+
description = "Framework for creating AWS Lambda Extensions"
55
authors = ["Joe Snell <joepsnell@gmail.com>"]
66
license = "MIT"
7+
readme = "README.md"
8+
repository = "https://github.com/lambda-extensions/python-extension-framework"
9+
documentation = "https://github.com/lambda-extensions/python-extension-framework"
10+
homepage = "https://github.com/lambda-extensions/python-extension-framework"
11+
keywords = [
12+
"AWS",
13+
"AWS Lambda",
14+
"Lambda Extensions",
15+
"Framework",
16+
"Extension Framework"
17+
]
718

819
[tool.poetry.dependencies]
920
python = "^3.8"

0 commit comments

Comments
 (0)