From aa3f93a3359f6c32c1693a094e62919a88b19baa Mon Sep 17 00:00:00 2001 From: Jagriti Sahu Date: Mon, 1 Apr 2024 18:10:23 +0530 Subject: [PATCH 1/5] deploy service using image uri --- cloudlift/__init__.py | 6 ++-- cloudlift/deployment/service_updater.py | 28 +++++++++++++------ .../deployment/task_definition_creator.py | 3 +- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/cloudlift/__init__.py b/cloudlift/__init__.py index de6bb836..abd66b8e 100644 --- a/cloudlift/__init__.py +++ b/cloudlift/__init__.py @@ -113,11 +113,13 @@ def edit_config(name, environment): @_require_name @click.option('--version', default=None, help='local image version tag') +@click.option('--image_uri', default=None, + help='image uri') @click.option("--build-arg", type=(str, str), multiple=True, help="These args are passed to docker build command " "as --build-args. Supports multiple.\ Please leave space between name and value" ) -def deploy_service(name, environment, version, build_arg): - ServiceUpdater(name, environment, None, version, dict(build_arg)).run() +def deploy_service(name, environment, version, image_uri, build_arg): + ServiceUpdater(name, environment, None, version, image_uri, dict(build_arg)).run() @cli.command() diff --git a/cloudlift/deployment/service_updater.py b/cloudlift/deployment/service_updater.py index c8e626d0..ca51d41c 100644 --- a/cloudlift/deployment/service_updater.py +++ b/cloudlift/deployment/service_updater.py @@ -23,7 +23,7 @@ class ServiceUpdater(object): - def __init__(self, name, environment, env_sample_file, version=None, + def __init__(self, name, environment, env_sample_file, version=None, image_uri=None, build_args=None, working_dir='.'): self.name = name self.environment = environment @@ -32,16 +32,17 @@ def __init__(self, name, environment, env_sample_file, version=None, else: self.env_sample_file = './env.sample' self.version = version + self.image_uri = image_uri self.ecr_client = boto3.session.Session(region_name=self.region).client('ecr') self.cluster_name = get_cluster_name(environment) self.working_dir = working_dir self.build_args = build_args + + def _get_image(self): + if self.image_uri: + version = None + return version, self.image_uri - def run(self): - log_warning("Deploying to {self.region}".format(**locals())) - self.init_stack_info() - if not os.path.exists(self.env_sample_file): - raise UnrecoverableException('env.sample not found. Exiting.') ecr_client = EcrClient(self.name, self.region, self.build_args) ecr_client.set_version(self.version) log_intent("name: " + self.name + " | environment: " + @@ -49,20 +50,29 @@ def run(self): log_bold("Checking image in ECR") ecr_client.build_and_upload_image() log_bold("Initiating deployment\n") + image_url = ecr_client.ecr_image_uri + image_url += (':' + ecr_client.version) + return ecr_client.version, image_url + + def run(self): + log_warning("Deploying to {self.region}".format(**locals())) + self.init_stack_info() + if not os.path.exists(self.env_sample_file): + raise UnrecoverableException('env.sample not found. Exiting.') + + image_version, image_url = self._get_image() jobs = [] for index, service_name in enumerate(self.ecs_service_names): log_bold("Starting to deploy " + service_name) color = DEPLOYMENT_COLORS[index % 3] - image_url = ecr_client.ecr_image_uri - image_url += (':' + ecr_client.version) process = multiprocessing.Process( target=deployer.deploy_new_version, args=( self.region, self.cluster_name, service_name, - ecr_client.version, + image_version, self.name, self.env_sample_file, self.environment, diff --git a/cloudlift/deployment/task_definition_creator.py b/cloudlift/deployment/task_definition_creator.py index f218785b..ec4c4d99 100644 --- a/cloudlift/deployment/task_definition_creator.py +++ b/cloudlift/deployment/task_definition_creator.py @@ -21,12 +21,13 @@ def _complete_image_url(ecr_client: EcrClient): class TaskDefinitionCreator: - def __init__(self, name, environment, version, build_args, region='ap-south-1'): + def __init__(self, name, environment, version, image_uri, build_args, region='ap-south-1'): self.name = name self.environment = environment self.build_args = build_args self.region = region self.version = version + self.image_uri = image_uri self.client = get_client_for('iam', self.environment) self.resource = get_resource_for('iam', self.environment) self.env_sample_file = './env.sample' From f5d7af736ab56dacbc0947da01976b47fae8bcf8 Mon Sep 17 00:00:00 2001 From: Jagriti Sahu Date: Mon, 1 Apr 2024 22:19:53 +0530 Subject: [PATCH 2/5] removed image_uri from task defination creator --- cloudlift/deployment/task_definition_creator.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cloudlift/deployment/task_definition_creator.py b/cloudlift/deployment/task_definition_creator.py index ec4c4d99..f218785b 100644 --- a/cloudlift/deployment/task_definition_creator.py +++ b/cloudlift/deployment/task_definition_creator.py @@ -21,13 +21,12 @@ def _complete_image_url(ecr_client: EcrClient): class TaskDefinitionCreator: - def __init__(self, name, environment, version, image_uri, build_args, region='ap-south-1'): + def __init__(self, name, environment, version, build_args, region='ap-south-1'): self.name = name self.environment = environment self.build_args = build_args self.region = region self.version = version - self.image_uri = image_uri self.client = get_client_for('iam', self.environment) self.resource = get_resource_for('iam', self.environment) self.env_sample_file = './env.sample' From 36e783a0d0d6cf46371987edd631999f3e8adeff Mon Sep 17 00:00:00 2001 From: Jagriti Sahu Date: Mon, 1 Apr 2024 22:23:42 +0530 Subject: [PATCH 3/5] added full description for image_uri flag --- cloudlift/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cloudlift/__init__.py b/cloudlift/__init__.py index abd66b8e..ded56d9d 100644 --- a/cloudlift/__init__.py +++ b/cloudlift/__init__.py @@ -114,7 +114,7 @@ def edit_config(name, environment): @click.option('--version', default=None, help='local image version tag') @click.option('--image_uri', default=None, - help='image uri') + help='full ecr image uri of the image to be deployed') @click.option("--build-arg", type=(str, str), multiple=True, help="These args are passed to docker build command " "as --build-args. Supports multiple.\ Please leave space between name and value" ) From 8494e068b93be001d69a19089b5578cdf4c89112 Mon Sep 17 00:00:00 2001 From: Jagriti Sahu Date: Mon, 1 Apr 2024 22:26:53 +0530 Subject: [PATCH 4/5] moved log line for initiating deployment --- cloudlift/deployment/service_updater.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cloudlift/deployment/service_updater.py b/cloudlift/deployment/service_updater.py index ca51d41c..46de93fd 100644 --- a/cloudlift/deployment/service_updater.py +++ b/cloudlift/deployment/service_updater.py @@ -49,7 +49,6 @@ def _get_image(self): self.environment + " | version: " + str(ecr_client.version)) log_bold("Checking image in ECR") ecr_client.build_and_upload_image() - log_bold("Initiating deployment\n") image_url = ecr_client.ecr_image_uri image_url += (':' + ecr_client.version) return ecr_client.version, image_url @@ -61,7 +60,8 @@ def run(self): raise UnrecoverableException('env.sample not found. Exiting.') image_version, image_url = self._get_image() - + + log_bold("Initiating deployment\n") jobs = [] for index, service_name in enumerate(self.ecs_service_names): log_bold("Starting to deploy " + service_name) From cc71ec947674ec6a5d1b66aecbee43b528c71c52 Mon Sep 17 00:00:00 2001 From: Jagriti Sahu Date: Wed, 3 Apr 2024 17:44:08 +0530 Subject: [PATCH 5/5] use session instead of boto3 client for iam --- cloudlift/__init__.py | 6 ++---- cloudlift/deployment/service_template_generator.py | 5 +++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/cloudlift/__init__.py b/cloudlift/__init__.py index ded56d9d..de6bb836 100644 --- a/cloudlift/__init__.py +++ b/cloudlift/__init__.py @@ -113,13 +113,11 @@ def edit_config(name, environment): @_require_name @click.option('--version', default=None, help='local image version tag') -@click.option('--image_uri', default=None, - help='full ecr image uri of the image to be deployed') @click.option("--build-arg", type=(str, str), multiple=True, help="These args are passed to docker build command " "as --build-args. Supports multiple.\ Please leave space between name and value" ) -def deploy_service(name, environment, version, image_uri, build_arg): - ServiceUpdater(name, environment, None, version, image_uri, dict(build_arg)).run() +def deploy_service(name, environment, version, build_arg): + ServiceUpdater(name, environment, None, version, dict(build_arg)).run() @cli.command() diff --git a/cloudlift/deployment/service_template_generator.py b/cloudlift/deployment/service_template_generator.py index 474accfd..dc9c0439 100644 --- a/cloudlift/deployment/service_template_generator.py +++ b/cloudlift/deployment/service_template_generator.py @@ -6,7 +6,7 @@ from botocore.exceptions import ClientError from cloudlift.exceptions import UnrecoverableException from cloudlift.config import get_client_for - +from cloudlift.config import get_resource_for from awacs.aws import PolicyDocument, Statement, Allow, Principal from awacs.sts import AssumeRole from awacs.firehose import PutRecordBatch @@ -69,6 +69,7 @@ def __init__(self, service_configuration, environment_stack): self.bucket_name = 'cloudlift-service-template' self.environment = service_configuration.environment self.client = get_client_for('s3', self.environment) + self.iamresource = get_resource_for('iam', self.environment) self.team_name = (self.notifications_arn.split(':')[-1]) self.environment_configuration = EnvironmentConfiguration(self.environment).get_config().get(self.environment, {}) def _derive_configuration(self, service_configuration): @@ -343,7 +344,7 @@ def _add_service(self, service_name, config): service_name + "TaskDefinition", Family=service_name + "Family", ContainerDefinitions=[cd] + sidecar_container_defs, - ExecutionRoleArn=boto3.resource('iam').Role('ecsTaskExecutionRole').arn, + ExecutionRoleArn=self.iamresource.Role('ecsTaskExecutionRole').arn, TaskRoleArn=Ref(task_role), Tags=Tags(Team=self.team_name, environment=self.env), **launch_type_td