マルチリージョンロードAmazon APIゲートウェイ


このポストでは、どのようにAmazon API Gateway HTTP API 多領域設計に適合します.
シリーズの一部としてThe Multi-Region road , 他の部分をチェックアウトできます.

  • Part 1 - 多領域建築を始める前に考慮すべきことについての反省.

  • Part 2 - Cloudfrontのフェールオーバー設定.
  • アマゾンAPIゲートウェイ


    Amazon API Gateway 私のユースケースには2つの風味があります.
  • 残り
  • HTTP
  • 主な違いは報告されますhere と言及する他の価格はcheaper と60 %faster REST APIより.
    私はHTTP APIを選びました、そして、キャッシュ支持がなくなっていると言うのは価値があります.それは、のために存在するだけですREST API .
    私はCloudfrontで応答をキャッシュすることができるので、それは問題ではないと思います、そして、私が若干のキャッシュキー操作を必要とするならば、私は常に使うことができますCloudFront functions .

    マルチ


    The requirements マルチ領域については、
  • アプリケーションは、低遅延が必要です.
  • アプリケーションは、地域の障害に立つことができる必要があります.
  • アプリケーションをスケールする必要があります.
  • 上記の規則は全てこのアーキテクチャに適用する必要があります.

    このような複雑な構成を実現するには、複数のRoute53 policies , そして、あなたはAWSから読むことができます:
    レコードを作成するときは、ルーティングポリシーを選択します.
  • 単純なルーティングポリシー-ドメインの指定された関数を実行する単一のリソース、たとえば例のコンテンツを提供するWebサーバーを使用します.comウェブサイト.
  • フェイルオーバールーティングポリシー-アクティブパッシブフェイルオーバーを設定するときに使用します.
  • ジオロケーションルーティングポリシー-あなたのユーザーの場所に基づいてトラフィックをルーティングするときに使用します.
  • Geo近接ルーティングポリシー-あなたのリソースの場所に基づいてトラフィックをルーティングしたい場合は、必要に応じて、1つの場所のリソースから別のリソースにトラフィックをシフトします.
  • 遅延ルーティングポリシー-複数のAWS領域にリソースを持っているときに使用します.
  • MultiValue Answer Routing方針-あなたがルート53がランダムで選択された最高8つの健康的な記録でDNS質問に応じることを望むとき、使用してください.
  • 重み付きルーティングポリシー-指定した割合で複数のリソースにトラフィックをルーティングするために使用します.
  • レバレッジしたい
  • フェイルオーバールーティングポリシー
  • 遅延ルーティングポリシー
  • 重み付けされたルーティングポリシー(同じ地域でのマルチアカウント設定に対してあまりにも多い)
  • フェイルオーバールーティングポリシー


    アクティブパッシブフェイルオーバーを設定する場合に使用します.
    AWSTemplateFormatVersion: 2010-09-09
    
    ##########################################################################
    #  Parameters                                                            #
    ##########################################################################
    Parameters:
      Route53HostedZoneId:
        Type: String
      Route53DomainName:
        Type: String
      ApiPrimaryHostedZoneId:
        Type: String
      ApiPrimaryDomainName:
        Type: String
      ApiPrimaryEndpoint:
        Type: String
      ApiSecondaryHostedZoneId:
        Type: String
      ApiSecondaryDomainName:
        Type: String
    
    Resources:
    ##########################################################################
    #  Health Check                                                          #
    ##########################################################################
      HealthCheck:
        Type: AWS::Route53::HealthCheck
        Properties:
          HealthCheckConfig:
            FullyQualifiedDomainName: !Ref ApiPrimaryEndpoint
            Port: 443
            RequestInterval: 10
            FailureThreshold: 3
            ResourcePath: /api
            Type: HTTPS
            Regions:
              - eu-west-1 #Ireland
              - ap-southeast-2 #Sydney
              - us-west-1 #California
          HealthCheckTags:
          - Key: Name
            Value: !Ref ApiPrimaryEndpoint
    
    ##########################################################################
    #  Route53                                                               #
    ##########################################################################
      FailOverGroup:    
        Type: AWS::Route53::RecordSetGroup
        Properties:
          HostedZoneId: !Ref Route53HostedZoneId
          RecordSets: 
            - Name:
                !Ref Route53DomainName
              Type: A
              Failover: PRIMARY
              SetIdentifier: Primary
              HealthCheckId: !Ref HealthCheck
              AliasTarget:
                HostedZoneId: !Ref ApiPrimaryHostedZoneId
                DNSName: !Ref ApiPrimaryDomainName
                EvaluateTargetHealth: True
            - Name:
                !Ref Route53DomainName
              Type: A
              Failover: SECONDARY
              SetIdentifier: Secondary
              AliasTarget:
                HostedZoneId: !Ref ApiSecondaryHostedZoneId
                DNSName: !Ref ApiSecondaryDomainName
                EvaluateTargetHealth: False
    
    
    この例では、2つの領域を使用しますが、カスケードフェイルオーバを作成したい場合は
    デ-> irl -> uk ->
    私はコードを繰り返して、テンプレートの入力としてより多くのパラメタを通過しなければなりません.

    遅延ルーティングポリシー


    複数のAWS領域にリソースを持っているときに使用し、より少ない旅行時間で最高の待ち時間を提供する領域にトラフィックをルーティングします.
    AWSTemplateFormatVersion: 2010-09-09
    
    ##########################################################################
    #  Parameters                                                            #
    ##########################################################################
    Parameters:
      Route53HostedZoneId:
        Type: String
      Route53DomainName:
        Type: String
    
      ApiGermanyHostedZoneId:
        Type: String
      ApiGermanyDomainName:
        Type: String
      ApiGermanyEndpoint:
        Type: String
    
      ApiIrelandHostedZoneId:
        Type: String
      ApiIrelandDomainName:
        Type: String
      ApiIrelandEndpoint:
        Type: String
    
    Resources:
    ##########################################################################
    #  Health Check                                                          #
    ##########################################################################
      HealthCheckGermany:
        Type: AWS::Route53::HealthCheck
        Properties:
          HealthCheckConfig:
            FullyQualifiedDomainName: !Ref ApiGermanyEndpoint
            Port: 443
            RequestInterval: 10 #sec
            FailureThreshold: 3
            ResourcePath: /api
            Type: HTTPS
            Regions:
              - eu-west-1 #Ireland
              - ap-southeast-2 #Sydney
              - us-west-1 #California
          HealthCheckTags:
          - Key: Name
            Value: !Ref ApiGermanyEndpoint
    
      HealthCheckIreland:
        Type: AWS::Route53::HealthCheck
        Properties:
          HealthCheckConfig:
            FullyQualifiedDomainName: !Ref ApiIrelandEndpoint
            Port: 443
            RequestInterval: 10 #sec
            FailureThreshold: 3
            ResourcePath: /api
            Type: HTTPS
            Regions:
              - eu-west-1 #Ireland
              - ap-southeast-2 #Sydney
              - us-west-1 #California
          HealthCheckTags:
          - Key: Name
            Value: !Ref ApiIrelandEndpoint
    
    
    ##########################################################################
    #  Route53                                                               #
    ##########################################################################
      DNSARecordGroup:    
        Type: AWS::Route53::RecordSetGroup
        Properties:
          HostedZoneId: !Ref Route53HostedZoneId
          RecordSets: 
            - Name:
                !Ref Route53DomainName
              Type: A
              Region: eu-central-1
              SetIdentifier: Germany
              HealthCheckId: !Ref HealthCheckGermany
              AliasTarget:
                HostedZoneId: !Ref ApiGermanyHostedZoneId
                DNSName: !Ref ApiGermanyDomainName
                EvaluateTargetHealth: True
            - Name:
                !Ref Route53DomainName
              Type: A
              Region: eu-west-1
              SetIdentifier: Ireland
              HealthCheckId: !Ref HealthCheckIreland
              AliasTarget:
                HostedZoneId: !Ref ApiIrelandHostedZoneId
                DNSName: !Ref ApiIrelandDomainName
                EvaluateTargetHealth: True
    
    この例では2つの領域を使用しますが、すべての領域を使いたい場合は、そのコードをRecorseSetGroupに繰り返して、各エンドポイントのヘルスチェックを作成しなければなりません.

    好奇心


    私は両方のポリシーを動作させるためにAPIレベルでカスタムドメインを使用するよう強制されます.
    AWSTemplateFormatVersion: '2010-09-09'
    Transform: AWS::Serverless-2016-10-31
    
    ##########################################################################
    #  Parameters                                                            #
    ##########################################################################
    Parameters:
      StageName:
        Description: The name of the stage is the first path segment in the Uniform Resource Identifier (URI) of a call to API Gateway
        Type: String
        Default: dev
      Domain:
        Type: String
      CertId:
        Type: String
      Stage:
        Type: String
        Default: $default
    
    Resources:
    ##########################################################################
    #  API Gateway Custom Domain                               
    # ##########################################################################
      CustomDomainName:
        Type: AWS::ApiGatewayV2::DomainName
        Properties:
          DomainName: !Ref Domain
          DomainNameConfigurations:
            - EndpointType: REGIONAL
              CertificateArn: !Sub "arn:aws:acm:${AWS::Region}:${AWS::AccountId}:certificate/${CertId}"
              CertificateName: gatewayCertificate
    
      ApiMapping:
        Type: AWS::ApiGatewayV2::ApiMapping
        Properties:
          ApiId: 
            Fn::ImportValue: 
              !Sub ApiId-${AWS::Region}
          DomainName: !Ref CustomDomainName
          Stage: !Ref Stage
    
    Outputs:
      RegionalHostedZoneId:
        Description: The regional hosted zone id of the custom domain
        Value: !GetAtt CustomDomainName.RegionalHostedZoneId
        Export:
          Name: !Sub RegionalHostedZoneId-${AWS::Region}
    
      RegionalDomainName:
        Description: The regional domain name of the custom domain
        Value: !GetAtt CustomDomainName.RegionalDomainName
        Export:
          Name: !Sub RegionalDomainName-${AWS::Region}
    
    カスタムドメイン名は、文字のランダムな組み合わせよりもユーザーに提供するより直感的なURLです.たとえば、Route 53は、ルートポリシーのカスタムドメインを使用しますが、Healthはエンドポイントをチェックします.ただし、カスタムドメインのカスタムドメインまたはエンドポイントマッピングを削除することによってフェールオーバーまたは次のベストレイテンシ領域をトリガーするエラーをシミュレートしようとすると、これは誤解を招く可能性があります.

    結論


    ご存知のように、同じレコードに複数のルーティングポリシーを持つことはできません.私は、私の記憶が私にいくらかのトリックをするのを避けるようにしました、そして、エラーはそうです:
    (InvalidChangeBatch 400: RRSet with DNS name api.xxxxx.com., type A, SetIdentifier Italy, and Region Name=eu-south-1 cannot be created because a non-latency RRSet with the same name and type already exists.)
    
    ヘルスチェック状態が不健康であるときだけ、Route 53が次の終点への要求をリダイレクトするので、健康チェックは両方のルーティング方針のためのキーです.があるHow health checks work in complex Amazon Route 53 configurations それはいくつかのケースを考慮していますが、インスタンスを使用しています.
    私がServerlessをする間、概念は同じです、そして、1つの終点の失敗をシミュレーションするために、私はラムダ関数が500エラーステータスを返すであろうことを確認する必要があります、そして、削除しないでください、例えばカスタムドメインからのAPIマッピング.
    私は今、マルチアーキテクチャのセットアップにこのアーキテクチャを動かす第2のステップを解決しました.

    次に、Dynamodbとマルチ領域シナリオでデータを共有する複雑さを見ていきます.