samtranslator/model/eventsources/cloudwatchlogs.py (41 lines of code) (raw):
from typing import Any, Dict
from samtranslator.metrics.method_decorator import cw_timer
from samtranslator.model import PropertyType
from samtranslator.model.intrinsics import fnSub
from samtranslator.model.log import SubscriptionFilter
from samtranslator.model.types import IS_STR
from samtranslator.translator.arn_generator import ArnGenerator
from . import FUNCTION_EVETSOURCE_METRIC_PREFIX
from .push import PushEventSource
class CloudWatchLogs(PushEventSource):
"""CloudWatch Logs event source for SAM Functions."""
resource_type = "CloudWatchLogs"
principal = "logs.amazonaws.com"
property_types = {"LogGroupName": PropertyType(True, IS_STR), "FilterPattern": PropertyType(True, IS_STR)}
LogGroupName: str
FilterPattern: str
@cw_timer(prefix=FUNCTION_EVETSOURCE_METRIC_PREFIX)
def to_cloudformation(self, **kwargs): # type: ignore[no-untyped-def]
"""Returns the CloudWatch Logs Subscription Filter and Lambda Permission to which this CloudWatch Logs event source
corresponds.
:param dict kwargs: no existing resources need to be modified
:returns: a list of vanilla CloudFormation Resources, to which this push event expands
:rtype: list
"""
function = kwargs.get("function")
if not function:
raise TypeError("Missing required keyword argument: function")
source_arn = self.get_source_arn()
permission = self._construct_permission(function, source_arn=source_arn) # type: ignore[no-untyped-call]
subscription_filter = self.get_subscription_filter(function, permission) # type: ignore[no-untyped-call]
return [permission, subscription_filter]
def get_source_arn(self) -> Dict[str, Any]:
resource = "log-group:${__LogGroupName__}:*"
partition = ArnGenerator.get_partition_name()
return fnSub(
ArnGenerator.generate_arn(partition=partition, service="logs", resource=resource),
{"__LogGroupName__": self.LogGroupName},
)
def get_subscription_filter(self, function, permission): # type: ignore[no-untyped-def]
subscription_filter = SubscriptionFilter(
self.logical_id,
depends_on=[permission.logical_id],
attributes=function.get_passthrough_resource_attributes(),
)
subscription_filter.LogGroupName = self.LogGroupName
subscription_filter.FilterPattern = self.FilterPattern
subscription_filter.DestinationArn = function.get_runtime_attr("arn")
return subscription_filter