AWS의 고가용성 및 내결함성

AWS 솔루션의 일상적인 과제에 대처할 때 이 두 가지 문제(당혹스러운?)흥미로운 정의는 당신의 단체 토론에 나타날 수 있으므로 이 두 주제를 깊이 있게 토론합시다.

고가용성
고가용성은 일반적으로 서비스 SLA와 일관된 상태로 유지되는 운영 성능의 가동 시간 비율로 정의할 수 있습니다.AWS는 자신의 서비스를 위해 많은 SLA를 제정했다. 이러한 SLA에서 AWS는 자신의 복구 능력과 관리 수준을 실시하여 이 수준의 높은 가용성을 유지했다.다음은 다음과 같은 SLA 예입니다.
  • S3 표준
  • 99.9%
  • EC2
  • 99.95%
  • RDS
  • 99.95%
  • 고가용성 - 예제 설계
  • 1: 두 개의 고가용성 영역이 단일 영역
  • 에 있음으로써 고가용성 보장
  • 2: 여러 EC2 실례를 통해 높은 가용성을 실현하고 최소한의 사용 가능한 노드를 확보하여 필요한 유량 부하를 처리한다.
  • 3: 로드 밸런서를 사용하여 고가용성을 보장합니다.
  • AWS CloudFormation 템플릿을 통해 이 솔루션을 구현해 보겠습니다!
    참고: 숨겨진 비용을 방지하기 위해 AWS 무료 계층의 가용성을 고려합니다.
    클라우드 형성에 대한 정보:
    CloudFormation은 AWS 인프라를 코드로 정의하는 방법입니다.필요한 모든 리소스와 종속 관계는 CloudFormation 템플릿(JSON 또는 YAML 파일)의 코드로 정의하여 스택으로 시작할 수 있습니다.기억해야 할 몇 가지 정의:
    리소스: 필요한 AWS 리소스를 정의할 수 있습니다.필수 과목.
    매개 변수: 템플릿에 대한 동적 입력을 입력합니다.당신은 자신의 특정한 수요나 용례에 따라 맞춤형 제작을 할 수 있습니다.
    맵:정적 변수를 정의하고 키:값 쌍을 따라 정의합니다.
    출력: 다른 창고에서 인용할 수 있는 출력 값을 정의합니다.
    조건: 특정 자원에서 만들 수도 있고 만들 수도 없습니다.
    추가 설명 없이 아래 클라우드 템플릿에 ELB 제공
    ---
    Parameters:
      SecurityGroupDescription:
        Description: Security Group Description
        Type: String
      KeyName:
        Description: Key Pair for EC2
        Type: 'AWS::EC2::KeyPair::KeyName'
    
    Resources:
      EC2Instance1:
        Type: AWS::EC2::Instance
        Properties:
          AvailabilityZone: us-east-1a
          ImageId: ami-0233c2d874b811deb 
          InstanceType: t2.micro
          SecurityGroups:
            - !Ref EC2SecurityGroup
          KeyName: !Ref KeyName
          UserData: 
            Fn::Base64: !Sub |
              #!/bin/bash
              yum update -y
              yum install -y httpd
              systemctl start httpd
              systemctl enable httpd
              #echo "<h1>Hello from Region us-east-1a</h1>" > /var/www/html/index.html
    
      EC2Instance2:
        Type: AWS::EC2::Instance
        Properties:
          AvailabilityZone: us-east-1b
          ImageId: ami-0233c2d874b811deb 
          InstanceType: t2.micro
          SecurityGroups:
            - !Ref EC2SecurityGroup
          KeyName: !Ref KeyName
          UserData: 
            Fn::Base64: !Sub |
              #!/bin/bash
              yum update -y
              yum install -y httpd
              systemctl start httpd
              systemctl enable httpd
              #echo "<h1>Hello from Region us-east-1b</h1>" > /var/www/html/index.html
    
      # security group
      ELBSecurityGroup:
        Type: AWS::EC2::SecurityGroup
        Properties:
          GroupDescription: ELB Security Group
          SecurityGroupIngress:
          - IpProtocol: tcp
            FromPort: 80
            ToPort: 80
            CidrIp: 0.0.0.0/0
    
      EC2SecurityGroup:
        Type: AWS::EC2::SecurityGroup
        Properties:
          GroupDescription: !Ref SecurityGroupDescription
          SecurityGroupIngress:
          - IpProtocol: tcp
            FromPort: 80
            ToPort: 80
            SourceSecurityGroupId: 
              Fn::GetAtt:
              - ELBSecurityGroup
              - GroupId
          - IpProtocol: tcp
            FromPort: 22
            ToPort: 22
            CidrIp: 0.0.0.0/0
    
      # Load Balancer for EC2
      LoadBalancerforEC2:
        Type: AWS::ElasticLoadBalancing::LoadBalancer
        Properties:
          AvailabilityZones: [us-east-1a, us-east-1b]
          Instances:
          - !Ref EC2Instance1
          - !Ref EC2Instance2
          Listeners:
          - LoadBalancerPort: '80'
            InstancePort: '80'
            Protocol: HTTP
          HealthCheck:
            Target: HTTP:80/
            HealthyThreshold: '3'
            UnhealthyThreshold: '5'
            Interval: '30'
            Timeout: '5'
          SecurityGroups:
            - !GetAtt ELBSecurityGroup.GroupId
    

    내결함성
    내결함성의 유일한 목표는 고가용성을 확장하여 최고 수준의 보호를 제공하여 다운타임이 없는 해결 방안을 실현하는 것이다.이러한 접근 방식은 분명 추가 비용 영향을 미칩니다. 정상 가동 시간의 백분율이 더 높고, 한 개 이상의 구성 요소가 서로 다른 단계에서 고장이 나면 중단되지 않는다는 장점이 있습니다.

    여기서 다음과 같은 내용을 볼 수 있습니다.
    1: AWS Route53 DNS 서비스를 사용하여 지역 이중화를 구현합니다.
    2: Availability Redundancy 수준은 ELB를 통해 HA 메소드와 동일하게 구현할 수 있습니다.
    3: EC2 계산 노드는 여러 EC2 인스턴스 또는 ASG(Automated Exchange Group)로 구성됩니다.

    웨이트서비스는요?
    물론 상술한 정의는 장기적으로 존재하는 웹 응용 프로그램에 적용되지만 마이크로 서비스 체계 구조는?여기에 HA 또는 FT 레이어를 추가할 수 있는 것은 무엇입니까?
    예를 들어 AWS EKS 솔루션은 여러 가용성 영역에서 Kubernetes 제어 평면을 실행하고 축소하여 HA를 보장합니다.불건전한 제어 평면 인스턴스 감지 및 교체는 AWS가 제공하는 주요 기능 중 하나로, 작업 중에 제어 평면의 HA를 유지하는 데 사용됩니다.이 탄성층을 제외하고 우리는 이전에 토론한 기존의 탄성층을 사용할 수 있다.

    앞서 설명한 바와 같이 EKS 클러스터의 IAM 역할, 네트워크 아키텍처, 이중화 제어 평면 등 EKS 제어 평면을 배포할 수 있는 예제 CloudFormation 템플릿을 살펴보겠습니다.
    AWSTemplateFormatVersion: '2010-09-09'
    Parameters:
      EKSIAMRoleName:
        Type: String
        Description: The name of the IAM role for the EKS service to assume.
      EKSClusterName:
        Type: String
        Description: The desired name of your AWS EKS Cluster.
    
      VpcBlock:
        Type: String
        Default: 192.168.0.0/16
        Description: The CIDR range for the VPC. This should be a valid private (RFC 1918) CIDR range.
      PublicSubnet01Block:
        Type: String
        Default: 192.168.0.0/18
        Description: CidrBlock for public subnet 01 within the VPC
      PublicSubnet02Block:
        Type: String
        Default: 192.168.64.0/18
        Description: CidrBlock for public subnet 02 within the VPC
      PrivateSubnet01Block:
        Type: String
        Default: 192.168.128.0/18
        Description: CidrBlock for private subnet 01 within the VPC
      PrivateSubnet02Block:
        Type: String
        Default: 192.168.192.0/18
        Description: CidrBlock for private subnet 02 within the VPC
    Metadata:
      AWS::CloudFormation::Interface:
      ParameterGroups:
        -
          Label:
            default: "Worker Network Configuration"
          Parameters:
            - VpcBlock
            - PublicSubnet01Block
            - PublicSubnet02Block
            - PrivateSubnet01Block
            - PrivateSubnet02Block
    Resources:
      EKSIAMRole:
        Type: 'AWS::IAM::Role'
        Properties:
          AssumeRolePolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
              Principal:
                Service:
                  - eks.amazonaws.com
              Action:
                - 'sts:AssumeRole'
          RoleName: !Ref EKSIAMRoleName
          ManagedPolicyArns:
            - arn:aws:iam::aws:policy/AmazonEKSClusterPolicy
            - arn:aws:iam::aws:policy/AmazonEKSServicePolicy
      VPC:
        Type: AWS::EC2::VPC
        Properties:
          CidrBlock:  !Ref VpcBlock
          EnableDnsSupport: true
          EnableDnsHostnames: true
        Tags:
        - Key: Name
          Value: !Sub '${AWS::StackName}-VPC'
      InternetGateway:
        Type: "AWS::EC2::InternetGateway"
        VPCGatewayAttachment:
        Type: "AWS::EC2::VPCGatewayAttachment"
        Properties:
          InternetGatewayId: !Ref InternetGateway
          VpcId: !Ref VPC
      PublicRouteTable:
        Type: AWS::EC2::RouteTable
        Properties:
          VpcId: !Ref VPC
        Tags:
        - Key: Name
          Value: Public Subnets
        - Key: Network
          Value: Public
    
      PrivateRouteTable01:
        Type: AWS::EC2::RouteTable
        Properties:
          VpcId: !Ref VPC
        Tags:
        - Key: Name
          Value: Private Subnet AZ1
        - Key: Network
          Value: Private01
    
      PrivateRouteTable02:
        Type: AWS::EC2::RouteTable
        Properties:
          VpcId: !Ref VPC
        Tags:
        - Key: Name
          Value: Private Subnet AZ2
        - Key: Network
          Value: Private02
      PublicRoute:
        DependsOn: VPCGatewayAttachment
        Type: AWS::EC2::Route
          Properties:
          RouteTableId: !Ref PublicRouteTable
          DestinationCidrBlock: 0.0.0.0/0
          GatewayId: !Ref InternetGateway
      PrivateRoute01:
        DependsOn:
        - VPCGatewayAttachment
        - NatGateway01
        Type: AWS::EC2::Route
        Properties:
          RouteTableId: !Ref PrivateRouteTable01
          DestinationCidrBlock: 0.0.0.0/0
          NatGatewayId: !Ref NatGateway01
      PrivateRoute02:
        DependsOn:
        - VPCGatewayAttachment
        - NatGateway02
        Type: AWS::EC2::Route
        Properties:
          RouteTableId: !Ref PrivateRouteTable02
          DestinationCidrBlock: 0.0.0.0/0
          NatGatewayId: !Ref NatGateway02
      NatGateway01:
        DependsOn:
        - NatGatewayEIP1
        - PublicSubnet01
        - VPCGatewayAttachment
        Type: AWS::EC2::NatGateway
        Properties:
          AllocationId: !GetAtt 'NatGatewayEIP1.AllocationId'
          SubnetId: !Ref PublicSubnet01
        Tags:
        - Key: Name
          Value: !Sub '${AWS::StackName}-NatGatewayAZ1'
      NatGateway02:
        DependsOn:
        - NatGatewayEIP2
        - PublicSubnet02
        - VPCGatewayAttachment
        Type: AWS::EC2::NatGateway
        Properties:
        AllocationId: !GetAtt 'NatGatewayEIP2.AllocationId'
        SubnetId: !Ref PublicSubnet02
        Tags:
        - Key: Name
          Value: !Sub '${AWS::StackName}-NatGatewayAZ2'
      NatGatewayEIP1:
        DependsOn:
        - VPCGatewayAttachment
        Type: 'AWS::EC2::EIP'
        Properties:
          Domain: vpc
      NatGatewayEIP2:
        DependsOn:
        - VPCGatewayAttachment
        Type: 'AWS::EC2::EIP'
        Properties:
          Domain: vpc
      PublicSubnet01:
        Type: AWS::EC2::Subnet
        Metadata:
          Comment: Subnet 01
        Properties:
          AvailabilityZone:
            Fn::Select:
            - '0'
            - Fn::GetAZs:
              Ref: AWS::Region
            CidrBlock:
              Ref: PublicSubnet01Block
            VpcId:
              Ref: VPC
        Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-PublicSubnet01"
      PublicSubnet02:
        Type: AWS::EC2::Subnet
        Metadata:
          Comment: Subnet 02
        Properties:
          AvailabilityZone:
            Fn::Select:
            - '1'
            - Fn::GetAZs:
              Ref: AWS::Region
            CidrBlock:
              Ref: PublicSubnet02Block
            VpcId:
              Ref: VPC
        Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-PublicSubnet02"
      PrivateSubnet01:
        Type: AWS::EC2::Subnet
        Metadata:
          Comment: Subnet 03
        Properties:
          AvailabilityZone:
            Fn::Select:
            - '0'
            - Fn::GetAZs:
              Ref: AWS::Region
            CidrBlock:
              Ref: PrivateSubnet01Block
            VpcId:
              Ref: VPC
        Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-PrivateSubnet01"
        - Key: "kubernetes.io/role/internal-elb"
          Value: 1
      PrivateSubnet02:
        Type: AWS::EC2::Subnet
        Metadata:
          Comment: Private Subnet 02
        Properties:
          AvailabilityZone:
            Fn::Select:
            - '1'
            - Fn::GetAZs:
              Ref: AWS::Region
            CidrBlock:
              Ref: PrivateSubnet02Block
            VpcId:
              Ref: VPC
        Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-PrivateSubnet02"
        - Key: "kubernetes.io/role/internal-elb"
          Value: 1
      PublicSubnet01RouteTableAssociation:
        Type: AWS::EC2::SubnetRouteTableAssociation
        Properties:
          SubnetId: !Ref PublicSubnet01
          RouteTableId: !Ref PublicRouteTable
      PublicSubnet02RouteTableAssociation:
        Type: AWS::EC2::SubnetRouteTableAssociation
        Properties:
          SubnetId: !Ref PublicSubnet02
          RouteTableId: !Ref PublicRouteTable
      PrivateSubnet01RouteTableAssociation:
        Type: AWS::EC2::SubnetRouteTableAssociation
        Properties:
          SubnetId: !Ref PrivateSubnet01
          RouteTableId: !Ref PrivateRouteTable01
      PrivateSubnet02RouteTableAssociation:
        Type: AWS::EC2::SubnetRouteTableAssociation
        Properties:
          SubnetId: !Ref PrivateSubnet02
          RouteTableId: !Ref PrivateRouteTable02
      ControlPlaneSecurityGroup:
        Type: AWS::EC2::SecurityGroup
        Properties:
          GroupDescription: Cluster communication with worker nodes
          VpcId: !Ref VPC
      EKSCluster:
        Type: AWS::EKS::Cluster
        Properties:
          Name: !Ref EKSClusterName
          RoleArn:
            "Fn::GetAtt": ["EKSIAMRole", "Arn"]
            ResourcesVpcConfig:
              SecurityGroupIds:
              - !Ref ControlPlaneSecurityGroup
              SubnetIds:
              - !Ref PublicSubnet01
              - !Ref PublicSubnet02
              - !Ref PrivateSubnet01
              - !Ref PrivateSubnet02
        DependsOn: [EKSIAMRole, PublicSubnet01, PublicSubnet02, PrivateSubnet01, PrivateSubnet02, ControlPlaneSecurityGroup]
    Outputs:
      SubnetIds:
        Description: Subnets IDs in the VPC
        Value: !Join [ ",", [ !Ref PublicSubnet01, !Ref PublicSubnet02, !Ref PrivateSubnet01, !Ref PrivateSubnet02 ] ]
      SecurityGroups:
        Description: Security group for the cluster control plane communication with worker nodes
        Value: !Join [ ",", [ !Ref ControlPlaneSecurityGroup ] ]
      VpcId:
        Description: The VPC Id
        Value: !Ref VPC
    

    마지막 생각
    우리는 용량 오류 시스템이 본질적으로 제로 정지 시간을 가진 고가용성 해결 방안이라는 결론을 얻을 수 있다. 그러나 본고에서 보듯이 고가용성 해결 방안은 완전히 용량 오류가 있는 것이 아니다.마이크로 서비스는 우리에게 추가적인 탄력을 주었는데, 이것도 일정한 위험과 복잡성과 관련이 있다.솔루션 설계자로서 우리는 업무 수요나 예산 제약에 따라 우리가 실현하고자 하는 체계 구조를 정의해야 한다.
    참조 자료:
  • https://www.cloudiqtech.com/aws-sla-summary/
  • https://dev.classmethod.jp/articles/cloudformation-template-for-creating-ec2-with-load-balancer/
  • https://medium.com/@dhammond0083/aws-eks-managed-setup-with-cloudformation-97461300e952
  • 좋은 웹페이지 즐겨찾기