132
132
from .tags .resource_tagging import get_tag_list
133
133
134
134
_CONDITION_CHAR_LIMIT = 255
135
- FUNCTION_URL_PUBLIC_PERMISSION_ACTION = "lambda:InvokeFunctionUrl"
136
- FUNCTION_INVOKE_PERMISSION_ACTION = "lambda:InvokeFunction"
137
135
138
136
139
137
class SamFunction (SamResourceMacro ):
@@ -322,8 +320,13 @@ def to_cloudformation(self, **kwargs): # type: ignore[no-untyped-def] # noqa: P
322
320
if self .FunctionUrlConfig :
323
321
lambda_url = self ._construct_function_url (lambda_function , lambda_alias , self .FunctionUrlConfig )
324
322
resources .append (lambda_url )
325
- url_permissions = self ._construct_url_permissions (lambda_function , lambda_alias , self .FunctionUrlConfig )
326
- resources .extend (url_permissions )
323
+ url_permission = self ._construct_url_permission (lambda_function , lambda_alias , self .FunctionUrlConfig )
324
+ invoke_dual_auth_permission = self ._construct_invoke_dual_auth_permission (
325
+ lambda_function , lambda_alias , self .FunctionUrlConfig
326
+ )
327
+ if url_permission and invoke_dual_auth_permission :
328
+ resources .append (url_permission )
329
+ resources .append (invoke_dual_auth_permission )
327
330
328
331
self ._validate_deployment_preference_and_add_update_policy (
329
332
kwargs .get ("deployment_preference_collection" , None ),
@@ -1198,11 +1201,11 @@ def _validate_cors_config_parameter(
1198
1201
"{} must be of type {}." .format (prop_name , str (prop_type ).split ("'" )[1 ]),
1199
1202
)
1200
1203
1201
- def _construct_url_permissions (
1204
+ def _construct_url_permission (
1202
1205
self , lambda_function : LambdaFunction , lambda_alias : Optional [LambdaAlias ], function_url_config : Dict [str , Any ]
1203
- ) -> List [LambdaPermission ]:
1206
+ ) -> Optional [LambdaPermission ]:
1204
1207
"""
1205
- Construct the lambda permissions associated with the function url resource in a case
1208
+ Construct the lambda permission associated with the function url resource in a case
1206
1209
for public access when AuthType is NONE
1207
1210
1208
1211
Parameters
@@ -1215,45 +1218,62 @@ def _construct_url_permissions(
1215
1218
1216
1219
Returns
1217
1220
-------
1218
- List[LambdaPermission]
1219
- The lambda permission appended to a function url resource with public access and the
1220
- Permission to invoke the function in general.
1221
+ LambdaPermission
1222
+ The lambda permission appended to a function url resource with public access
1221
1223
"""
1222
1224
auth_type = function_url_config .get ("AuthType" )
1223
1225
1224
1226
if auth_type not in ["NONE" ] or is_intrinsic (function_url_config ):
1225
- return []
1226
-
1227
- url_public_permission_logical_id = f"{ lambda_function .logical_id } UrlPublicPermissions"
1227
+ return None
1228
1228
1229
+ logical_id = f"{ lambda_function .logical_id } UrlPublicPermissions"
1229
1230
lambda_permission_attributes = self .get_passthrough_resource_attributes ()
1230
-
1231
- lambda_url_public_permission = LambdaPermission (
1232
- logical_id = url_public_permission_logical_id , attributes = lambda_permission_attributes
1233
- )
1234
- lambda_url_public_permission .Action = FUNCTION_URL_PUBLIC_PERMISSION_ACTION
1235
- lambda_url_public_permission .Principal = "*"
1236
- lambda_url_public_permission .FunctionName = (
1231
+ lambda_permission = LambdaPermission (logical_id = logical_id , attributes = lambda_permission_attributes )
1232
+ lambda_permission .Action = "lambda:InvokeFunctionUrl"
1233
+ lambda_permission .FunctionName = (
1237
1234
lambda_alias .get_runtime_attr ("arn" ) if lambda_alias else lambda_function .get_runtime_attr ("name" )
1238
1235
)
1239
- lambda_url_public_permission .FunctionUrlAuthType = auth_type
1236
+ lambda_permission .Principal = "*"
1237
+ lambda_permission .FunctionUrlAuthType = auth_type
1238
+ return lambda_permission
1240
1239
1241
- url_invoke_permission_logical_id = f"{ lambda_function .logical_id } URLInvokeAllowPublicAccess"
1240
+ def _construct_invoke_dual_auth_permission (
1241
+ self , lambda_function : LambdaFunction , lambda_alias : Optional [LambdaAlias ], function_url_config : Dict [str , Any ]
1242
+ ) -> Optional [LambdaPermission ]:
1243
+ """
1244
+ Construct the lambda permission associated with the function invoke resource in a case
1245
+ for public access when AuthType is NONE
1242
1246
1243
- lambda_permission_attributes = self .get_passthrough_resource_attributes ()
1247
+ Parameters
1248
+ ----------
1249
+ lambda_function : LambdaUrl
1250
+ Lambda Function resource
1244
1251
1245
- lambda_invoke_permission = LambdaPermission (
1246
- logical_id = url_invoke_permission_logical_id , attributes = lambda_permission_attributes
1247
- )
1248
- lambda_invoke_permission .Action = FUNCTION_INVOKE_PERMISSION_ACTION
1252
+ lambda_alias : LambdaAlias
1253
+ Lambda Alias resource
1254
+
1255
+ Returns
1256
+ -------
1257
+ LambdaPermission
1258
+ The lambda permission appended to a function that allow function invoke only from Function URL
1259
+ """
1260
+ # create lambda:InvokeFunction with InvokedViaFunctionUrl=True
1261
+ auth_type = function_url_config .get ("AuthType" )
1262
+
1263
+ if auth_type not in ["NONE" ] or is_intrinsic (function_url_config ):
1264
+ return None
1265
+
1266
+ logical_id = f"{ lambda_function .logical_id } URLInvokeAllowPublicAccess"
1267
+ lambda_permission_attributes = self .get_passthrough_resource_attributes ()
1268
+ lambda_invoke_permission = LambdaPermission (logical_id = logical_id , attributes = lambda_permission_attributes )
1269
+ lambda_invoke_permission .Action = "lambda:InvokeFunction"
1249
1270
lambda_invoke_permission .Principal = "*"
1250
1271
lambda_invoke_permission .FunctionName = (
1251
1272
lambda_alias .get_runtime_attr ("arn" ) if lambda_alias else lambda_function .get_runtime_attr ("name" )
1252
1273
)
1253
-
1254
1274
lambda_invoke_permission .InvokedViaFunctionUrl = True
1255
1275
1256
- return [ lambda_url_public_permission , lambda_invoke_permission ]
1276
+ return lambda_invoke_permission
1257
1277
1258
1278
1259
1279
class SamApi (SamResourceMacro ):
0 commit comments