Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Continuous Integration and Continuous Delivery ...

Continuous Integration and Continuous Delivery for your serverless apps

How can you accelerate the delivery of new, high-quality services? How can you be able to experiment and get feedback quickly from your customers? To get the most out of the agility afforded by serverless and containers, it is essential to build CI/CD pipelines that help teams iterate on code and quickly release features. In this talk, we demonstrate how developers can build effective CI/CD release workflows to manage their serverless or containerized deployments on AWS. We cover infrastructure-as-code (IaC) application models, such as AWS Serverless Application Model (AWS SAM) and new imperative IaC tools. We also demonstrate how to set up CI/CD release pipelines with AWS Code-* family of services

More Decks by Sébastien Stormacq - AWS Developer Advocate

Other Decks in Technology

Transcript

  1. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Continuous Integration & Deployment for Modern Applications @sebsto sebsto { "name” : "Sébastien Stormacq", "role” : "Developer Evangelist", "company": "Amazon Web Services”, "twitter": ”@sebsto”, "github” : "sebsto" }
  2. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Development transformation at Amazon: 2001–2002 monolithic application + teams 2001 Lesson learned: decompose for agility 2002 microservices + 2 pizza teams
  3. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Full ownership Full accountability “DevOps” Focused innovation Two-pizza teams
  4. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Monolith development lifecycle monitor release test build developers delivery pipelines services
  5. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Microservice development lifecycle ??? developers delivery pipelines services
  6. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Microservice development lifecycle developers services monitor release test build delivery pipelines monitor release test build monitor release test build monitor release test build monitor release test build monitor release test build
  7. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Release process stages Source Build Test Production
  8. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Release process stages Source Build Test Production
  9. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Release process stages Source Build Test Production
  10. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Pillars of releasing modern applications
  11. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Pillars of releasing modern applications Infrastructure as code
  12. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Infrastructure as code goals 1. Make infrastructure changes repeatable and predictable 2. Release infrastructure changes using the same tools as code changes 3. Replicate production environment in a staging environment to enable continuous testing
  13. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Infrastructure as code Declarative I tell you what I need I tell you what to do Imperative
  14. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Model container environments with AWS Cloud Development Kit (CDK) • Open source framework to define cloud infrastructure in TypeScript, Python, Java, C#, … • Provides library of higher-level resource types (“construct” classes) that have AWS best practices built in by default, packaged as npm modules • Provisions resources with CloudFormation • Supports all CloudFormation resource types AWS CDK https://awslabs.github.io/aws-cdk D eveloper Preview
  15. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. AWS Cloud Development Kit (CDK) npm install -g aws-cdk cdk init app --language typescript cdk synth cdk deploy cdk diff cdk destroy CodePipeline Use CloudFormation deployment actions with any synthesized CDK application Jenkins Use CDK CLI D eveloper Preview TypeScript C# F# Java Python …
  16. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. CDK template import ec2 = require('@aws-cdk/aws-ec2'); import ecs = require('@aws-cdk/aws-ecs'); import cdk = require('@aws-cdk/cdk'); class BonjourFargate extends cdk.Stack { constructor(parent: cdk.App, name: string, props?: cdk.StackProps) { super(parent, name, props); const vpc = new ec2.VpcNetwork(this, 'MyVpc', { maxAZs: 2 }); const cluster = new ecs.Cluster(this, 'Cluster', { vpc }); new ecs.LoadBalancedFargateService( this, "FargateService", { cluster, image: ecs.DockerHub.image("amazon/amazon-ecs-sample"), }); } } const app = new cdk.App(); new BonjourFargate(app, 'Bonjour'); app.run(); TypeScript
  17. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. import ec2 = require('@aws-cdk/aws-ec2'); import ecs = require('@aws-cdk/aws-ecs'); import cdk = require('@aws-cdk/cdk'); class BonjourFargate extends cdk.Stack { constructor(parent: cdk.App, name: string, props?: cdk.StackProps) { super(parent, name, props); const vpc = new ec2.VpcNetwork(this, 'MyVpc', { maxAZs: 2 }); const cluster = new ecs.Cluster(this, 'Cluster', { vpc }); new ecs.LoadBalancedFargateService( this, "FargateService", { cluster, image: ecs.DockerHub.image("amazon/amazon-ecs-sample"), }); } } const app = new cdk.App(); new BonjourFargate(app, 'Bonjour'); app.run(); CDK template TypeScript
  18. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. CDK template import ec2 = require('@aws-cdk/aws-ec2'); import ecs = require('@aws-cdk/aws-ecs'); import cdk = require('@aws-cdk/cdk'); class BonjourFargate extends cdk.Stack { constructor(parent: cdk.App, name: string, props?: cdk.StackProps) { super(parent, name, props); const vpc = new ec2.VpcNetwork(this, 'MyVpc', { maxAZs: 2 }); const cluster = new ecs.Cluster(this, 'Cluster', { vpc }); new ecs.LoadBalancedFargateService( this, "FargateService", { cluster, image: ecs.DockerHub.image("amazon/amazon-ecs-sample"), }); } } const app = new cdk.App(); new BonjourFargate(app, 'Bonjour'); app.run(); TypeScript
  19. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. CDK Lambda cron example export class LambdaCronStack extends cdk.Stack { constructor(app: cdk.App, id: string) { super(app, id); const lambdaFn = new lambda.Function(this, 'Singleton', { code: new lambda.InlineCode( fs.readFileSync('lambda-handler.py', { encoding: 'utf-8' })), handler: 'index.main’, timeout: 300, runtime: lambda.Runtime.Python37, }); const rule = new events.EventRule(this, 'Rule', { scheduleExpression: 'cron(0 18 ? * MON-FRI *)’, }); rule.addTarget(lambdaFn); } } Lambda function CloudWatch Events rule CloudFormation Stack Set the target TypeScript
  20. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Pillars of releasing modern applications Infrastructure as code
  21. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Pillars of releasing modern applications Continuous integration
  22. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Continuous integration goals Source Build Test Production
  23. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Continuous integration goals 1. Automatically kick off a new release when new code is checked in 2. Build and test code in a consistent, repeatable environment 3. Continually have an artifact ready for deployment 4. Continually close feedback loop when build fails
  24. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. AWS CodeBuild • Fully managed build service that compiles source code, runs tests, and produces software packages • Scales continuously and processes multiple builds concurrently • No build servers to manage • Pay by the minute, only for the compute resources you use • Monitor builds through CloudWatch Events
  25. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Pillars of releasing modern applications Continuous integration
  26. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Pillars of releasing modern applications Continuous deployment
  27. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Continuous deployment goals Source Build Test Production
  28. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Continuous deployment goals 1. Automatically deploy new changes to staging environments for testing 2. Deploy to production safely without impacting customers 3. Deliver to customers faster: Increase deployment frequency, and reduce change lead time and change failure rate
  29. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. AWS CodeDeploy • Automates code deployments to any instance and Lambda • Handles the complexity of updating your applications • Avoid downtime during application deployment • Roll back automatically if failure detected • Deploy to Amazon EC2, Lambda, or on-premises servers
  30. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Progressive Deployment with Lambda Enable in your serverless application template Resources: GetFunction: Type: AWS::Serverless::Function Properties: DeploymentPreference: Type: Canary10Percent10Minutes Alarms: - !Ref ErrorsAlarm Hooks: PreTraffic: !Ref PreTrafficHook Canary10Percent30Minutes Canary10Percent5Minutes Canary10Percent10Minutes Canary10Percent15Minutes Linear10PercentEvery10Minutes Linear10PercentEvery1Minute Linear10PercentEvery2Minutes Linear10PercentEvery3Minutes AllAtOnce
  31. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. CodeDeploy – Lambda canary deployment API Gateway Lambda function weighted alias “live” v1 Lambda function code 100%
  32. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. CodeDeploy – Lambda canary deployment API Gateway Lambda function weighted alias “live” v1 code 100% Run PreTraffic hook against v2 code before it receives traffic v2 code 0%
  33. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. CodeDeploy – Lambda canary deployment API Gateway Lambda function weighted alias “live” v1 code 90% Wait for 10 minutes, roll back in case of alarm v2 code 10%
  34. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. CodeDeploy – Lambda canary deployment API Gateway Lambda function weighted alias “live” v1 code 0% Run PostTraffic hook and complete deployment v2 code 100%
  35. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. CodeDeploy-ECS blue-green deployments • Provisions “green” tasks, then flips traffic at the load balancer • Validation “hooks” enable testing at each stage of the deployment • Fast rollback to “blue” tasks in seconds if case of hook failure or CloudWatch alarms • Monitor deployment status and history via console, API, Amazon SNS notifications, and CloudWatch Events • Use “CodeDeploy-ECS” deploy action in CodePipeline or “aws ecs deploy” command in Jenkins
  36. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. CodeDeploy-ECS blue-green deployment 100% Prod traffic
  37. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. CodeDeploy-ECS blue-green deployment Target group 2 100% Prod traffic Test traffic listener (port 9000)
  38. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. CodeDeploy-ECS blue-green deployment Green tasks: v2 code 100% Prod traffic Provision green tasks
  39. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. CodeDeploy-ECS blue-green deployment 100% Prod traffic Run hook against test endpoint before green tasks receive prod traffic 0% Prod traffic
  40. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. CodeDeploy-ECS blue-green deployment Flip traffic to green tasks, rollback in case of alarm 0% Prod traffic 100% Prod traffic
  41. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. CodeDeploy-ECS blue-green deployment 100% Prod traffic Drain blue tasks
  42. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Pillars of releasing modern applications Continuous deployment
  43. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Pillars of releasing modern applications
  44. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Takeaways 1. Manage your infrastructure as code 2. Frequently build and integrate your code to get a first feedback 3. Continuously release in production using canary releases with monitoring and automated rollbacks 4. Use canary releases to get both technical and business feedback
  45. © 2019, Amazon Web Services, Inc. or its affiliates. All

    rights reserved. Thank you – leave your feedback ! { "name” : "Sébastien Stormacq", "role” : "Developer Evangelist", "company": "Amazon Web Services”, "twitter": ”@sebsto”, "github” : "sebsto" } @sebsto sebsto