Source code for ecs_composex.sns.sns_aws

#  -*- coding: utf-8 -*-
# SPDX-License-Identifier: MPL-2.0
# Copyright 2020-2021 John Mille <john@compose-x.io>

"""
Module to find the SQS topics in lookup
"""

import re

from botocore.exceptions import ClientError
from compose_x_common.compose_x_common import keyisset

from ecs_composex.common import LOG
from ecs_composex.common.aws import (
    define_lookup_role_from_info,
    find_aws_resource_arn_from_tags_api,
)
from ecs_composex.sns.sns_params import TOPIC_ARN, TOPIC_KMS_KEY, TOPIC_NAME


[docs]def get_topic_config(logical_name, topic_arn, session): """ Function to create the mapping definition for SNS topics :param str logical_name: The logical name of the resource :param str topic_arn: :param boto3.session.Session session: :return: """ topic_parts = re.compile(r"(?:^arn:aws(?:-[a-z]+)?:sns:[\S]+:[0-9]+:)([\S]+)$") topic_name = topic_parts.match(topic_arn).groups()[0] topic_config = {TOPIC_NAME.title: topic_name, TOPIC_ARN.title: topic_arn} client = session.client("sns") try: topic_r = client.get_topic_attributes(TopicArn=topic_arn) topic_config.update({logical_name: topic_r["Attributes"]["TopicArn"]}) if keyisset("Attributes", topic_r) and keyisset( "KmsMasterKeyId", topic_r["Attributes"] ): kms_key_id = topic_r["Attributes"]["KmsMasterKeyId"] if kms_key_id.startswith("arn:aws"): topic_config.update({TOPIC_KMS_KEY.title: kms_key_id}) else: LOG.warning( "The KMS Key provided is not an ARN. Implementation requires full ARN today" ) else: LOG.info(f"No KMS Key associated with topic {topic_name}") return topic_config except client.exceptions.QueueDoesNotExist: return None except ClientError as error: LOG.error(error) raise
[docs]def lookup_topic_config(logical_name, lookup, session): """ Function to find the DB in AWS account :param str logical_name: The logical name of the resource :param dict lookup: The Lookup definition for DB :param boto3.session.Session session: Boto3 session for clients :return: """ sns_types = { "sns": {"regexp": r"(?:^arn:aws(?:-[a-z]+)?:sns:[\S]+:[0-9]+:)([\S]+)$"}, } lookup_session = define_lookup_role_from_info(lookup, session) topic_arn = find_aws_resource_arn_from_tags_api( lookup, lookup_session, "sns", types=sns_types, ) if not topic_arn: return None config = get_topic_config(logical_name, topic_arn, lookup_session) LOG.debug(config) return config