{"id":3261,"date":"2022-10-03T11:54:23","date_gmt":"2022-10-03T11:54:23","guid":{"rendered":"https:\/\/www.checkmateq.com\/blog\/?p=3261"},"modified":"2023-08-04T13:46:40","modified_gmt":"2023-08-04T13:46:40","slug":"aws-codepipeline","status":"publish","type":"post","link":"https:\/\/www.checkmateq.com\/blog\/aws-codepipeline","title":{"rendered":"Set up AWS CodePipeline to deploy react application using CloudFormation"},"content":{"rendered":"<p><strong>Amazon CloudFormation<\/strong> is a service provided by <a href=\"https:\/\/www.checkmateq.com\/aws-cloud\">AWS cloud<\/a> that aids in the modeling and configuration of your AWS resources so that you may spend more time concentrating on your AWS-based applications and less time managing those resources. The AWS resources you require (such as Amazon EC2 instances or Amazon RDS DB instances) are listed in a template that you build, and <strong>CloudFormation handles the provisioning and configuration<\/strong>\u00a0of those resources on your behalf.\u00a0<strong>CloudFormation takes care of the creation, configuration, and identification of the dependencies between AWS resources<\/strong>, so you don\u2019t have to.<\/p>\n<p>In this blog, we will use CloudFormation to create an AWS CodePipeline to deploy a react application to an EC2 instance.<\/p>\n<h3>Prerequisites:<\/h3>\n<ul>\n<li>\u00a0An S3 bucket to store the build artifacts.<\/li>\n<li>A CodeCommit repository to store the react code.<\/li>\n<li>A key-pair file for SSH to EC2 instance.<\/li>\n<\/ul>\n<h3>Step1: Launch an EC2 instance using Cloudformation template<\/h3>\n<ul>\n<li>Use the following CloudFormation template for launching the EC2 instance.<\/li>\n<li>Here we are using Amazon Linux AMI in the Ohio region.<\/li>\n<li>EC2 instance requires access to the S3 bucket so we will attach a required IAM policy to it so that it can access it.<\/li>\n<li>We will also need to install the CodeDeploy agent in the EC2 instance. We have used User data to install it.<\/li>\n<\/ul>\n<pre>AWSTemplateFormatVersion: 2010-09-09\r\nDescription: EC2 Instance with access to S3 buckets\r\n\r\nParameters:\r\n  KeyName: \r\n    Type: String\r\n    Default: ohio-keypair\r\n\r\n  myInstanceType: \r\n    Type: String\r\n    Default: t2.micro\r\n\r\n  myAMI: \r\n    Type: String\r\n    Default: ami-0f924dc71d44d23e2 \r\n\r\n      \r\n      \r\n\r\nResources:\r\n  EC2InstanceProfileRole:\r\n    Type: 'AWS::IAM::Role'\r\n    Properties:\r\n      AssumeRolePolicyDocument:\r\n        Version: 2012-10-17\r\n        Statement:\r\n          - Effect: Allow\r\n            Principal:\r\n              Service:\r\n                - ec2.amazonaws.com\r\n            Action: 'sts:AssumeRole'\r\n      Path: \/\r\n      Policies:\r\n        - PolicyName: EC2InstanceProfilePolicy\r\n          PolicyDocument:\r\n            Version: 2012-10-17\r\n            Statement:\r\n              - Effect: Allow\r\n                Action:\r\n                  - 's3:Get*'\r\n                  - 's3:List*'\r\n                Resource: '*'\r\n\r\n  MyInstanceProfile:\r\n    Type: 'AWS::IAM::InstanceProfile'\r\n    Properties:\r\n      Path: \/\r\n      Roles:\r\n        - !Ref EC2InstanceProfileRole\r\n\r\n\r\n  MySecurityGroup:\r\n    Type: AWS::EC2::SecurityGroup\r\n    Properties:\r\n      GroupDescription: EC2 CF security group\r\n      SecurityGroupIngress:\r\n        - IpProtocol: tcp\r\n          FromPort: '22'\r\n          ToPort: '22'\r\n          CidrIp: 0.0.0.0\/0\r\n        - IpProtocol: tcp\r\n          FromPort: '80'          \r\n          ToPort: '80'\r\n          CidrIp: 0.0.0.0\/0\r\n \r\n  \r\n\r\n\r\n  MyEC2Instance:\r\n    Type: AWS::EC2::Instance\r\n    Properties:\r\n      ImageId: !Ref myAMI \r\n      InstanceType: !Ref myInstanceType\r\n      KeyName: !Ref KeyName\r\n      Tags:\r\n       - Key: 'Name'\r\n         Value: 'chkmt'\r\n\r\n      SecurityGroups:\r\n        - !Ref MySecurityGroup\r\n      IamInstanceProfile: !Ref MyInstanceProfile\r\n      UserData: \r\n        Fn::Base64:  |  \r\n           #!\/bin\/bash\r\n           sudo yum -y update \r\n           sudo yum -y install ruby\r\n           sudo yum -y install wget\r\n           sudo amazon-linux-extras install nginx1\r\n           curl -sL https:\/\/rpm.nodesource.com\/setup_16.x | sudo bash -\r\n           sudo yum install -y nodejs\r\n           cd \/home\/ec2-user\r\n           wget https:\/\/aws-codedeploy-us-east-2.s3.amazonaws.com\/latest\/install\r\n           chmod +x .\/install\r\n           sudo .\/install auto      \r\n\r\n<\/pre>\n<ul>\n<li>Go to the CloudFormation console and upload this file to create the stack.<\/li>\n<\/ul>\n<h3>Step2: Push code to CodeCommit repository<\/h3>\n<ul>\n<li>Go to your project folder.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" class=\"alignnone wp-image-3268\" src=\"https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-data-analytics-services-300x123.png\" alt=\" Cloudformation\" width=\"749\" height=\"307\" srcset=\"https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-data-analytics-services-300x123.png 300w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-data-analytics-services-768x315.png 768w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-data-analytics-services.png 943w\" sizes=\"(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/p>\n<ul>\n<li>Create a &#8220;<strong>buildspec.yaml<\/strong>&#8221; file and paste the following code there.<\/li>\n<\/ul>\n<p><code><\/code><\/p>\n<pre># Do not change version. This is the version of aws buildspec, not the version of your buldspec file.\r\nversion: 0.2\r\nphases:\r\n  pre_build:\r\n    commands:\r\n      #installs dependencies into the node_modules\/ directory\r\n      - npm install\r\n  build:\r\n    commands:\r\n      - echo Build started on `date`\r\n      - echo Compiling\r\n      - npm run build\r\n  post_build:\r\n    commands:\r\n      - echo Build completed on `date`\r\n# Include only the files required for your application to run.\r\nartifacts:\r\n  files:\r\n     - build\/**\/*\r\n     - appspec.yml\r\n     - scripts\/before_install.sh\r\n     - scripts\/start_server.sh\r\n\r\n<\/pre>\n<ul>\n<li>Next, create a file with name &#8220;<strong>appspec.yml<\/strong>&#8221; and paste the following code there.<\/li>\n<\/ul>\n<pre><code>\r\nversion: 0.0\r\nos: linux\r\nfiles:\r\n  - source: build\/\r\n    destination: \/usr\/share\/nginx\/html\/\r\nhooks:\r\n  BeforeInstall:\r\n    - location: scripts\/before_install.sh\r\n      timeout: 300\r\n      runas: root\r\n\r\n  ApplicationStart:\r\n    - location: scripts\/start_server.sh\r\n      timeout: 300\r\n      runas: root\r\n\r\n<\/code><\/pre>\n<ul>\n<li>Next, create a scripts folder in which we will create script files.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" class=\"alignnone wp-image-3269\" src=\"https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-data-Analytic-service-300x80.png\" alt=\"\" width=\"769\" height=\"205\" srcset=\"https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-data-Analytic-service-300x80.png 300w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-data-Analytic-service.png 729w\" sizes=\"(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/p>\n<ul>\n<li>Create a script file &#8216;<strong>before_install.sh&#8217;<\/strong> file and paste the following there.<\/li>\n<\/ul>\n<pre>#!\/bin\/bash\r\nrm -rf \/usr\/share\/nginx\/html\/*\r\n<\/pre>\n<ul>\n<li>Now create &#8216;<strong>start_server.sh<\/strong>&#8216; file and paste following there.<\/li>\n<\/ul>\n<pre>#!\/bin\/bash\r\nsystemctl restart nginx\r\n<\/pre>\n<ul>\n<li>Commit the project to the CodeCommit repository.<\/li>\n<\/ul>\n<h3>Step3: Create the CodePipeline using Cloudformation template<\/h3>\n<ul>\n<li>Use the following CloudFormation template the create the CodePipeline.<\/li>\n<\/ul>\n<pre><code>AWSTemplateFormatVersion: 2010-09-09\r\nDescription: Create a CodePipeline to deploy a rest application.\r\n\r\nParameters:\r\n  ReactRepository:\r\n    Type: String\r\n    Description: React Application Repository.\r\n    Default: cf-node\r\n  ArtifactS3Bucket:\r\n    Type: String\r\n    Description: S3 bucket to store artifacts.\r\n    Default: reactapp-cicd\r\n\r\n\r\nResources:\r\n\r\n  CodeBuildRole:\r\n    Type: \"AWS::IAM::Role\"\r\n    Properties:\r\n      RoleName:\r\n        Fn::Sub: CodeBuildRole-${AWS::StackName}\r\n      AssumeRolePolicyDocument:\r\n        Version: \"2012-10-17\"\r\n        Statement:\r\n          - Effect: \"Allow\"\r\n            Principal:\r\n              Service:\r\n                - \"codebuild.amazonaws.com\"\r\n            Action:\r\n              - \"sts:AssumeRole\"\r\n      Path: \/service-role\/\r\n      Policies:\r\n        - PolicyName: \"CodeBuildCICDAccessPolicy\"\r\n          PolicyDocument:\r\n            Version: \"2012-10-17\"\r\n            Statement:\r\n              - Effect: \"Allow\"\r\n                Action:\r\n                  - \"codecommit:GitPull\"\r\n                Resource:\r\n                  - Fn::Sub: arn:aws:codecommit:${AWS::Region}:${AWS::AccountId}:${ReactRepository}\r\n              - Effect: \"Allow\"\r\n                Action:\r\n                  - \"logs:CreateLogGroup\"\r\n                  - \"logs:CreateLogStream\"\r\n                  - \"logs:PutLogEvents\"\r\n                Resource:\r\n                  - Fn::Sub: arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:\/aws\/codebuild\/*\r\n              - Effect: \"Allow\"\r\n                Action:\r\n                  - \"s3:PutObject\"\r\n                  - \"s3:GetObject\"\r\n                  - \"s3:GetObjectVersion\"\r\n                  - \"s3:ListBucket\"\r\n                Resource:\r\n                  - Fn::Sub: arn:aws:s3:::codepipeline-${AWS::Region}-*\r\n                  - Fn::Sub: arn:aws:s3:::${ArtifactS3Bucket}\/*\r\n                  - Fn::Sub: arn:aws:s3:::${ArtifactS3Bucket}\r\n\r\n  BuildReactAppCFNProject:\r\n    Type: AWS::CodeBuild::Project\r\n    Properties:\r\n      Name: !Sub BuildReactAppCFN-${AWS::StackName}\r\n      ServiceRole: !GetAtt [ CodeBuildRole, Arn ]\r\n      Artifacts:\r\n        Type: S3\r\n        Location: !Ref ArtifactS3Bucket\r\n        Name: !Sub BuildReactAppCFN-${AWS::StackName}\r\n      Environment:\r\n        Type: LINUX_CONTAINER\r\n        ComputeType: BUILD_GENERAL1_SMALL\r\n        Image: aws\/codebuild\/standard:2.0\r\n      Source:\r\n        Location: !Sub https:\/\/git-codecommit.us-east-2.amazonaws.com\/v1\/repos\/${ReactRepository}\r\n        Type: CODECOMMIT\r\n      TimeoutInMinutes: 15\r\n      Tags:\r\n        - Key: Name\r\n          Value: !Sub BuildReactAppCFN-${AWS::StackName}\r\n\r\n\r\n  CodeDeployServiceRole:\r\n    Type: 'AWS::IAM::Role'\r\n    Properties:\r\n      RoleName:\r\n        Fn::Sub: CodeDeployServiceRole-${AWS::StackName}\r\n      AssumeRolePolicyDocument:\r\n        Version: 2012-10-17\r\n        Statement:\r\n          - Effect: Allow\r\n            Principal:\r\n              Service:\r\n                - codedeploy.amazonaws.com\r\n            Action: 'sts:AssumeRole'\r\n      Path: \/\r\n      Policies:\r\n        - PolicyName: \"CodeDeployCICDAccessPolicy\"\r\n          PolicyDocument:\r\n            Version: 2012-10-17\r\n            Statement:\r\n              - Effect: Allow\r\n                Action:\r\n                  - 'ec2:DescribeInstances'\r\n                  - 'ec2:DescribeInstanceStatus'\r\n                  - 'ec2:TerminateInstances'\r\n                  - 'tag:GetTags'\r\n                  - 'tag:GetResources'\r\n                 \r\n                Resource: '*'\r\n\r\n  CodeDeployApplication:\r\n    Type: AWS::CodeDeploy::Application\r\n    Properties: \r\n      ApplicationName: !Sub ReactApp-${AWS::StackName}\r\n      ComputePlatform: Server\r\n\r\n  CodeDeployDeploymentGroup: \r\n    Type: AWS::CodeDeploy::DeploymentGroup\r\n    Properties: \r\n      ApplicationName: !Ref CodeDeployApplication\r\n      Ec2TagFilters: \r\n        - Key: Name\r\n          Value: chkmt\r\n          Type: \"KEY_AND_VALUE\"\r\n      ServiceRoleArn: !GetAtt [ CodeDeployServiceRole, Arn ]      \r\n      DeploymentGroupName: !Sub DeploymentGroup-${AWS::StackName}\r\n\r\n\r\n  CodePipelineRole:\r\n    Type: \"AWS::IAM::Role\"\r\n    Properties:\r\n      RoleName:\r\n        Fn::Sub: CodePipelineRole-${AWS::StackName}\r\n      AssumeRolePolicyDocument:\r\n        Version: \"2012-10-17\"\r\n        Statement:\r\n          - Effect: \"Allow\"\r\n            Principal:\r\n              Service:\r\n                - \"codepipeline.amazonaws.com\"\r\n            Action:\r\n              - \"sts:AssumeRole\"\r\n      Path: \/\r\n      Policies:\r\n        - PolicyName: \"CodePipelineCICDAccessPolicy\"\r\n          PolicyDocument:\r\n            Version: \"2012-10-17\"\r\n            Statement:\r\n              -\r\n                Effect: \"Allow\"\r\n                Action:\r\n                  - \"s3:DeleteObject\"\r\n                  - \"s3:GetObject\"\r\n                  - \"s3:GetObjectVersion\"\r\n                  - \"s3:ListBucket\"\r\n                  - \"s3:PutObject\"\r\n                  - \"s3:GetBucketPolicy\"\r\n                Resource:\r\n                  - Fn::Sub: arn:aws:s3:::${ArtifactS3Bucket}\r\n                  - Fn::Sub: arn:aws:s3:::${ArtifactS3Bucket}\/*\r\n              - Effect: \"Allow\"\r\n                Action:\r\n                  - \"sns:Publish\"\r\n                Resource: '*'\r\n              - Effect: \"Allow\"\r\n                Action:\r\n                  - \"codecommit:ListBranches\"\r\n                  - \"codecommit:ListRepositories\"\r\n                  - \"codecommit:BatchGetRepositories\"\r\n                  - \"codecommit:Get*\"\r\n                  - \"codecommit:GitPull\"\r\n                  - \"codecommit:UploadArchive\"\r\n                Resource:\r\n                  - Fn::Sub: arn:aws:codecommit:${AWS::Region}:${AWS::AccountId}:${ReactRepository}\r\n              - Effect: \"Allow\"\r\n                Action:\r\n                  - \"codebuild:StartBuild\"\r\n                  - \"codebuild:BatchGetBuilds\"\r\n                Resource:\r\n                  - Fn::Sub: arn:aws:codebuild:${AWS::Region}:${AWS::AccountId}:project\/BuildReactAppCFN-${AWS::StackName}\r\n                  - Fn::Sub: arn:aws:codebuild:${AWS::Region}:${AWS::AccountId}:build\/BuildReactAppCFN-${AWS::StackName}:*\r\n              - Effect: Allow\r\n                Action:\r\n                  - 'codedeploy:CreateDeployment'\r\n                  - 'codedeploy:GetApplicationRevision'\r\n                  - 'codedeploy:GetDeployment'\r\n                  - 'codedeploy:GetDeploymentConfig'\r\n                  - 'codedeploy:RegisterApplicationRevision'\r\n                Resource: '*'\r\n\r\n  DeployPipeline:\r\n    Type: \"AWS::CodePipeline::Pipeline\"\r\n    Properties:\r\n      Name: !Sub CICDPipe-${AWS::StackName}\r\n      RoleArn: !GetAtt [ CodePipelineRole, Arn ]\r\n      Stages:\r\n        - Name: Source\r\n          Actions:\r\n            - Name: ApplicationSource\r\n              ActionTypeId:\r\n                Category: Source\r\n                Owner: AWS\r\n                Version: 1\r\n                Provider: CodeCommit\r\n              OutputArtifacts:\r\n                - Name: ApplicationOutput\r\n              Configuration:\r\n                BranchName: master\r\n                RepositoryName:\r\n                  Ref: ReactRepository\r\n              RunOrder: 1\r\n        - Name: Build\r\n          Actions:\r\n            - Name: CodeBuild\r\n              InputArtifacts:\r\n                - Name: ApplicationOutput\r\n              ActionTypeId:\r\n                Category: Build\r\n                Owner: AWS\r\n                Version: 1\r\n                Provider: CodeBuild\r\n              OutputArtifacts:\r\n                - Name: ReactAppArtifact\r\n              Configuration:\r\n                ProjectName: !Ref BuildReactAppCFNProject\r\n              RunOrder: 1\r\n        - Name: DeployToEC2\r\n          Actions:\r\n            - Name: CodeDeploy\r\n              InputArtifacts:\r\n                - Name: ReactAppArtifact\r\n              ActionTypeId:\r\n                Category: Deploy\r\n                Owner: AWS\r\n                Version: 1\r\n                Provider: CodeDeploy\r\n              Configuration:\r\n                ApplicationName: !Ref CodeDeployApplication\r\n                DeploymentGroupName: !Ref CodeDeployDeploymentGroup\r\n              RunOrder: 1\r\n\r\n\r\n      ArtifactStore:\r\n        Type: S3\r\n        Location: !Ref ArtifactS3Bucket\r\n<\/code><\/pre>\n<ul>\n<li>Go to CodePipeline console. You will see that your application is being deployed.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" class=\"alignnone wp-image-3273\" src=\"https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-android-development-300x158.png\" alt=\" Cloudformation\" width=\"741\" height=\"390\" srcset=\"https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-android-development-300x158.png 300w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-android-development-1024x541.png 1024w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-android-development-1200x634.png 1200w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-android-development.png 1261w\" sizes=\"(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/p>\n<p><img loading=\"lazy\" class=\"alignnone wp-image-3274\" src=\"https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/hire-mobile-app-developer-300x123.png\" alt=\" Cloudformation\" width=\"746\" height=\"306\" srcset=\"https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/hire-mobile-app-developer-300x123.png 300w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/hire-mobile-app-developer-1024x419.png 1024w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/hire-mobile-app-developer-768x314.png 768w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/hire-mobile-app-developer-1200x491.png 1200w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/hire-mobile-app-developer.png 1344w\" sizes=\"(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/p>\n<p><img loading=\"lazy\" class=\"alignnone wp-image-3275\" src=\"https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-cloud-migration-services-300x105.png\" alt=\" Cloudformation\" width=\"746\" height=\"261\" srcset=\"https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-cloud-migration-services-300x105.png 300w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-cloud-migration-services-1024x358.png 1024w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-cloud-migration-services-768x269.png 768w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-cloud-migration-services-1200x420.png 1200w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/10\/Checkmate-cloud-migration-services.png 1264w\" sizes=\"(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/p>\n<ul>\n<li>Now you can access your application using the Public IP of your EC2 instance.<\/li>\n<\/ul>\n<p><strong>Author Details:<\/strong><\/p>\n<div class=\"heateor_sss_sharing_container heateor_sss_vertical_sharing heateor_sss_bottom_sharing\" data-heateor-sss-href=\"https:\/\/www.checkmateq.com\/blog\/set-up-three-tier-architecture-with-cloudformation\/\">\n<div class=\"heateor_sss_sharing_ul\">\n<p>This blog is written by Checkmate Global Technologies, <a href=\"https:\/\/www.checkmateq.com\/cloud\">Cloud Engineer<\/a>. Please contact our technical consultants if you have anything related to cloud infrastructure to be discussed.<\/p>\n<\/div>\n<div class=\"heateorSssClear\"><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Amazon CloudFormation is a service provided by AWS cloud that aids in the modeling and configuration of your AWS resources so that you may spend more time concentrating on your AWS-based applications and less time managing those resources. The AWS resources you require (such as Amazon EC2 instances or Amazon RDS DB instances) are listed &hellip; <a href=\"https:\/\/www.checkmateq.com\/blog\/aws-codepipeline\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Set up AWS CodePipeline to deploy react application using CloudFormation&#8221;<\/span><\/a><\/p>\n","protected":false},"author":3,"featured_media":3276,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[4,3,2,11,16,8,14,6],"_links":{"self":[{"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/posts\/3261"}],"collection":[{"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/comments?post=3261"}],"version-history":[{"count":22,"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/posts\/3261\/revisions"}],"predecessor-version":[{"id":4225,"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/posts\/3261\/revisions\/4225"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/media\/3276"}],"wp:attachment":[{"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/media?parent=3261"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/categories?post=3261"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/tags?post=3261"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}