jar使存储aws lambda函数的状态变得容易。
awsjar的Python项目详细描述
awsjar
AWSJar使保存来自aws lambda的数据变得容易。
数据(dict、list、float、int或string)可以作为环境变量保存在lambda中,也可以保存在s3上。
安装
pip install awsjar
示例
每次调用时递增一个和
import awsjar
def lambda_handler(event, context):
jar = awsjar.Jar(context.function_name)
data = jar.get() # Will return an empty dict if state does not already exist.
s = data.get("sum", 0)
data["sum"] = s + 1
jar.put(data)
return data
确保您的网站24/7
import awsjar
import requests
# Set a CloudWatch Event to run this Lambda every minute.
def lambda_handler(event, context):
jar = awsjar.Jar(context.function_name)
data = jar.get() # Will return an empty dict if state does not already exist.
last_status_code = data.get("last_status_code", 200)
result = requests.get('http://example.com')
cur_status_code = result.status_code
if last_status_code != 200 and cur_status_code != 200:
print('Website might be down!')
jar.put({'last_status_code': cur_status_code})
将数据保存到s3
import awsjar
# Save your data to an S3 object - s3://my-bucket/state.json
bkt = awsjar.Bucket('my-bucket', key='state.json')
data = {'num_acorns': 50, 'acorn_hideouts': ['tree', 'lake', 'backyard']}
bkt.put(data)
state = bkt.get()
>> {'num_acorns': 50, 'acorn_hideouts': ['tree', 'lake', 'backyard']}
如何
罐子
Save your data within the Lambda itself, as an environment variable.
This method has no associated costs but AWS only allows you to store up to 4KB of data in the environment variables.
Jar can compress the data before storing it, allowing up to about 8KB of uncompressed data.
This may not seem like much, but it can cover a lot of use cases. It's also nice to not have to provision extra resources and keep everything self contained. Here's a 7KB list that will fit with Jar.
^{pr 5}$Initialization
^{pr 6}$Save data
^{pr 7}$Serializing data
Jar comes with datetime encoders/decoders for you to use.
It uses the standard library json.dumps and json.loads to serialize data so it's possible to write your own encoder/decoders to serialize your data.
from awsjar import Jar, datetime_decoder, datetime_encoder
from datetime import datetime
jar = Jar(
lambda_name=lambda_name,
region=region,
decoder=datetime_decoder,
encoder=datetime_encoder,
)
time = datetime.now()
data = {"list": [1, 2, 3], "dt1": time}
jar.put(data)
x = jar.get()
>> {"list": [1, 2, 3], 'dt1': datetime.datetime(2019, 1, 9, 18, 49, 44, 847202)}
IAM角色
Any Lambda using Jar to save to an env var will need these permissions specified in the Role.
^{pr 9}$Bucket
Save your data to S3.
Initialization
^{pr 10}$Save data
^{pr 11}$Specifying keys
You can specify the key to override the key that was used in initialization.
^{pr 12}$Versioning
S3 has an eventual consistency data model
例如,这意味着在覆盖对象后立即获取该对象可能不会返回预期的数据。
要克服此问题,请启用versioning
如果s3 bucket启用了版本控制,bucket将自动检测它,并在任何get()
调用中获取对象的最新版本。
# Check versioning status
bkt.is_versioning_enabled()
# Enable versioning
bkt.enable_versioning()
# Disable versioning
bkt.enable_versioning()
序列化数据
Same as Jar
Contributing
Please see the contributing guide了解更多细节。
联系/支持
请使用Issues页
我非常感谢任何反馈/建议!电子邮件地址:yukisawa@gmail.com
许可证
在apache许可证2.0下发布。有关详细信息,请参见^{