Source code for ecs_composex.sqs.sqs_helpers

#  SPDX-License-Identifier: MPL-2.0
#  Copyright 2020-2022 John Mille <john@compose-x.io>

from __future__ import annotations

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from ecs_composex.common.settings import ComposeXSettings
    from ecs_composex.mods_manager import XResourceModule
    from .sqs_stack import Queue

from botocore.exceptions import ClientError
from compose_x_common.aws.sqs import SQS_QUEUE_ARN_RE
from compose_x_common.compose_x_common import keyisset
from troposphere.sqs import Queue as CfnQueue

from ecs_composex.common.logging import LOG
from ecs_composex.sqs.sqs_params import (
    SQS_ARN,
    SQS_KMS_KEY,
    SQS_NAME,
    SQS_URL,
    TAGGING_API_ID,
)


[docs]def get_queue_config(queue: Queue, account_id: str, resource_id: str) -> dict | None: """ :param ecs_composex.sqs.sqs_stack.Queue queue: :param str account_id: :param str resource_id: """ queue_config = {SQS_NAME: resource_id} client = queue.lookup_session.client("sqs") try: queue_config[SQS_URL] = client.get_queue_url( QueueName=resource_id, QueueOwnerAWSAccountId=account_id )["QueueUrl"] try: encryption_config_r = client.get_queue_attributes( QueueUrl=queue_config[SQS_URL], AttributeNames=["KmsMasterKeyId", "QueueArn"], ) queue_config[SQS_ARN] = encryption_config_r["Attributes"]["QueueArn"] if keyisset("Attributes", encryption_config_r) and keyisset( "KmsMasterKeyId", encryption_config_r["Attributes"] ): kms_key_id = encryption_config_r["Attributes"]["KmsMasterKeyId"] if kms_key_id.startswith("arn:aws"): queue_config[SQS_KMS_KEY] = encryption_config_r["Attributes"][ "KmsMasterKeyId" ] else: LOG.warning( "The KMS Key provided is not an ARN." " Implementation requires full ARN today" ) else: LOG.info(f"{queue.module.res_key}.{queue.name} - No KMS encryption.") except client.exceptions.InvalidAttributeName as error: LOG.error("Failed to retrieve the Queue attributes") LOG.error(error) return queue_config except client.exceptions.QueueDoesNotExist: return None except ClientError as error: LOG.error(error) raise
[docs]def resolve_lookup( lookup_resources: list[Queue], settings: ComposeXSettings, module: XResourceModule ) -> None: """ Lookup AWS Resource :param list[Queue] lookup_resources: :param ecs_composex.common.settings.ComposeXSettings settings: :param XResourceModule module: """ if not keyisset(module.mapping_key, settings.mappings): settings.mappings[module.mapping_key] = {} for resource in lookup_resources: resource.lookup_resource( SQS_QUEUE_ARN_RE, get_queue_config, CfnQueue.resource_type, TAGGING_API_ID, ) settings.mappings[module.mapping_key].update( {resource.logical_name: resource.mappings} ) LOG.info( f"{module.res_key}.{resource.name} - Matched AWS Resource {resource.arn}" ) if keyisset(SQS_KMS_KEY, resource.lookup_properties): LOG.info( f"{module.res_key}.{resource.name} - Identified CMK" " - {resource.lookup_properties[SQS_KMS_KEY]}" )