{"componentChunkName":"component---src-templates-blog-post-js","path":"/post/walkthrough-ecs-local","result":{"data":{"headerImage":{"childImageSharp":{"fluid":{"aspectRatio":3.3992537313432836,"src":"/static/b72d38f0a9a131a445c0798c8f11b233/85c19/blog-post-intro.png","srcSet":"/static/b72d38f0a9a131a445c0798c8f11b233/c95ef/blog-post-intro.png 911w,\n/static/b72d38f0a9a131a445c0798c8f11b233/6d938/blog-post-intro.png 1822w,\n/static/b72d38f0a9a131a445c0798c8f11b233/85c19/blog-post-intro.png 3635w","srcWebp":"/static/b72d38f0a9a131a445c0798c8f11b233/bbedc/blog-post-intro.webp","srcSetWebp":"/static/b72d38f0a9a131a445c0798c8f11b233/8f106/blog-post-intro.webp 911w,\n/static/b72d38f0a9a131a445c0798c8f11b233/4b1a2/blog-post-intro.webp 1822w,\n/static/b72d38f0a9a131a445c0798c8f11b233/bbedc/blog-post-intro.webp 3635w","sizes":"(max-width: 3635px) 100vw, 3635px"}}},"relatedPosts":{"nodes":[{"fields":{"slug":"/opsguru-achieves-aws-generative-ai-competency/"},"frontmatter":{"url":"opsguru-achieves-aws-generative-ai-competency","title":"OpsGuru Achieves AWS Generative AI Competency","description":"OpsGuru is proud to announce that we have achieved the AWS Generative AI Competency, further solidifying its position as an AWS Premier Partner and a leader in Generative AI solutions.","tags":["OpsGuru","AWS","Generative AI"],"date":"2024-07-24T11:00:00.000Z","image":{"childImageSharp":{"fluid":{"aspectRatio":1.9047619047619047,"src":"/static/d3afb29fd7b116bd1f9ccfb999d42b98/b460a/img-opsguru-achieves-aws-generative-ai-competency.png","srcSet":"/static/d3afb29fd7b116bd1f9ccfb999d42b98/d966b/img-opsguru-achieves-aws-generative-ai-competency.png 120w,\n/static/d3afb29fd7b116bd1f9ccfb999d42b98/67196/img-opsguru-achieves-aws-generative-ai-competency.png 240w,\n/static/d3afb29fd7b116bd1f9ccfb999d42b98/b460a/img-opsguru-achieves-aws-generative-ai-competency.png 480w,\n/static/d3afb29fd7b116bd1f9ccfb999d42b98/9a8d7/img-opsguru-achieves-aws-generative-ai-competency.png 720w,\n/static/d3afb29fd7b116bd1f9ccfb999d42b98/6e898/img-opsguru-achieves-aws-generative-ai-competency.png 960w,\n/static/d3afb29fd7b116bd1f9ccfb999d42b98/6050d/img-opsguru-achieves-aws-generative-ai-competency.png 1200w","srcWebp":"/static/d3afb29fd7b116bd1f9ccfb999d42b98/35871/img-opsguru-achieves-aws-generative-ai-competency.webp","srcSetWebp":"/static/d3afb29fd7b116bd1f9ccfb999d42b98/83552/img-opsguru-achieves-aws-generative-ai-competency.webp 120w,\n/static/d3afb29fd7b116bd1f9ccfb999d42b98/2b5a3/img-opsguru-achieves-aws-generative-ai-competency.webp 240w,\n/static/d3afb29fd7b116bd1f9ccfb999d42b98/35871/img-opsguru-achieves-aws-generative-ai-competency.webp 480w,\n/static/d3afb29fd7b116bd1f9ccfb999d42b98/9754a/img-opsguru-achieves-aws-generative-ai-competency.webp 720w,\n/static/d3afb29fd7b116bd1f9ccfb999d42b98/fcc10/img-opsguru-achieves-aws-generative-ai-competency.webp 960w,\n/static/d3afb29fd7b116bd1f9ccfb999d42b98/9000d/img-opsguru-achieves-aws-generative-ai-competency.webp 1200w","sizes":"(max-width: 480px) 100vw, 480px"}}}}},{"fields":{"slug":"/amazon-api-gateway/"},"frontmatter":{"url":"amazon-api-gateway","title":"OpsGuru Achieves Amazon API Gateway Service Delivery Designation","description":"OpsGuru is proud to announce that it has achieved the Amazon API Gateway Service Delivery designation.","tags":["AWS","OpsGuru"],"date":"2024-03-28T01:00:00.000Z","image":{"childImageSharp":{"fluid":{"aspectRatio":1.9047619047619047,"src":"/static/1d499ed29986e4c3dfc1ac64a1f9037c/b460a/image-amazon-api-gateway.png","srcSet":"/static/1d499ed29986e4c3dfc1ac64a1f9037c/d966b/image-amazon-api-gateway.png 120w,\n/static/1d499ed29986e4c3dfc1ac64a1f9037c/67196/image-amazon-api-gateway.png 240w,\n/static/1d499ed29986e4c3dfc1ac64a1f9037c/b460a/image-amazon-api-gateway.png 480w,\n/static/1d499ed29986e4c3dfc1ac64a1f9037c/9a8d7/image-amazon-api-gateway.png 720w,\n/static/1d499ed29986e4c3dfc1ac64a1f9037c/6e898/image-amazon-api-gateway.png 960w,\n/static/1d499ed29986e4c3dfc1ac64a1f9037c/6050d/image-amazon-api-gateway.png 1200w","srcWebp":"/static/1d499ed29986e4c3dfc1ac64a1f9037c/35871/image-amazon-api-gateway.webp","srcSetWebp":"/static/1d499ed29986e4c3dfc1ac64a1f9037c/83552/image-amazon-api-gateway.webp 120w,\n/static/1d499ed29986e4c3dfc1ac64a1f9037c/2b5a3/image-amazon-api-gateway.webp 240w,\n/static/1d499ed29986e4c3dfc1ac64a1f9037c/35871/image-amazon-api-gateway.webp 480w,\n/static/1d499ed29986e4c3dfc1ac64a1f9037c/9754a/image-amazon-api-gateway.webp 720w,\n/static/1d499ed29986e4c3dfc1ac64a1f9037c/fcc10/image-amazon-api-gateway.webp 960w,\n/static/1d499ed29986e4c3dfc1ac64a1f9037c/9000d/image-amazon-api-gateway.webp 1200w","sizes":"(max-width: 480px) 100vw, 480px"}}}}},{"fields":{"slug":"/amazon-lambda-service/"},"frontmatter":{"url":"amazon-lambda-service","title":"OpsGuru Achieves the AWS Lambda Service Delivery Designation","description":"OpsGuru is proud to announce that it has achieved the Amazon Web Services (AWS) Service Delivery designation for AWS Lambda.","tags":["AWS","OPSGURU"],"date":"2024-02-08T08:09:14.610Z","image":{"childImageSharp":{"fluid":{"aspectRatio":1.9047619047619047,"src":"/static/8998776053dfff0d19ccd2a612be9467/b460a/lambda-social-post.png","srcSet":"/static/8998776053dfff0d19ccd2a612be9467/d966b/lambda-social-post.png 120w,\n/static/8998776053dfff0d19ccd2a612be9467/67196/lambda-social-post.png 240w,\n/static/8998776053dfff0d19ccd2a612be9467/b460a/lambda-social-post.png 480w,\n/static/8998776053dfff0d19ccd2a612be9467/9a8d7/lambda-social-post.png 720w,\n/static/8998776053dfff0d19ccd2a612be9467/6e898/lambda-social-post.png 960w,\n/static/8998776053dfff0d19ccd2a612be9467/6050d/lambda-social-post.png 1200w","srcWebp":"/static/8998776053dfff0d19ccd2a612be9467/35871/lambda-social-post.webp","srcSetWebp":"/static/8998776053dfff0d19ccd2a612be9467/83552/lambda-social-post.webp 120w,\n/static/8998776053dfff0d19ccd2a612be9467/2b5a3/lambda-social-post.webp 240w,\n/static/8998776053dfff0d19ccd2a612be9467/35871/lambda-social-post.webp 480w,\n/static/8998776053dfff0d19ccd2a612be9467/9754a/lambda-social-post.webp 720w,\n/static/8998776053dfff0d19ccd2a612be9467/fcc10/lambda-social-post.webp 960w,\n/static/8998776053dfff0d19ccd2a612be9467/9000d/lambda-social-post.webp 1200w","sizes":"(max-width: 480px) 100vw, 480px"}}}}},{"fields":{"slug":"/enhancing-container-security-in-the-ci-cd-pipeline-with-amazon-inspector/"},"frontmatter":{"url":"Enhancing-Container-Security-in-the-CI-CD-Pipeline-with-Amazon-Inspector","title":"Enhancing Container Security in the CI/CD Pipeline with Amazon Inspector","description":"Discover the power of AWS Amazon Inspector in strengthening container security within the CI/CD pipeline and how this tool seamlessly integrates with existing systems like Jenkins and TeamCity.","tags":["AWS","Security"],"date":"2023-12-14T18:09:10.344Z","image":{"childImageSharp":{"fluid":{"aspectRatio":1.9047619047619047,"src":"/static/26f27d60d03c598c688c5cbff1a67623/b460a/og_blog_ci-cd-update.png","srcSet":"/static/26f27d60d03c598c688c5cbff1a67623/d966b/og_blog_ci-cd-update.png 120w,\n/static/26f27d60d03c598c688c5cbff1a67623/67196/og_blog_ci-cd-update.png 240w,\n/static/26f27d60d03c598c688c5cbff1a67623/b460a/og_blog_ci-cd-update.png 480w,\n/static/26f27d60d03c598c688c5cbff1a67623/9a8d7/og_blog_ci-cd-update.png 720w,\n/static/26f27d60d03c598c688c5cbff1a67623/6e898/og_blog_ci-cd-update.png 960w,\n/static/26f27d60d03c598c688c5cbff1a67623/6050d/og_blog_ci-cd-update.png 1200w","srcWebp":"/static/26f27d60d03c598c688c5cbff1a67623/35871/og_blog_ci-cd-update.webp","srcSetWebp":"/static/26f27d60d03c598c688c5cbff1a67623/83552/og_blog_ci-cd-update.webp 120w,\n/static/26f27d60d03c598c688c5cbff1a67623/2b5a3/og_blog_ci-cd-update.webp 240w,\n/static/26f27d60d03c598c688c5cbff1a67623/35871/og_blog_ci-cd-update.webp 480w,\n/static/26f27d60d03c598c688c5cbff1a67623/9754a/og_blog_ci-cd-update.webp 720w,\n/static/26f27d60d03c598c688c5cbff1a67623/fcc10/og_blog_ci-cd-update.webp 960w,\n/static/26f27d60d03c598c688c5cbff1a67623/9000d/og_blog_ci-cd-update.webp 1200w","sizes":"(max-width: 480px) 100vw, 480px"}}}}},{"fields":{"slug":"/genai-and-knowledge-bases-for-amazon-bedrock/"},"frontmatter":{"url":"genai-and-knowledge-bases-for-amazon-bedrock","title":"Supercharging Customer Experiences Using GenAI and Knowledge Bases For Amazon Bedrock","description":"Learn how to supercharge customer experiences using Generative AI and Knowledge Bases for Amazon Bedrock.","tags":["AWS","Generative AI"],"date":"2023-12-04T18:22:09.689Z","image":{"childImageSharp":{"fluid":{"aspectRatio":1.9047619047619047,"src":"/static/46b364c48b1c9c2d684133c0407d1f7c/b460a/opsguru_supercharge-1-.png","srcSet":"/static/46b364c48b1c9c2d684133c0407d1f7c/d966b/opsguru_supercharge-1-.png 120w,\n/static/46b364c48b1c9c2d684133c0407d1f7c/67196/opsguru_supercharge-1-.png 240w,\n/static/46b364c48b1c9c2d684133c0407d1f7c/b460a/opsguru_supercharge-1-.png 480w,\n/static/46b364c48b1c9c2d684133c0407d1f7c/9a8d7/opsguru_supercharge-1-.png 720w,\n/static/46b364c48b1c9c2d684133c0407d1f7c/6e898/opsguru_supercharge-1-.png 960w,\n/static/46b364c48b1c9c2d684133c0407d1f7c/6050d/opsguru_supercharge-1-.png 1200w","srcWebp":"/static/46b364c48b1c9c2d684133c0407d1f7c/35871/opsguru_supercharge-1-.webp","srcSetWebp":"/static/46b364c48b1c9c2d684133c0407d1f7c/83552/opsguru_supercharge-1-.webp 120w,\n/static/46b364c48b1c9c2d684133c0407d1f7c/2b5a3/opsguru_supercharge-1-.webp 240w,\n/static/46b364c48b1c9c2d684133c0407d1f7c/35871/opsguru_supercharge-1-.webp 480w,\n/static/46b364c48b1c9c2d684133c0407d1f7c/9754a/opsguru_supercharge-1-.webp 720w,\n/static/46b364c48b1c9c2d684133c0407d1f7c/fcc10/opsguru_supercharge-1-.webp 960w,\n/static/46b364c48b1c9c2d684133c0407d1f7c/9000d/opsguru_supercharge-1-.webp 1200w","sizes":"(max-width: 480px) 100vw, 480px"}}}}},{"fields":{"slug":"/aws-step-functions-gen-ai-accelerate-social-media-game/"},"frontmatter":{"url":"using-aws-step-functions-and-genai","title":"Using AWS Step Functions and GenAI to Accelerate Your Social Media Game","description":"Learn how to use AWS Step Functions and Generative AI to accelerate your social media game.","tags":["AWS","Generative AI"],"date":"2023-12-01T18:47:36.999Z","image":{"childImageSharp":{"fluid":{"aspectRatio":1.9047619047619047,"src":"/static/d7ac16bbbe2587a1f669ab35e20ae97e/b460a/opsguru_bedrock-blog-2.png","srcSet":"/static/d7ac16bbbe2587a1f669ab35e20ae97e/d966b/opsguru_bedrock-blog-2.png 120w,\n/static/d7ac16bbbe2587a1f669ab35e20ae97e/67196/opsguru_bedrock-blog-2.png 240w,\n/static/d7ac16bbbe2587a1f669ab35e20ae97e/b460a/opsguru_bedrock-blog-2.png 480w,\n/static/d7ac16bbbe2587a1f669ab35e20ae97e/9a8d7/opsguru_bedrock-blog-2.png 720w,\n/static/d7ac16bbbe2587a1f669ab35e20ae97e/6e898/opsguru_bedrock-blog-2.png 960w,\n/static/d7ac16bbbe2587a1f669ab35e20ae97e/6050d/opsguru_bedrock-blog-2.png 1200w","srcWebp":"/static/d7ac16bbbe2587a1f669ab35e20ae97e/35871/opsguru_bedrock-blog-2.webp","srcSetWebp":"/static/d7ac16bbbe2587a1f669ab35e20ae97e/83552/opsguru_bedrock-blog-2.webp 120w,\n/static/d7ac16bbbe2587a1f669ab35e20ae97e/2b5a3/opsguru_bedrock-blog-2.webp 240w,\n/static/d7ac16bbbe2587a1f669ab35e20ae97e/35871/opsguru_bedrock-blog-2.webp 480w,\n/static/d7ac16bbbe2587a1f669ab35e20ae97e/9754a/opsguru_bedrock-blog-2.webp 720w,\n/static/d7ac16bbbe2587a1f669ab35e20ae97e/fcc10/opsguru_bedrock-blog-2.webp 960w,\n/static/d7ac16bbbe2587a1f669ab35e20ae97e/9000d/opsguru_bedrock-blog-2.webp 1200w","sizes":"(max-width: 480px) 100vw, 480px"}}}}},{"fields":{"slug":"/https-opsguru-io-post-aws-resilience-services-competency/"},"frontmatter":{"url":"AWS-Resilience-Services-Competency","title":"OpsGuru Achieves the AWS Resilience Competency","description":"OpsGuru announced today that it has achieved the Amazon Web Services (AWS) Resilience Services Competency in the Core Resilience category.","tags":["AWS","Resilience"],"date":"2023-11-29T23:57:03.237Z","image":{"childImageSharp":{"fluid":{"aspectRatio":1.9047619047619047,"src":"/static/06f64733f7522ed2a581576d1514483e/b460a/opsguru_resiliencecompetency-darktheme.png","srcSet":"/static/06f64733f7522ed2a581576d1514483e/d966b/opsguru_resiliencecompetency-darktheme.png 120w,\n/static/06f64733f7522ed2a581576d1514483e/67196/opsguru_resiliencecompetency-darktheme.png 240w,\n/static/06f64733f7522ed2a581576d1514483e/b460a/opsguru_resiliencecompetency-darktheme.png 480w,\n/static/06f64733f7522ed2a581576d1514483e/9a8d7/opsguru_resiliencecompetency-darktheme.png 720w,\n/static/06f64733f7522ed2a581576d1514483e/6e898/opsguru_resiliencecompetency-darktheme.png 960w,\n/static/06f64733f7522ed2a581576d1514483e/6050d/opsguru_resiliencecompetency-darktheme.png 1200w","srcWebp":"/static/06f64733f7522ed2a581576d1514483e/35871/opsguru_resiliencecompetency-darktheme.webp","srcSetWebp":"/static/06f64733f7522ed2a581576d1514483e/83552/opsguru_resiliencecompetency-darktheme.webp 120w,\n/static/06f64733f7522ed2a581576d1514483e/2b5a3/opsguru_resiliencecompetency-darktheme.webp 240w,\n/static/06f64733f7522ed2a581576d1514483e/35871/opsguru_resiliencecompetency-darktheme.webp 480w,\n/static/06f64733f7522ed2a581576d1514483e/9754a/opsguru_resiliencecompetency-darktheme.webp 720w,\n/static/06f64733f7522ed2a581576d1514483e/fcc10/opsguru_resiliencecompetency-darktheme.webp 960w,\n/static/06f64733f7522ed2a581576d1514483e/9000d/opsguru_resiliencecompetency-darktheme.webp 1200w","sizes":"(max-width: 480px) 100vw, 480px"}}}}},{"fields":{"slug":"/aws-canadian-partner-of-the-year-award-2023/"},"frontmatter":{"url":"aws-canadian-partner-of-the-year-award-2023","title":"OpsGuru Awarded 2023 Canadian AWS Partner Award","description":"OpsGuru is excited to announce it is a recipient of a 2023 Canadian AWS Partner Award, recognizing leaders playing a key role in helping customers drive innovation and build solutions on Amazon Web Services (AWS) in Canada.","tags":["OpsGuru","AWS"],"date":"2023-06-14T11:30:00.000Z","image":{"childImageSharp":{"fluid":{"aspectRatio":1.9047619047619047,"src":"/static/42d684a030669bb657f0ea9a51f55f9a/836e2/img-aws-canadian-partner-of-the-year-award-2023.jpg","srcSet":"/static/42d684a030669bb657f0ea9a51f55f9a/6e81a/img-aws-canadian-partner-of-the-year-award-2023.jpg 120w,\n/static/42d684a030669bb657f0ea9a51f55f9a/fbe0e/img-aws-canadian-partner-of-the-year-award-2023.jpg 240w,\n/static/42d684a030669bb657f0ea9a51f55f9a/836e2/img-aws-canadian-partner-of-the-year-award-2023.jpg 480w,\n/static/42d684a030669bb657f0ea9a51f55f9a/94285/img-aws-canadian-partner-of-the-year-award-2023.jpg 720w,\n/static/42d684a030669bb657f0ea9a51f55f9a/b1cc5/img-aws-canadian-partner-of-the-year-award-2023.jpg 960w,\n/static/42d684a030669bb657f0ea9a51f55f9a/0ff54/img-aws-canadian-partner-of-the-year-award-2023.jpg 1200w","srcWebp":"/static/42d684a030669bb657f0ea9a51f55f9a/35871/img-aws-canadian-partner-of-the-year-award-2023.webp","srcSetWebp":"/static/42d684a030669bb657f0ea9a51f55f9a/83552/img-aws-canadian-partner-of-the-year-award-2023.webp 120w,\n/static/42d684a030669bb657f0ea9a51f55f9a/2b5a3/img-aws-canadian-partner-of-the-year-award-2023.webp 240w,\n/static/42d684a030669bb657f0ea9a51f55f9a/35871/img-aws-canadian-partner-of-the-year-award-2023.webp 480w,\n/static/42d684a030669bb657f0ea9a51f55f9a/9754a/img-aws-canadian-partner-of-the-year-award-2023.webp 720w,\n/static/42d684a030669bb657f0ea9a51f55f9a/fcc10/img-aws-canadian-partner-of-the-year-award-2023.webp 960w,\n/static/42d684a030669bb657f0ea9a51f55f9a/9000d/img-aws-canadian-partner-of-the-year-award-2023.webp 1200w","sizes":"(max-width: 480px) 100vw, 480px"}}}}},{"fields":{"slug":"/aws-microsoft-workloads-competency-status/"},"frontmatter":{"url":"aws-microsoft-workloads-competency-status","title":"OpsGuru Achieves AWS Microsoft Workloads Competency Status","description":"OpsGuru announced today that it has achieved [Amazon Web Services (AWS) Microsoft Workloads Competency](https://aws.amazon.com/windows/partner-solutions/) status. This designation recognizes that OpsGuru provides deep expertise to help customers design, migrate, deploy, and manage Microsoft-based applications on AWS.","tags":["AWS"],"date":"2023-03-28T14:03:04.188Z","image":{"childImageSharp":{"fluid":{"aspectRatio":1.9047619047619047,"src":"/static/0f541ece8b61c60a882e92d725d1d77c/b460a/og_announcement_awsworkloads_1200x627.png","srcSet":"/static/0f541ece8b61c60a882e92d725d1d77c/d966b/og_announcement_awsworkloads_1200x627.png 120w,\n/static/0f541ece8b61c60a882e92d725d1d77c/67196/og_announcement_awsworkloads_1200x627.png 240w,\n/static/0f541ece8b61c60a882e92d725d1d77c/b460a/og_announcement_awsworkloads_1200x627.png 480w,\n/static/0f541ece8b61c60a882e92d725d1d77c/9a8d7/og_announcement_awsworkloads_1200x627.png 720w,\n/static/0f541ece8b61c60a882e92d725d1d77c/6e898/og_announcement_awsworkloads_1200x627.png 960w,\n/static/0f541ece8b61c60a882e92d725d1d77c/6050d/og_announcement_awsworkloads_1200x627.png 1200w","srcWebp":"/static/0f541ece8b61c60a882e92d725d1d77c/35871/og_announcement_awsworkloads_1200x627.webp","srcSetWebp":"/static/0f541ece8b61c60a882e92d725d1d77c/83552/og_announcement_awsworkloads_1200x627.webp 120w,\n/static/0f541ece8b61c60a882e92d725d1d77c/2b5a3/og_announcement_awsworkloads_1200x627.webp 240w,\n/static/0f541ece8b61c60a882e92d725d1d77c/35871/og_announcement_awsworkloads_1200x627.webp 480w,\n/static/0f541ece8b61c60a882e92d725d1d77c/9754a/og_announcement_awsworkloads_1200x627.webp 720w,\n/static/0f541ece8b61c60a882e92d725d1d77c/fcc10/og_announcement_awsworkloads_1200x627.webp 960w,\n/static/0f541ece8b61c60a882e92d725d1d77c/9000d/og_announcement_awsworkloads_1200x627.webp 1200w","sizes":"(max-width: 480px) 100vw, 480px"}}}}},{"fields":{"slug":"/aws-strategic-collaboration-agreement/"},"frontmatter":{"url":"aws-strategic-collaboration-agreement","title":"OpsGuru Expands Capabilities to Help Canadian Companies Accelerate Digital Transformation Through Strategic Collaboration Agreement With AWS","description":"An expanded multi-year agreement with AWS furthers OpsGuru’s cloud solution capabilities and service offerings to help Canadian companies accelerate digital transformation.","tags":["AWS","OpsGuru"],"date":"2023-01-18T08:00:00.317Z","image":{"childImageSharp":{"fluid":{"aspectRatio":1.9047619047619047,"src":"/static/27b6ea1f72c64ad3ceec7a22f86c2ff0/836e2/OG_Announcement_collaboration.jpg","srcSet":"/static/27b6ea1f72c64ad3ceec7a22f86c2ff0/6e81a/OG_Announcement_collaboration.jpg 120w,\n/static/27b6ea1f72c64ad3ceec7a22f86c2ff0/fbe0e/OG_Announcement_collaboration.jpg 240w,\n/static/27b6ea1f72c64ad3ceec7a22f86c2ff0/836e2/OG_Announcement_collaboration.jpg 480w,\n/static/27b6ea1f72c64ad3ceec7a22f86c2ff0/94285/OG_Announcement_collaboration.jpg 720w,\n/static/27b6ea1f72c64ad3ceec7a22f86c2ff0/b1cc5/OG_Announcement_collaboration.jpg 960w,\n/static/27b6ea1f72c64ad3ceec7a22f86c2ff0/0ff54/OG_Announcement_collaboration.jpg 1200w","srcWebp":"/static/27b6ea1f72c64ad3ceec7a22f86c2ff0/35871/OG_Announcement_collaboration.webp","srcSetWebp":"/static/27b6ea1f72c64ad3ceec7a22f86c2ff0/83552/OG_Announcement_collaboration.webp 120w,\n/static/27b6ea1f72c64ad3ceec7a22f86c2ff0/2b5a3/OG_Announcement_collaboration.webp 240w,\n/static/27b6ea1f72c64ad3ceec7a22f86c2ff0/35871/OG_Announcement_collaboration.webp 480w,\n/static/27b6ea1f72c64ad3ceec7a22f86c2ff0/9754a/OG_Announcement_collaboration.webp 720w,\n/static/27b6ea1f72c64ad3ceec7a22f86c2ff0/fcc10/OG_Announcement_collaboration.webp 960w,\n/static/27b6ea1f72c64ad3ceec7a22f86c2ff0/9000d/OG_Announcement_collaboration.webp 1200w","sizes":"(max-width: 480px) 100vw, 480px"}}}}}]},"socials":{"frontmatter":{"socials":{"linkedin":"https://linkedin.com/company/opsguruteam","twitter":"https://twitter.com/opsguruteam","facebook":"https://www.facebook.com/OpsGuruTeam","github":"https://github.com/ops-guru"}}},"markdownRemark":{"html":"<p>As someone who works with AWS on a day-to-day basis, It’s important to stay up to date with all the changes and new features of the different services on the platform. That’s how one recent announcement caught my eye - the new capability of local testing of ECS.</p>\n<p>I am particularly interested in ECS local testing because it is a feature that bridges a known gap. In recent years, containers have become increasingly popular. Without a doubt Kubernetes has been the leading standard for containers deployment. Whilst Kubernetes is feature-rich and powerful, it attracts users because the same Kubernetes can be run locally on a developer’s desktop.</p>\n<p>When developing a feature, I want to be able to test it as quickly and quietly as possible. A tool that allows me to perform rapid and quiet testing while I am trying to figure things out is very helpful. Being able to deploy onto Kubernetes means that I can test the same manifests locally, making sure that all changes can be tested before the deployments are scrutinized by my peers and potentially impact shared resources, it gives me confidence that I am not wasting my teams’ resources and time.</p>\n<p>ECS was first announced in 2013 and has been the go-to tool for containers orchestration on AWS (as evidenced by the number of new features on the public containers roadmap). While others can get on the heated -- and even religious -- debate on the virtue of Kubernetes vs ECS, the straightforwardness of ECS, the tight and intuitive integration of ECS with the other AWS features, is very attractive. For someone who is heavily leveraging AWS, and needs some container orchestration for part of workloads, more often than not ECS is sufficient.</p>\n<p>Until now, it has been challenging to encourage developers to work closely with ECS, because developers cannot test their work unless they deploy directly onto AWS ECS clusters that are running on AWS. Prior to this release, it is necessary to raise an ECS cluster on AWS and test the task definitions on the cloud to verify ECS workloads. Whilst this makes sense for feature integration and performance testing, it is a significant entry barrier for early development. Not every developer will have direct access to ECS resources, and to follow through with the CI/CD workflow for every minute change tends to be too slow for feedback. To workaround the overhead, developers often choose to develop with docker-compose, and leave the ECS testing for a later state. This delay can make deployments more error-prone and ECS more difficult to adopt. With the new feature, the barrier for ECS adoption seems to be significantly reduced.</p>\n<p>The new ECS feature supports testing of network modes, secrets, volumes and credentials without the requirement of launching an ECS Task or an ECS Service on AWS and doing everything locally on the work-station. This is achieved by ecs-cli, which is a wrapper of Docker and Docker Compose that simulates a fully functional ECS environment via a special container. With this wrapper, the user can locally get mock endpoints and resources available to test tasks and verify application functionality.</p>\n<h2>Pre-requisites</h2>\n<p>The usual tools associated with a container-based development environment still apply; namely, Docker and Docker Compose. On top of that; installing ecs-cli command line tool.</p>\n<p>Valid AWS credentials are required too:</p>\n<ul>\n<li>Install Docker: <a href=\"https://docs.docker.com/install/\">https://docs.docker.com/install/</a></li>\n<li>Install Docker Compose: <a href=\"https://docs.docker.com/compose/install/\">https://docs.docker.com/compose/install/</a></li>\n<li>Install AWS ecs-cli: <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_CLI_installation.html\">https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_CLI_installation.html</a></li>\n<li>Export your AWS ACCESS KEY and AWS SECRET KEY to Environment variables:</li>\n</ul>\n<p>For this walkthrough, I have created several ECR Repositories:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxx\nexport AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\nexport AWS_DEFAULT_REGION=us-west-1</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span></span></pre></div>\n<p><img src=\"/img/picture-1.jpg\" alt=\"A screenshot of ECR Repositorties.\"></p>\n<p>In each repository, there are several images e.g. app2</p>\n<p><img src=\"/img/picture-2.jpg\"></p>\n<p>The same images are accessible on the command line with ecs-cli command line tool. For example, the following will list the available images, along with respective metadata.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">ecs-cli images</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p><img src=\"/img/picture-3.jpg\"></p>\n<p>In order to pull the images from the ECR to my workstation I need AWS credentials and <a href=\"https://docs.aws.amazon.com/AmazonECR/latest/userguide/ECR_AWSCLI.html\">Docker authenticatication with the remote repository</a>. The following command will initiate and perform login from my local machine to ECR</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">$(aws ecr get-login --no-include-email --region us-west-1)</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>Before local execution of ECS takes place, I need to define the run-time parameters for the containers, such as the memory and CPU requirements and the ports opened. This is done in the ECS task definition. While the task definitions need to be created on AWS initially, I can download the task definition as JSON file to my local machine or use remote task definitions for local testing. For my test application (<strong>app-main</strong>), I have already created several versions of a task definition on ECS.</p>\n<p><img src=\"/img/picture-4.jpg\"></p>\n<h2>The ecs-cli Walkthrough</h2>\n<p>ecs-cli for local testing have only 4 subcommands for now:</p>\n<p><img src=\"/img/picture-5.jpg\"></p>\n<h3>Launching a Task</h3>\n<p>The following command will locally launch a Docker container based on a task definition:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">ecs-cli local up --task-def-remote app-main:6</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p><strong>app-main</strong> is the name of the task-definition and <strong>6</strong> is the revision of the task definition - If the version is omitted, the <strong>latest</strong> version will be used.</p>\n<p>Trying out with the latest version of my task definition.</p>\n<p><img src=\"/img/picture-6.jpg\"></p>\n<p><strong><em>and voilà!</em></strong></p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">ecs-cli local up</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>did a few things:</p>\n<ol>\n<li>Wrote <strong><code class=\"language-text\">docker-compose.ecs-local.yaml</code></strong> file</li>\n<li>Wrote an additional <code class=\"language-text\">docker-compose.ecs-local.override.yml</code> file</li>\n<li>Created local network <code class=\"language-text\">ecs-local-network</code> for containers</li>\n<li>Pulled Image <strong><code class=\"language-text\">amazon/amazon-ecs-local-container-endpoints</code></strong></li>\n<li>Used <code class=\"language-text\">docker-compose</code> binary to start the relevant containers as described in our Task Definition</li>\n<li>Pulled a corresponding Image of the relevant container from ECR</li>\n<li>Created Container <strong><code class=\"language-text\">ecslocal-lab_app-main_1</code></strong></li>\n</ol>\n<h3>Examining the Running Task</h3>\n<p>ECS Local uses the Docker Compose installed on the local machine to create network for containers and provision those containers. The information is captured at the generated <code class=\"language-text\">docker-compose.ecs-local.yaml</code> file. The <code class=\"language-text\">ecs-local.yaml</code> file acts as the local counterpart of the task definition that is stored on AWS.</p>\n<p>Content of docker-compose.ecs-local.yml</p>\n<p><img src=\"/img/picture-7.jpg\"></p>\n<p>Another file <code class=\"language-text\">docker-compose.ecs-local.override.yml</code> created is used to define a single container that emulates how credentials are exposed to a running container.</p>\n<p>Content of <code class=\"language-text\">docker-compose.ecs-local.override.yml</code></p>\n<p><img src=\"/img/picture-8.jpg\"></p>\n<p>At examining the running processes with ecs-cli, I can see that my test application is running.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">ecs-cli local ps --all</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p><img src=\"/img/picture-9.jpg\"></p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">docker ps --all</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>However, if I repeat the above using native docker command, an additional container running alongside the application container is found:</p>\n<p><img src=\"/img/picture-10.jpg\"></p>\n<p>The abstracted <strong><code class=\"language-text\">amazon-ecs-local-container-endpoints</code></strong> container is essentially a mock service that simulates AWS endpoints with configured ECS Task IAM Role in the task definition.</p>\n<p>The above also shows that the application container is running on port 32771 and forwarding traffic to port 80 on the container itself. Port 80 is open because it is defined as such in the task definition.</p>\n<p>With this set-up, I can now access the container in two ways,</p>\n<p>Via Local network IP address by running</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">docker network inspect ecs-local-network</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p><img src=\"/img/picture-11.jpg\"></p>\n<p>and</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">curl http://169.254.170.3</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p><img src=\"/img/picture-12.jpg\"></p>\n<p>Via the assigned Port on the local machine by running</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">ifconfig</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p>to get our local IP address in network <strong><code class=\"language-text\">ecs-local-network</code></strong></p>\n<p><img src=\"/img/picture-13.jpg\"></p>\n<p>then calling against the address and assigned port</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">curl 169.254.170.1:32771</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p><img src=\"/img/picture-14.jpg\"></p>\n<p>The container in concern is a trivial example for a container, therefore testing it is straightforward. But imagine a complex task where multiple containers are running, instead of needing to emulate the task definition locally with a docker-compose (which would be thrown away once the troubleshooting is done) there is now an AWS provided tool that translates the task definition to something that can run locally, therefore bridging some of the difficulty of making ECS usable beyond AWS.</p>\n<h3>Stopping the Task</h3>\n<p>Once I have my local troubleshooting of ECS, I can stop all running containers and delete local network quite easily by another ecs-cli local command:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-text line-numbers\"><code class=\"language-text\">ecs-cli local down --all</code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span></span></pre></div>\n<p><img src=\"/img/picture-15.jpg\"></p>\n<h2>Observations and Musings</h2>\n<p>When I first heard about ECS local testing, I thought that AWS was stepping into the right direction, to make ECS more accessible to developers. When AWS published ECS CLI a few years ago, it seemed to be following the precedents set by competitors such as Heroku, to make the containers deployment an easy one-step process. The unenviable position for ECS, however, is that while it is not as complex Kubernetes, it is not as straightforward as other developer-friendly services such as Elastic Beanstalk. ECS appears after all, to be targeting infrastructure teams to run containers easily without the complexity, but it lacks the intuitiveness for developers to adopt it readily and enthusiastically. The local testing option of ECS appears to be an attempt to draw developers closer to the service, by emulating the environment locally, and therefore supporting local work and experiment.</p>\n<p>It may be too early to give a full verdict to the ECS local testing functionality. As the prerequisites for ECS local are still heavily based on the cloud e.g. task definitions on ECS and containers being uploaded already to ECR, it is still arguably not ready for developers who are completely new to the containers ecosystem. However, it is certainly useful to gain some local understanding of the inner workings of ECS. I look forward to new features being introduced with the local tool, and maybe examples on how to best leverage it.</p>\n<p>It is noteworthy that ecs-cli can be used for Fargate development as well. As Fargate is the serverless version of ECS, and is expected to marry the best of containers (in terms of duration, flexibility of resource allocations) and serverless (in terms of simplicity and lack of cluster management), perhaps ecs-local is another way to approach a serverless future.</p>\n<h2>Conclusion</h2>\n<p>We have seen that <code class=\"language-text\">ecs-cli local</code> is a useful wrapper for Docker and Docker Compose, which you can leverage to quickly and efficiently test your ECS Task Definition configurations locally without actually deploying your task to a remote ECS Cluster.</p>\n<p>This enables quick and more efficient development &#x26; test cycles and is overall a great addition to the evolving AWS ECS ecosystem.</p>\n<p>Interested in hearing more about our containers expertise?</p>\n<p>Contact us at <a href=\"mailto:info@opsguru.io\">info@opsguru.io</a></p>\n<p>- Written by <a href=\"https://ca.linkedin.com/in/denis-astahov\">Denis Astahov</a></p>","frontmatter":{"seo":{"title":"Walkthrough - ECS Local: Bringing ECS to your local environment","description":"As someone who works with AWS on a day-to-day basis, It’s important to stay up to date with all the changes and new features of the different services on the platform. That’s how one recent announcement caught my eye - The new capability of local testing of ECS.","canonical":null,"image":{"childImageSharp":{"fluid":{"aspectRatio":2.1186440677966103,"src":"/static/12224681f2fd40bf0749423e29cf8d0c/724c8/technology-education-information-handover.jpg","srcSet":"/static/12224681f2fd40bf0749423e29cf8d0c/84d81/technology-education-information-handover.jpg 250w,\n/static/12224681f2fd40bf0749423e29cf8d0c/f0719/technology-education-information-handover.jpg 500w,\n/static/12224681f2fd40bf0749423e29cf8d0c/724c8/technology-education-information-handover.jpg 1000w,\n/static/12224681f2fd40bf0749423e29cf8d0c/0ff54/technology-education-information-handover.jpg 1200w","srcWebp":"/static/12224681f2fd40bf0749423e29cf8d0c/36ebb/technology-education-information-handover.webp","srcSetWebp":"/static/12224681f2fd40bf0749423e29cf8d0c/1d872/technology-education-information-handover.webp 250w,\n/static/12224681f2fd40bf0749423e29cf8d0c/4e6d4/technology-education-information-handover.webp 500w,\n/static/12224681f2fd40bf0749423e29cf8d0c/36ebb/technology-education-information-handover.webp 1000w,\n/static/12224681f2fd40bf0749423e29cf8d0c/9000d/technology-education-information-handover.webp 1200w","sizes":"(max-width: 1000px) 100vw, 1000px","maxHeight":471,"maxWidth":1000}}}},"title":"Walkthrough - ECS Local: Bringing ECS to your local environment","date":"2019-09-17T16:00:00.000Z","tags":["Kubernetes","AWS"],"author":{"name":"Denis Astahov","photo":{"extension":"jpg","publicURL":"/static/b8581f09605f794d3e9dcff8a5b95791/denis.jpg","childImageSharp":{"fluid":{"aspectRatio":1,"src":"/static/b8581f09605f794d3e9dcff8a5b95791/836e2/denis.jpg","srcSet":"/static/b8581f09605f794d3e9dcff8a5b95791/6e81a/denis.jpg 120w,\n/static/b8581f09605f794d3e9dcff8a5b95791/fbe0e/denis.jpg 240w,\n/static/b8581f09605f794d3e9dcff8a5b95791/836e2/denis.jpg 480w,\n/static/b8581f09605f794d3e9dcff8a5b95791/c3638/denis.jpg 600w","srcWebp":"/static/b8581f09605f794d3e9dcff8a5b95791/35871/denis.webp","srcSetWebp":"/static/b8581f09605f794d3e9dcff8a5b95791/83552/denis.webp 120w,\n/static/b8581f09605f794d3e9dcff8a5b95791/2b5a3/denis.webp 240w,\n/static/b8581f09605f794d3e9dcff8a5b95791/35871/denis.webp 480w,\n/static/b8581f09605f794d3e9dcff8a5b95791/fc91b/denis.webp 600w","sizes":"(max-width: 480px) 100vw, 480px"}}}},"image":{"childImageSharp":{"fluid":{"aspectRatio":2.127659574468085,"src":"/static/12224681f2fd40bf0749423e29cf8d0c/8c3c2/technology-education-information-handover.jpg","srcSet":"/static/12224681f2fd40bf0749423e29cf8d0c/15aed/technology-education-information-handover.jpg 300w,\n/static/12224681f2fd40bf0749423e29cf8d0c/a07a5/technology-education-information-handover.jpg 600w,\n/static/12224681f2fd40bf0749423e29cf8d0c/8c3c2/technology-education-information-handover.jpg 1200w","srcWebp":"/static/12224681f2fd40bf0749423e29cf8d0c/e7405/technology-education-information-handover.webp","srcSetWebp":"/static/12224681f2fd40bf0749423e29cf8d0c/4fec1/technology-education-information-handover.webp 300w,\n/static/12224681f2fd40bf0749423e29cf8d0c/483a3/technology-education-information-handover.webp 600w,\n/static/12224681f2fd40bf0749423e29cf8d0c/e7405/technology-education-information-handover.webp 1200w","sizes":"(max-width: 1200px) 100vw, 1200px"}}}}}},"pageContext":{"id":"a4171013-84b0-5ccb-a0d9-4342e8dc8786","categories":["Kubernetes","AWS"]}},"staticQueryHashes":["2885285593","3468301799"]}