Skip to content

Commit 7af1e79

Browse files
committed
improved stage support in Lambda name
added support for setting the initial value of a new lambda function memory and storage added support for providing a folder value to the Deploy_Lambda.add_file method with this new capability, changed how add_file__boto3__lambda so that the boto3__lambda is now placed inside the osbot_aws/aws/lambda_ folder (which means that we don't need to use "# noinspection PyUnresolvedReferences" anymore)
1 parent 1d3d259 commit 7af1e79

File tree

5 files changed

+59
-41
lines changed

5 files changed

+59
-41
lines changed

osbot_aws/aws/lambda_/Lambda.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import json
2-
32
from osbot_utils.type_safe.Type_Safe import Type_Safe
43
from osbot_utils.utils.Lists import unique
54
from osbot_utils.utils.Json import json_loads, json_parse
@@ -17,16 +16,20 @@
1716
from osbot_aws.aws.session.Session__Kwargs__S3 import Session__Kwargs__S3
1817

1918

20-
class Lambda(Type_Safe):
19+
DEFAULT__LAMBDA__MEMORY_SIZE = 512
20+
DEFAULT__LAMBDA__EPHEMERAL_STORAGE = 512
21+
class Lambda(Type_Safe): # todo: refactor to use full value of Type_Safe (also this class is getting quite big)
22+
2123
session_kwargs__lambda: Session__Kwargs__Lambda
2224
session_kwargs__s3 : Session__Kwargs__S3
23-
25+
memory_size : int = DEFAULT__LAMBDA__MEMORY_SIZE # default to 512Mb max is 10,000 Mb (current AWS limit in Dec 2020)
26+
ephemeral_storage : int = DEFAULT__LAMBDA__EPHEMERAL_STORAGE # default to 512Mb
27+
role : str = None
2428

2529
def __init__(self, name='', **kwargs):
2630
super().__init__(**kwargs)
2731
self.architecture = 'x86_64' # other option is 'arm64'
2832
self.runtime = 'python3.11'
29-
self.memory = 512 # default to 512Mb max is 10,000 Mb (current AWS limit in Dec 2020)
3033
self.timeout = 60 # default to 60 secs (1m) max is 900 secs (15m)
3134
self.trace_mode = 'PassThrough' # x-rays disabled
3235
self.original_name = name
@@ -122,13 +125,14 @@ def create(self):
122125
return {'status': 'error', 'error': '{0}'.format(error), 'data': kwargs}
123126

124127
def create_kwargs(self):
125-
kwargs = { 'Architectures' : [self.architecture] , # no idea why this is an array since we get an exception when there is more than one value
126-
'FunctionName' : self.name or random_string(prefix='temp_lambda_') ,
127-
'MemorySize' : self.memory ,
128-
'Role' : self.role ,
129-
'Timeout' : self.timeout ,
130-
'TracingConfig' : { 'Mode': self.trace_mode } ,
131-
'Tags' : self.tags }
128+
kwargs = { 'Architectures' : [self.architecture] , # no idea why this is an array since we get an exception when there is more than one value
129+
'FunctionName' : self.name or random_string(prefix='temp_lambda_') ,
130+
'MemorySize' : self.memory_size ,
131+
'EphemeralStorage' : { 'Size': self.ephemeral_storage } ,
132+
'Role' : self.role ,
133+
'Timeout' : self.timeout ,
134+
'TracingConfig' : { 'Mode': self.trace_mode } ,
135+
'Tags' : self.tags }
132136

133137
if self.env_variables:
134138
kwargs['Environment'] = {'Variables': self.env_variables}

osbot_aws/deploy/Deploy_Lambda.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from osbot_aws.aws.lambda_.Lambda import DEFAULT__LAMBDA__EPHEMERAL_STORAGE, DEFAULT__LAMBDA__MEMORY_SIZE
2+
from osbot_utils.type_safe.Type_Safe import Type_Safe
13
from osbot_aws.aws.lambda_ import boto3__lambda
24
from osbot_utils.type_safe.decorators.type_safe import type_safe
35
from osbot_utils.utils.Env import load_dotenv
@@ -10,9 +12,12 @@
1012
# todo: refactor lambda_name to be a Type_Safe variable, but that will clash with the current lambda_name() function (which is used in other projects)
1113
# stage and the other self.* vars set in the __init__ should also be Type_Safe variables
1214

13-
class Deploy_Lambda:
15+
class Deploy_Lambda(Type_Safe):
16+
stage : str = None
17+
ephemeral_storage: int = DEFAULT__LAMBDA__EPHEMERAL_STORAGE
18+
memory_size : int = DEFAULT__LAMBDA__MEMORY_SIZE
1419

15-
def __init__(self, handler, stage=None, lambda_name=None, **kwargs):
20+
def __init__(self, handler, lambda_name=None, **kwargs):
1621
super().__init__(**kwargs)
1722
load_dotenv()
1823
self.osbot_setup = OSBot_Setup()
@@ -24,11 +29,13 @@ def __init__(self, handler, stage=None, lambda_name=None, **kwargs):
2429
self.handler = handler
2530
self.module_name = handler.__module__
2631

27-
self.stage = stage
2832
self.role_arn = Temp_Aws_Roles().for_lambda_invocation__role_arn()
2933

3034
self.package = self.get_package()
35+
3136
if lambda_name: # if we have provided a name, use it internally
37+
if self.stage: # todo: review this logic of setting lambda function name (with stage) and syncing it with others like module_name (which is quite messy at the moment)
38+
lambda_name += f'__{self.stage}'
3239
self.package.lambda_name = lambda_name
3340
self.package.aws_lambda.name = lambda_name
3441
self.module_name = lambda_name
@@ -44,12 +51,14 @@ def add_function_source_code(self):
4451
self.package.add_module(root_module_name)
4552
return self
4653

47-
def add_file(self, file_path):
48-
self.package.add_file(source=file_path)
54+
def add_file(self, file_path, folder=None):
55+
self.package.add_file(source=file_path, folder=folder)
4956
return self
5057

58+
5159
def add_file__boto3__lambda(self):
52-
self.add_file(boto3__lambda.__file__)
60+
folder = 'osbot_aws.aws.lambda_'.replace('.','/')
61+
self.add_file(file_path = boto3__lambda.__file__, folder=folder)
5362
return self
5463

5564
def add_folder(self, source, ignore=None):
@@ -109,14 +118,18 @@ def function_url(self):
109118

110119
def get_package(self):
111120
package = Lambda_Package(self.lambda_name())
112-
package.aws_lambda.set_s3_bucket(self.osbot_setup.s3_bucket_lambdas)
113-
package.aws_lambda.set_role(self.role_arn)
121+
with package.aws_lambda as _:
122+
_.set_s3_bucket(self.osbot_setup.s3_bucket_lambdas)
123+
_.set_role(self.role_arn)
124+
_.ephemeral_storage = self.ephemeral_storage
125+
_.memory_size = self.memory_size
114126
return package
115127

116128
def lambda_name(self):
117-
if self.stage is None:
118-
return self.module_name
119-
return f"{self.module_name}-{self.stage}"
129+
return self.module_name
130+
# if self.stage is None:
131+
# return self.module_name
132+
# return f"{self.module_name}__{self.stage}" # breaking change was "-" , and now it is "__" (which is a beter separator)
120133

121134
def lambda_function(self):
122135
return self.package.aws_lambda

osbot_aws/helpers/Lambda_Package.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
11
import os
22
import importlib
33
import site
4-
4+
from osbot_utils.type_safe.Type_Safe import Type_Safe
55
from osbot_utils.type_safe.decorators.type_safe import type_safe
6-
76
from osbot_aws.aws.lambda_.Lambda_Layer import Lambda_Layer
87
from osbot_utils.testing.Temp_Folder import Temp_Folder
98
from osbot_utils.testing.Temp_Zip import Temp_Zip
109
from osbot_utils.utils.Process import Process
1110
from osbot_aws.AWS_Config import AWS_Config
1211
from osbot_aws.apis.test_helpers.Temp_Aws_Roles import Temp_Aws_Roles
13-
from osbot_utils.utils.Files import folder_copy, Files, folder_not_exists, path_combine, folder_name
14-
15-
from osbot_aws.aws.lambda_.Lambda import Lambda
12+
from osbot_utils.utils.Files import folder_copy, Files, folder_not_exists, path_combine, folder_name, create_folder, path_combine_safe
13+
from osbot_aws.aws.lambda_.Lambda import Lambda
1614

1715

18-
class Lambda_Package:
19-
def __init__(self,lambda_name):
16+
class Lambda_Package(Type_Safe): # todo: refactor to use full value of Type_Safe
17+
def __init__(self,lambda_name, **kwargs):
18+
super().__init__(**kwargs)
2019
self.lambda_name = lambda_name
2120
self.aws_lambda = Lambda(self.lambda_name)
2221
self.s3_bucket = AWS_Config().lambda_s3_bucket()
@@ -54,8 +53,13 @@ def add_layers(self, layers_arn: list):
5453
self.aws_lambda.add_layer(layer_arn)
5554
return self
5655

57-
def add_file(self, source):
58-
Files.copy(source, self.tmp_folder)
56+
def add_file(self, source, folder=None):
57+
if folder is None:
58+
target_folder = self.tmp_folder
59+
else: # if we have a folder path provider
60+
target_folder = path_combine_safe(self.tmp_folder, folder) # merge it with the self.tmp_folder (base folder to capture all files to deploy)
61+
create_folder(target_folder) # make sure folder exists
62+
Files.copy(source, target_folder)
5963

6064
def add_folder(self, source, ignore=None):
6165
destination = Files.path_combine(self.tmp_folder, folder_name(source))

tests/integration/aws/lambda_/dependencies/test_Lambda__Dependency__Inside_Lambda.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -277,8 +277,7 @@ def run(event, context): # this runs inside the lambda en
277277

278278
def test_12__using_lambda_deploy__load_dependency__using__only_boto_3_code(self):
279279
def run(event, context):
280-
# noinspection PyUnresolvedReferences
281-
from boto3__lambda import load_dependency
280+
from osbot_aws.aws.lambda_.boto3__lambda import load_dependency # using the lightweight file (which only has the boto3 calls required to call load_dependency
282281
return load_dependency('colorama==0.4.6')
283282

284283
source_code = function_source_code(run)
@@ -291,7 +290,7 @@ def run(event, context):
291290
_.add_file (lambda_handler)
292291
assert _.deploy() is True
293292
assert _.invoke() == 'colorama==0.4.6 (loaded from S3)'
294-
assert _.info().get('Configuration').get('CodeSize') < 1300 # confirm that size of the code uploaded is still very small
293+
assert _.info().get('Configuration').get('CodeSize') < 1500 # confirm that size of the code uploaded is still very small
295294
assert _.delete() is True
296295

297296
def test_dependencies_folder(self):

tests__to-wire-up/unit/apis/test_Lambda.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
import pytest
2-
from time import sleep
3-
4-
from osbot_utils.utils.Lists import list_contains
5-
6-
from osbot_aws.aws.iam.IAM_Role import IAM_Role
7-
from osbot_aws.aws.iam.IAM_Utils import IAM_Utils
2+
from time import sleep
3+
from osbot_utils.utils.Lists import list_contains
4+
from osbot_aws.aws.iam.IAM_Role import IAM_Role
5+
from osbot_aws.aws.iam.IAM_Utils import IAM_Utils
86
from osbot_utils.utils import Misc
97
from osbot_utils.utils.Files import file_exists, file_contents, Files
108
from osbot_aws.AWS_Config import AWS_Config
119
from osbot_aws.aws.s3.S3 import S3
1210
from osbot_aws.helpers.Test_Helper import Test_Helper
13-
from osbot_aws.aws.lambda_.Lambda import Lambda
11+
from osbot_aws.aws.lambda_.Lambda import Lambda
1412
from osbot_aws.apis.test_helpers.Temp_Lambda import Temp_Folder_With_Lambda_File, Temp_Lambda
1513
from osbot_aws.apis.test_helpers.Temp_SQS_Queue import Temp_SQS_Queue
1614
from osbot_utils.utils.Assert import Assert

0 commit comments

Comments
 (0)