Source code for ecs_composex.compose.compose_services.env_files_helpers

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

from os import path

from troposphere import AWS_PARTITION, Sub
from troposphere.ecs import EnvironmentFile
from troposphere.iam import PolicyType

import ecs_composex.common.troposphere_tools
from ecs_composex.common import FILE_PREFIX
from ecs_composex.common.files import upload_file
from ecs_composex.common.logging import LOG

# TODO: refactor policy by having a x-s3 Bucket object deal with permissions


[docs]def add_envfiles_bucket_iam_access(env_files, family, settings): if ( env_files and family.template and "S3EnvFilesAccess" not in family.template.resources ): family.template.add_resource( PolicyType( "S3EnvFilesAccess", PolicyName="S3EnvFilesAccess", PolicyDocument={ "Version": "2012-10-17", "Statement": [ { "Action": "s3:GetObject", "Effect": "Allow", "Resource": Sub( f"arn:${{{AWS_PARTITION}}}:s3:::{settings.bucket_name}/*" ), } ], }, Roles=[ family.iam_manager.exec_role.name, family.iam_manager.task_role.name, ], ) )
[docs]def upload_services_env_files(family, settings) -> None: """ Method to go over each service and if settings are to upload files to S3, will create objects and update the container definition for env_files accordingly. :param family: :param ecs_composex.common.settings.ComposeXSettings settings: :return: """ if settings.no_upload: return elif settings.for_cfn_macro: LOG.warning( f"{family.name} When running as a Macro, you cannot upload environment files." ) return for service in family.services: env_files = [] for env_file in service.env_files: with open(env_file) as file_fd: file_body = file_fd.read() object_name = path.basename(env_file) try: upload_file( body=file_body, bucket_name=settings.bucket_name, mime="text/plain", prefix=f"{FILE_PREFIX}/env_files", file_name=object_name, settings=settings, ) LOG.info( f"{family.name}.env_files - Successfully uploaded {env_file} to S3" ) except Exception: LOG.error(f"Failed to upload env file {object_name}") raise file_path = Sub( f"arn:${{{AWS_PARTITION}}}:s3:::{settings.bucket_name}/{FILE_PREFIX}/env_files/{object_name}" ) env_files.append(EnvironmentFile(Type="s3", Value=file_path)) if not hasattr(service.container_definition, "EnvironmentFiles"): setattr(service.container_definition, "EnvironmentFiles", env_files) else: service.container_definition.EnvironmentFiles += env_files add_envfiles_bucket_iam_access(env_files, family, settings)