Package: aws-ci-cd-fargate
AWS Ci Cd FargateA library that creates a full out-of-the-box solution for ECS Fargate with CI/CD pipeline.RemarksThe project is written byDeividas Tamkus, supervised byLaimonas Sutkusand is owned byiDenfy. This is an open source
library intended to be used by anyone.iDenfyaims
to share its knowledge and educate market for better and more secure IT infrastructure.Related technologyThis project utilizes the following technology:AWS(Amazon Web Services).AWS CDK(Amazon Web Services Cloud Development Kit).AWS CloudFormation.AWS Loadbalancer.AWS ECS(Amazon Web Services Elastic Container Service).AWS Fargate(Serverless solution for ECS).AWS CodePipeline.AssumptionsThis library project assumes the following:You have knowledge in AWS (Amazon Web Services).You have knowledge in AWS CloudFormation and AWS loadbalancing.You are managing your infrastructure with AWS CDK.You are writing AWS CDK templates with a python language.InstallThe project is built and uploaded to PyPi. Install it by using pip.pipinstallaws-fargate-cdkOr directly install it through source../build.sh-icDescriptionThis package creates a Fargate service with autoscaling, balancing and two pipelines
for a complete out-of-the-box hosting infrastructure.The pipelines are as follows:ECR to ECS. This pipeline takes an image pushed to ECR and deploys it to Fargate using Blue/Green deployment.
The pipeline needs to be triggered manually duo to AWS CloudWatch event bugs related to ECR.CodeCommit to ECR. This pipeline takes code pushed to the master branch of a CodeCommit repository, builds an image out of it (source code needs a Dockerfile), pushes it to ECR and automatically triggers the first pipeline, which then deploys it to ECS.TL;DRPushing source code with a Dockerfile to CodeCommit repository deploys it to ECS Fargate.ExamplesCreate a fargate service with ci/cd:ecs_params=EcsParams(...)load_params=LoadBalancerParams(...)pipeline_params=PipelineParams(...)listener_params=LbListenerParameters(...)EcsFargateWithCiCd(scope=scope,prefix='pre',vpc=vpc,lb_params=load_params,ecs_params=ecs_params,lb_listener_params=listener_params,pipeline_params=pipeline_params)TutorialCreate a full infrastructure around ECS Fargate by using the following code below in your stack.fromaws_cdkimportcore,aws_ec2,aws_elasticloadbalancingv2fromaws_ci_cd_fargate.parameters.ecs_parametersimportEcsParamsfromaws_ci_cd_fargate.parameters.pipeline_parametersimportPipelineParamsfromaws_ci_cd_fargate.parameters.load_balancer_parametersimportLoadBalancerParamsfromaws_ci_cd_fargate.parameters.lb_listener_parametersimportLbListenerParametersfromaws_ci_cd_fargate.ecs_fargate_with_ci_cdimportEcsFargateWithCiCdclassMainStack(core.Stack):def__init__(self,scope:core.App)->None:super().__init__(scope=scope,id='MyCoolStack')# Create your own vpc or use an existing one.vpc=aws_ec2.Vpc(...)# Create a security group for your ECS Fargate instances.sg=aws_ec2.SecurityGroup(...)# Create a loadbalancer.loadbalancer=aws_elasticloadbalancingv2.ApplicationLoadBalancer(...)production_listener=aws_elasticloadbalancingv2.ApplicationListener(self,'Prod',load_balancer=loadbalancer)deployments_listener=aws_elasticloadbalancingv2.ApplicationListener(self,'Test',load_balancer=loadbalancer)ecs_params=EcsParams('FargateEcsContainer',256,512,80,{},[sg],vpc.private_subnets)load_params=LoadBalancerParams()pipeline_params=PipelineParams()listener_params=LbListenerParameters(production_listener=production_listener,deployment_listener=deployments_listener,rule_priority=100,rule_condition=aws_elasticloadbalancingv2.CfnListenerRule.RuleConditionProperty(field='path-pattern',path_pattern_config=aws_elasticloadbalancingv2.CfnListenerRule.PathPatternConfigProperty(values=['/*'])))self.ecs_infrastructure=EcsFargateWithCiCd(scope=self,prefix='MyCool',vpc=vpc,lb_params=load_params,ecs_params=ecs_params,lb_listener_params=listener_params,pipeline_params=pipeline_params)# Access CodeCommit-To-Ecr pipeline._=self.ecs_infrastructure.pipeline.commit_to_ecr# Access Ecr-To-Ecs pipeline._=self.ecs_infrastructure.pipeline.ecr_to_ecsProvision you infrastructure withCloudFormationby callingcdk deploy.Create a Dockerfile as simple as:FROMnginxAfter you provision your infrastructure, go toAWS CodeCommitin your AWS Console.Find a newly created git repository.Commit the Dockerfile to the newly created repository to trigger a pipeline.(A tutorial on pushing code to remote repositories:AWS Tutorial).(A tutorial on setting up git ssh with aws git repositories:AWS Tutorial)Release history7.3.0Add md files.7.2.0AWS CDK dependency update 1.60.0 - 2.0.0.7.1.0Force dependency update 1.44.0 AWS CDK.7.0.0Do not allow to specify ecs port. Default to 80.
This is AWS limitation.6.0.0Instead of taking path config as a parameter, take the
whole rule config.5.0.1Use empty ecs repository dependency.5.0.0Project rename to a better and more explanatory name.4.0.9Dependency update.4.0.8Dependency update. Fix ecs service name key.4.0.7Dependency update.4.0.6Use newest cdk with newest breaking changes.4.0.5Add dependency which creates ecs service. CloudFormation itself
has too many bugs.4.0.2Destroy ecr on delete.4.0.0Build environment variable fix.4.0.0Add pipeline parameters and fix some major pipeline bugs.3.1.0Create custom resource to create ecs service. With deployment controller CODE_DEPLOY you
can not do CF updates.3.0.2Minor bug fix.3.0.1Readme fix.3.0.0Full project refactor. Accept loadbalancer's listeners for production and test traffic instead of creting
a loadbalancer here. This way we can reuse an existing loadbalancer.2.0.0Remove pipeline parameters as the artifacts bucket should be created automatically within this stack.1.0.0Initial project.