{"id":3145,"date":"2022-09-27T12:53:49","date_gmt":"2022-09-27T12:53:49","guid":{"rendered":"https:\/\/www.checkmateq.com\/blog\/?p=3145"},"modified":"2023-08-04T14:10:22","modified_gmt":"2023-08-04T14:10:22","slug":"three-tier-architecture","status":"publish","type":"post","link":"https:\/\/www.checkmateq.com\/blog\/three-tier-architecture","title":{"rendered":"Set up three-tier architecture with CloudFormation"},"content":{"rendered":"<p><strong>CloudFormation<\/strong> is most important aspect infrastructure as a code provided by AWS that aids in the infrastructure deployment, rollback, infrastructure automation and configuration management 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> of those resources on your behalf. <strong>CloudFormation takes care of the creation, configuration, and identification of the dependencies between AWS resources<\/strong>, so you don&#8217;t have to.<\/p>\n<p>In this blog, we will write a AWS CloudFormation template to create a three-tier architecture in AWS.<\/p>\n<p>The <strong>three-tier architecture<\/strong>, which includes the web tier, <a href=\"https:\/\/www.checkmateq.com\/application\">application<\/a> tier, and database tier, is the most often used in implementation of a multi-tier architecture in <a href=\"https:\/\/www.checkmateq.com\/aws-cloud\">AWS Services<\/a>.<\/p>\n<p>The web layer is with which end-users interact. The application layer contains the code or logic. It interacts with the web and data layer to respond to client requests. The database layer manages the data. The three-tier architecture helps in creating a secure, scalable, and highly available infrastructure.<\/p>\n<pre><code>\r\n\r\nParameters:\r\n  EnvironmentName:\r\n    Type: String\r\n    Description: Enter Environment Name\r\n\r\n  myVPCcidrblock:\r\n    Type: String\r\n    Default: 10.192.0.0\/16  \r\n\r\n  myPublicSubnet1cidr:\r\n    Type: String\r\n    Default: 10.192.1.0\/24 \r\n\r\n  myPublicSubnet2cidr:\r\n    Type: String\r\n    Default: 10.192.2.0\/24 \r\n\r\n  myPrivateSubnet1cidr:\r\n    Type: String\r\n    Default: 10.192.3.0\/24 \r\n\r\n  myPrivateSubnet2cidr:\r\n    Type: String\r\n    Default: 10.192.4.0\/24       \r\n\r\n  myDBSubnet1cidr:\r\n    Type: String\r\n    Default: 10.192.5.0\/24  \r\n\r\n  myDBSubnet2cidr:\r\n    Type: String\r\n    Default: 10.192.6.0\/24  \r\n\r\n  myAMIID:\r\n    Type: String\r\n    Default: ami-0f924dc71d44d23e2\r\n\r\n  InstanceType:\r\n    Type: String\r\n    Default: t2.micro    \r\n\r\n  KeyName:\r\n    Type: String\r\n    Default: dell-ohio-keypair    \r\n\r\nResources:\r\n  myVPC:\r\n    Type: AWS::EC2::VPC\r\n    Properties:\r\n     CidrBlock: !Ref myVPCcidrblock\r\n     EnableDnsSupport: true\r\n     EnableDnsHostnames: true\r\n     Tags:\r\n      - Key: Name\r\n        Value: !Ref EnvironmentName\r\n\r\n  InternetGateway:\r\n    Type: AWS::EC2::InternetGateway\r\n    Properties:\r\n      Tags:\r\n        - Key: Name\r\n          Value: !Ref EnvironmentName\r\n\r\n  InternetGatewayAttachment:\r\n    Type: AWS::EC2::VPCGatewayAttachment\r\n    Properties:\r\n      InternetGatewayId: !Ref InternetGateway\r\n      VpcId: !Ref myVPC\r\n\r\n      \r\n\r\n  \r\n  myPublicWebSubnet1:\r\n    Type: AWS::EC2::Subnet\r\n    Properties:\r\n      VpcId: !Ref myVPC\r\n      CidrBlock: !Ref myPublicSubnet1cidr\r\n      MapPublicIpOnLaunch: true\r\n      AvailabilityZone:  !Select [ 0, !GetAZs '' ]\r\n      Tags:\r\n       - Key: Name\r\n         Value:  !Sub ${EnvironmentName} Public Subnet (AZ1)\r\n\r\n  myPublicWebSubnet2:\r\n    Type: AWS::EC2::Subnet\r\n    Properties:\r\n      VpcId: !Ref myVPC\r\n      CidrBlock: !Ref myPublicSubnet2cidr\r\n      MapPublicIpOnLaunch: true\r\n      AvailabilityZone:  !Select [ 1, !GetAZs '' ]\r\n      Tags:\r\n       - Key: Name\r\n         Value:  !Sub ${EnvironmentName} Public Subnet (AZ2)\r\n\r\n  myPrivateAppSubnet1:\r\n    Type: AWS::EC2::Subnet\r\n    Properties:\r\n      VpcId: !Ref myVPC\r\n      CidrBlock: !Ref myPrivateSubnet1cidr\r\n      AvailabilityZone:  !Select [ 0, !GetAZs '' ]\r\n      Tags:\r\n       - Key: Name\r\n         Value:  !Sub ${EnvironmentName} Private Subnet (AZ1)\r\n\r\n  myPrivateAppSubnet2:\r\n    Type: AWS::EC2::Subnet\r\n    Properties:\r\n      VpcId: !Ref myVPC\r\n      CidrBlock: !Ref myPrivateSubnet2cidr\r\n      AvailabilityZone:  !Select [ 1, !GetAZs '' ]\r\n      Tags:\r\n       - Key: Name\r\n         Value:  !Sub ${EnvironmentName} Private Subnet (AZ2)\r\n\r\n  myPrivateDBSubnet1:\r\n    Type: AWS::EC2::Subnet\r\n    Properties:\r\n      VpcId: !Ref myVPC\r\n      CidrBlock: !Ref myDBSubnet1cidr\r\n      AvailabilityZone:  !Select [ 0, !GetAZs '' ]\r\n      Tags:\r\n       - Key: Name\r\n         Value:  !Sub ${EnvironmentName} DB Subnet (AZ1)\r\n\r\n  myPrivateDBSubnet2:\r\n    Type: AWS::EC2::Subnet\r\n    Properties:\r\n      VpcId: !Ref myVPC\r\n      CidrBlock: !Ref myDBSubnet2cidr\r\n      AvailabilityZone:  !Select [ 1, !GetAZs '' ]\r\n      Tags:\r\n       - Key: Name\r\n         Value:  !Sub ${EnvironmentName} DB Subnet (AZ2)\r\n       \r\n       \r\n\r\n  myPublicRouteTable:\r\n    Type: AWS::EC2::RouteTable\r\n    Properties:\r\n      VpcId: !Ref myVPC\r\n      Tags:\r\n       - Key: Name\r\n         Value: !Sub ${EnvironmentName} Public Route Table       \r\n\r\n  myPrivateRouteTable:\r\n    Type: AWS::EC2::RouteTable\r\n    Properties:\r\n      VpcId: !Ref myVPC\r\n      Tags:\r\n       - Key: Name\r\n         Value: !Sub ${EnvironmentName} Private Route Table       \r\n\r\n  myRoute:\r\n    Type: AWS::EC2::Route\r\n    DependsOn: InternetGatewayAttachment\r\n    Properties:\r\n      RouteTableId: !Ref myPublicRouteTable\r\n      DestinationCidrBlock: 0.0.0.0\/0\r\n      GatewayId: !Ref InternetGateway\r\n\r\n  myPublicWebSubnet1RouteTableAssociation:\r\n    Type: AWS::EC2::SubnetRouteTableAssociation\r\n    Properties:\r\n      SubnetId:\r\n        Ref: myPublicWebSubnet1\r\n      RouteTableId:\r\n        Ref: myPublicRouteTable         \r\n\r\n  myPublicWebSubnet2RouteTableAssociation:\r\n    Type: AWS::EC2::SubnetRouteTableAssociation\r\n    Properties:\r\n      SubnetId:\r\n        Ref: myPublicWebSubnet2\r\n      RouteTableId:\r\n        Ref: myPublicRouteTable           \r\n\r\n  myPrivateAppSubnet1RouteTableAssociation:\r\n    Type: AWS::EC2::SubnetRouteTableAssociation\r\n    Properties:\r\n      SubnetId:\r\n        Ref: myPrivateAppSubnet1\r\n      RouteTableId:\r\n        Ref: myPrivateRouteTable           \r\n\r\n  myPrivateAppSubnet2RouteTableAssociation:\r\n    Type: AWS::EC2::SubnetRouteTableAssociation\r\n    Properties:\r\n      SubnetId:\r\n        Ref: myPrivateAppSubnet2\r\n      RouteTableId:\r\n        Ref: myPrivateRouteTable \r\n\r\n  myPrivateDBSubnet1RouteTableAssociation:\r\n    Type: AWS::EC2::SubnetRouteTableAssociation\r\n    Properties:\r\n      SubnetId:\r\n        Ref: myPrivateDBSubnet1\r\n      RouteTableId:\r\n        Ref: myPrivateRouteTable            \r\n\r\n  myPrivateDBSubnet2RouteTableAssociation:\r\n    Type: AWS::EC2::SubnetRouteTableAssociation\r\n    Properties:\r\n      SubnetId:\r\n        Ref: myPrivateDBSubnet2\r\n      RouteTableId:\r\n        Ref: myPrivateRouteTable            \r\n\r\n  NATGateway:\r\n    Type: AWS::EC2::NatGateway\r\n    Properties:\r\n      AllocationId: !GetAtt NATGatewayEIP.AllocationId\r\n      SubnetId: !Ref myPublicWebSubnet1\r\n      Tags:\r\n      - Key: Name\r\n        Value: !Ref EnvironmentName\r\n  NATGatewayEIP:\r\n    Type: AWS::EC2::EIP\r\n    Properties:\r\n      Domain: vpc\r\n  RouteNATGateway:\r\n    DependsOn: NATGateway\r\n    Type: AWS::EC2::Route\r\n    Properties:\r\n      RouteTableId: !Ref myPrivateRouteTable\r\n      DestinationCidrBlock: '0.0.0.0\/0'\r\n      NatGatewayId: !Ref NATGateway           \r\n\r\n\r\n  BastionHostSG:\r\n    Type: AWS::EC2::SecurityGroup\r\n    DependsOn: myVPC\r\n    Properties:\r\n      GroupDescription: Bastion sg to talk to web and app tier\r\n      VpcId: !Ref myVPC\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      SecurityGroupEgress:\r\n        - IpProtocol: tcp\r\n          FromPort: 0\r\n          ToPort: 65535\r\n          CidrIp: 0.0.0.0\/0    \r\n\r\n  ApplicationLoadBalancerSG:\r\n    Type: AWS::EC2::SecurityGroup\r\n    DependsOn: myVPC\r\n    Properties:\r\n      GroupDescription: http traffic to web tier\r\n      VpcId: !Ref myVPC\r\n      SecurityGroupIngress:\r\n        - IpProtocol: tcp\r\n          FromPort: 80\r\n          ToPort: 80\r\n          CidrIp: 0.0.0.0\/0\r\n      SecurityGroupEgress:\r\n        - IpProtocol: tcp\r\n          FromPort: 0\r\n          ToPort: 65535\r\n          CidrIp: 0.0.0.0\/0\r\n\r\n  InternalLoadBalancerSG:\r\n    Type: AWS::EC2::SecurityGroup\r\n    DependsOn: myVPC\r\n    Properties:\r\n      GroupDescription: Web tier traffic to app tier\r\n      VpcId: !Ref myVPC\r\n      SecurityGroupIngress:\r\n        - IpProtocol: tcp\r\n          FromPort: 80\r\n          ToPort: 80\r\n          SourceSecurityGroupId: !Ref WebtierSG\r\n        - IpProtocol: tcp\r\n          FromPort: 22\r\n          ToPort: 22        \r\n          SourceSecurityGroupId: !Ref WebtierSG\r\n      SecurityGroupEgress:\r\n        - IpProtocol: tcp\r\n          FromPort: 0\r\n          ToPort: 65535\r\n          CidrIp: 0.0.0.0\/0     \r\n\r\n  WebtierSG:\r\n    Type: AWS::EC2::SecurityGroup\r\n    DependsOn: myVPC\r\n    Properties:\r\n      GroupDescription: ApplicationLoadBalancer to web tier\r\n      VpcId: !Ref myVPC\r\n      SecurityGroupIngress:\r\n        - IpProtocol: tcp\r\n          FromPort: 80\r\n          ToPort: 80\r\n          SourceSecurityGroupId: !Ref ApplicationLoadBalancerSG\r\n        - IpProtocol: tcp\r\n          FromPort: 22\r\n          ToPort: 22\r\n          SourceSecurityGroupId: !Ref BastionHostSG \r\n      SecurityGroupEgress:\r\n        - IpProtocol: tcp\r\n          FromPort: 0\r\n          ToPort: 65535\r\n          CidrIp: 0.0.0.0\/0   \r\n\r\n  AppTierSG:\r\n    Type: AWS::EC2::SecurityGroup\r\n    DependsOn: myVPC\r\n    Properties:\r\n      GroupDescription: Internal Load Balancer to AppTier\r\n      VpcId: !Ref myVPC\r\n      SecurityGroupIngress:\r\n        - IpProtocol: tcp\r\n          FromPort: 80\r\n          ToPort: 80\r\n          SourceSecurityGroupId: !Ref InternalLoadBalancerSG\r\n        - IpProtocol: tcp\r\n          FromPort: 22\r\n          ToPort: 22\r\n          SourceSecurityGroupId: !Ref BastionHostSG \r\n      SecurityGroupEgress:\r\n        - IpProtocol: tcp\r\n          FromPort: 0\r\n          ToPort: 65535\r\n          CidrIp: 0.0.0.0\/0 \r\n\r\n  DatabaseSG:\r\n    Type: AWS::EC2::SecurityGroup\r\n    DependsOn: myVPC\r\n    Properties:\r\n      GroupDescription: Apptier to database tier\r\n      VpcId: !Ref myVPC\r\n      SecurityGroupIngress:\r\n        - IpProtocol: tcp\r\n          FromPort: 3306\r\n          ToPort: 3306\r\n          SourceSecurityGroupId: !Ref AppTierSG\r\n      SecurityGroupEgress:\r\n        - IpProtocol: tcp\r\n          FromPort: 0\r\n          ToPort: 65535\r\n          CidrIp: 0.0.0.0\/0        \r\n\r\n  BastionHostEC2: \r\n    Type: AWS::EC2::Instance\r\n    Properties: \r\n      ImageId: !Ref myAMIID\r\n      SecurityGroupIds: \r\n        - !GetAtt BastionHostSG.GroupId \r\n      InstanceType: !Ref InstanceType\r\n      SubnetId: !Ref myPublicWebSubnet1\r\n      KeyName: !Ref KeyName   \r\n    \r\n\r\n  \r\n  myLaunchConfig:\r\n    Type: AWS::AutoScaling::LaunchConfiguration\r\n    Properties:\r\n      ImageId: !Ref myAMIID\r\n      InstanceType: !Ref InstanceType\r\n      SecurityGroups: \r\n        - !Ref WebtierSG                            \r\n      KeyName: !Ref KeyName \r\n      UserData:\r\n           Fn::Base64: |\r\n            #!\/bin\/bash\r\n            yum update -y\r\n            yum install -y httpd\r\n            systemctl start httpd\r\n            systemctl enable httpd\r\n            echo 'Checkmate Global Technologies' &gt; \/var\/www\/html\/index.html\r\n\r\n  myASG:\r\n    Type: AWS::AutoScaling::AutoScalingGroup\r\n    Properties:      \r\n      LaunchConfigurationName: !Ref myLaunchConfig\r\n      MaxSize: '1'\r\n      MinSize: '1'\r\n      DesiredCapacity: '1'\r\n      VPCZoneIdentifier:   \r\n        - !Ref myPublicWebSubnet1\r\n        - !Ref myPublicWebSubnet2\r\n      TargetGroupARNs: \r\n       - Ref: WebTierALBTargetGroup    \r\n\r\n  WebTierLoadBalancer:\r\n    Type: \"AWS::ElasticLoadBalancingV2::LoadBalancer\"\r\n    Properties:\r\n      Subnets: \r\n       - !Ref myPublicWebSubnet1\r\n       - !Ref myPublicWebSubnet2\r\n      SecurityGroups: \r\n        - !GetAtt ApplicationLoadBalancerSG.GroupId \r\n  WebTierListener:\r\n    Type: \"AWS::ElasticLoadBalancingV2::Listener\"\r\n    Properties:\r\n      DefaultActions:\r\n        - Type: forward\r\n          TargetGroupArn: !Ref WebTierALBTargetGroup\r\n      LoadBalancerArn: !Ref WebTierLoadBalancer\r\n      Port: \"80\"\r\n      Protocol: HTTP\r\n  WebTierALBTargetGroup:\r\n    Type: \"AWS::ElasticLoadBalancingV2::TargetGroup\"\r\n    Properties:\r\n      HealthCheckIntervalSeconds: 30\r\n      HealthCheckTimeoutSeconds: 5\r\n      HealthyThresholdCount: 2\r\n      Port: 80\r\n      Protocol: HTTP\r\n      UnhealthyThresholdCount: 5\r\n      VpcId: !Ref myVPC\r\n\r\n  AppTierASG:\r\n    Type: AWS::AutoScaling::AutoScalingGroup\r\n    Properties:\r\n      LaunchConfigurationName: !Ref AppTierLaunchConfig\r\n      MaxSize: '1'\r\n      MinSize: '1'\r\n      DesiredCapacity: '1'\r\n      VPCZoneIdentifier:   \r\n        - !Ref myPrivateAppSubnet1\r\n        - !Ref myPrivateAppSubnet2\r\n      TargetGroupARNs: \r\n       - Ref: AppTierTargetGroup       \r\n  AppTierLaunchConfig: \r\n    Type: AWS::AutoScaling::LaunchConfiguration\r\n    Properties:\r\n      ImageId: !Ref myAMIID\r\n      SecurityGroups: \r\n        - !Ref AppTierSG\r\n      InstanceType: \r\n        !Ref InstanceType\r\n      KeyName:  !Ref KeyName\r\n  AppTierLoadBalancer:\r\n    Type: \"AWS::ElasticLoadBalancingV2::LoadBalancer\"\r\n    Properties:\r\n      Subnets: \r\n       - !Ref myPrivateAppSubnet1\r\n       - !Ref myPrivateAppSubnet2\r\n      SecurityGroups: \r\n       - !GetAtt InternalLoadBalancerSG.GroupId  \r\n  AppTierListener:\r\n    Type: \"AWS::ElasticLoadBalancingV2::Listener\"\r\n    Properties:\r\n      DefaultActions:\r\n        - Type: forward\r\n          TargetGroupArn: !Ref AppTierTargetGroup\r\n      LoadBalancerArn: !Ref AppTierLoadBalancer\r\n      Port: \"80\"\r\n      Protocol: HTTP\r\n  AppTierTargetGroup:\r\n    Type: \"AWS::ElasticLoadBalancingV2::TargetGroup\"\r\n    Properties:\r\n      HealthCheckIntervalSeconds: 30\r\n      HealthCheckTimeoutSeconds: 5\r\n      HealthyThresholdCount: 2\r\n      Port: 80\r\n      Protocol: HTTP\r\n      UnhealthyThresholdCount: 5\r\n      VpcId: !Ref myVPC   \r\n\r\n  Database:\r\n    Type: AWS::RDS::DBInstance\r\n    Properties:\r\n      VPCSecurityGroups: \r\n       - !Ref DatabaseSG\r\n      AllocatedStorage: '20'\r\n      PubliclyAccessible: 'true'\r\n      DBInstanceClass: db.t2.micro\r\n      Engine: MySQL\r\n      MasterUsername: MyName\r\n      MasterUserPassword: MyPassword\r\n      DBSubnetGroupName: !Ref DatabaseSubnetGroup\r\n      AvailabilityZone:  !Select [ 0, !GetAZs '' ]\r\n\r\n\r\n  DatabaseSubnetGroup:\r\n    Type: AWS::RDS::DBSubnetGroup\r\n    Properties:\r\n      DBSubnetGroupDescription: subnet group\r\n      SubnetIds: \r\n       - !Ref myPrivateDBSubnet1\r\n       - !Ref myPrivateDBSubnet2 \r\n\r\n<\/code><\/pre>\n<ul>\n<li>Next login to your AWS account and navigate to the CloudFormation console.<\/li>\n<li>Click Create Stack.<\/li>\n<li>Upload your template.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" class=\"alignnone wp-image-3155\" src=\"https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/09\/Checkmate-android-development-1-300x141.png\" alt=\"CloudFormation\" width=\"749\" height=\"352\" srcset=\"https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/09\/Checkmate-android-development-1-300x141.png 300w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/09\/Checkmate-android-development-1-1024x483.png 1024w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/09\/Checkmate-android-development-1-768x362.png 768w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/09\/Checkmate-android-development-1-1200x566.png 1200w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/09\/Checkmate-android-development-1.png 1387w\" sizes=\"(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Give Stack name and Environment name. Click <strong>Next<\/strong> and<strong> Create Stack<\/strong>.<\/li>\n<li>The stack will be created in a few minutes.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" class=\"alignnone wp-image-3157\" src=\"https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/09\/Checkmate-AWS-cloud-services-1-300x90.png\" alt=\"CloudFormation\" width=\"763\" height=\"229\" srcset=\"https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/09\/Checkmate-AWS-cloud-services-1-300x90.png 300w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/09\/Checkmate-AWS-cloud-services-1-1024x308.png 1024w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/09\/Checkmate-AWS-cloud-services-1-768x231.png 768w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/09\/Checkmate-AWS-cloud-services-1-1536x462.png 1536w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/09\/Checkmate-AWS-cloud-services-1-1200x361.png 1200w, https:\/\/www.checkmateq.com\/blog\/wp-content\/uploads\/2022\/09\/Checkmate-AWS-cloud-services-1.png 1857w\" sizes=\"(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><\/p>\n<p><strong>Author Detail<\/strong><\/p>\n<p>This blog is written by Checkmate Global Technologies cloud engineering team. Please <a href=\"https:\/\/www.checkmateq.com\/contact-us\">contact<\/a> with our technical consultants if you have anything related to cloud infrastructure, <a href=\"https:\/\/www.checkmateq.com\/devops-engineering\">DevOps<\/a> operation management and SaaS based product engineering to be discussed.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>CloudFormation is most important aspect infrastructure as a code provided by AWS that aids in the infrastructure deployment, rollback, infrastructure automation and configuration management 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 &hellip; <a href=\"https:\/\/www.checkmateq.com\/blog\/three-tier-architecture\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Set up three-tier architecture with CloudFormation&#8221;<\/span><\/a><\/p>\n","protected":false},"author":3,"featured_media":3162,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[71,69,68,7,23,14,6],"_links":{"self":[{"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/posts\/3145"}],"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=3145"}],"version-history":[{"count":14,"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/posts\/3145\/revisions"}],"predecessor-version":[{"id":4230,"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/posts\/3145\/revisions\/4230"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/media\/3162"}],"wp:attachment":[{"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/media?parent=3145"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/categories?post=3145"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.checkmateq.com\/blog\/wp-json\/wp\/v2\/tags?post=3145"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}