Source code for ecs_composex.ecs.ecs_firelens.firelens_options_generic_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.ecs.ecs_family import ComposeFamily
from ecs_composex.compose.compose_services import ComposeService
from ecs_composex.common.settings import ComposeXSettings
from compose_x_common.aws import validate_iam_role_arn
from troposphere import Sub
from troposphere.iam import PolicyType
from ecs_composex.common.cfn_params import STACK_ID_SHORT
from ecs_composex.common.logging import LOG
from ecs_composex.common.troposphere_tools import add_resource
[docs]def handle_cross_account_permissions(
family: ComposeFamily,
service: ComposeService,
settings: ComposeXSettings,
parameter_name: str,
config_value: str,
):
"""
Function to automatically add cross-account role access for FireHose to the specified role ARN
:param family:
:param service:
:param settings:
:param parameter_name:
:param config_value:
:return:
"""
try:
validate_iam_role_arn(config_value)
except ValueError:
LOG.error(
f"{family.name}.{service.name} - FireLens config for firehose role_arn is invalid"
)
raise
policy_title = (
f"{family.logical_name}{service.logical_name}LoggingFirehoseCrossAccount"
)
if policy_title in family.template.resources:
policy = family.template.resources[policy_title]
resource = policy.PolicyDocument["Statement"][0]["Resource"]
if isinstance(resource, str):
resource = [resource]
if config_value not in resource:
policy.PolicyDocument["Statement"][0]["Resource"].append(config_value)
else:
policy = PolicyType(
policy_title,
PolicyName=Sub(
f"{family.logical_name}{service.logical_name}FireHoseCrossAccountAccess${{STACK_ID}}",
STACK_ID=STACK_ID_SHORT,
),
PolicyDocument={
"Version": "2012-10-17",
"Statement": [
{
"Sid": "LoggingFirehoseCrossAccount",
"Effect": "Allow",
"Action": ["sts:AssumeRole"],
"Resource": [config_value],
}
],
},
Roles=[family.iam_manager.task_role.name],
)
add_resource(family.template, policy)
return config_value