AWS Aurora を複数のアベイラビリティーゾーンにデプロイ

データベースの構成要素

このトピックでは、特定の AWS リージョン内で 1 つ以上のアベイラビリティーゾーンの障害を許容するために、PostgreSQL インスタンスの Aurora リージョナルデプロイメントを複数のアベイラビリティーゾーンにデプロイする方法について説明します。

このデプロイメントは、マルチサイトデプロイメントの概念ガイドで説明されているセットアップで使用することを目的としています。このデプロイメントは、マルチサイトデプロイメントの構成要素ガイドで概説されている他の構成要素とともに使用してください。

これらのブループリントは、通常のインストールにおいて優れたベースラインパフォーマンスを備えた、機能的に完全な最小限の例を示すために提供されています。それでも、お客様の環境および組織の標準とセキュリティのベストプラクティスに合わせて調整する必要があります。

アーキテクチャ

Aurora データベースクラスターは、複数の Aurora データベースインスタンスで構成されており、1 つのインスタンスがプライマリライターとして指定され、その他はすべてバックアップリーダーとして指定されます。アベイラビリティーゾーンの障害が発生した場合の高可用性を確保するために、Aurora では、単一の AWS リージョン内の複数のゾーンにデータベースインスタンスをデプロイできます。プライマリデータベースインスタンスをホストしているアベイラビリティーゾーンで障害が発生した場合、Aurora は自動的に自己修復し、障害が発生していないアベイラビリティーゾーンからリーダーインスタンスを新しいライターインスタンスに昇格させます。

aurora multi az.dio
図 1. Aurora 複数アベイラビリティーゾーンデプロイメント

Aurora データベースによって提供されるセマンティクスの詳細については、AWS Aurora ドキュメントを参照してください。

このドキュメントは、AWS のベストプラクティスに従い、インターネットに公開されていないプライベート Aurora データベースを作成します。ROSA クラスターからデータベースにアクセスするには、データベースと ROSA クラスター間のピアリング接続を確立します

手順

以下の手順には、2 つのセクションが含まれています。

  • eu-west-1 に "keycloak-aurora" という名前の Aurora Multi-AZ データベースクラスターを作成します。

  • ROSA クラスターにデプロイされたアプリケーションがデータベースとの接続を確立できるように、ROSA クラスターと Aurora VPC 間のピアリング接続を作成します。

Aurora データベースクラスターの作成

  1. Aurora クラスター用の VPC を作成します。

    コマンド
    aws ec2 create-vpc \
      --cidr-block 192.168.0.0/16 \
      --tag-specifications "ResourceType=vpc, Tags=[{Key=AuroraCluster,Value=keycloak-aurora}]" \(1)
      --region eu-west-1
    1 VPC を簡単に取得できるように、Aurora クラスターの名前でオプションのタグを追加します。
    出力
    {
        "Vpc": {
            "CidrBlock": "192.168.0.0/16",
            "DhcpOptionsId": "dopt-0bae7798158bc344f",
            "State": "pending",
            "VpcId": "vpc-0b40bd7c59dbe4277",
            "OwnerId": "606671647913",
            "InstanceTenancy": "default",
            "Ipv6CidrBlockAssociationSet": [],
            "CidrBlockAssociationSet": [
                {
                    "AssociationId": "vpc-cidr-assoc-09a02a83059ba5ab6",
                    "CidrBlock": "192.168.0.0/16",
                    "CidrBlockState": {
                        "State": "associated"
                    }
                }
            ],
            "IsDefault": false
        }
    }
  2. 新しく作成した VPC の VpcId を使用して、Aurora をデプロイする各アベイラビリティーゾーンのサブネットを作成します。

    各アベイラビリティーゾーンに指定された cidr-block 範囲は重複してはいけません。
    1. ゾーン A

      コマンド
      aws ec2 create-subnet \
        --availability-zone "eu-west-1a" \
        --vpc-id vpc-0b40bd7c59dbe4277 \
        --cidr-block 192.168.0.0/19 \
        --region eu-west-1
      出力
      {
          "Subnet": {
              "AvailabilityZone": "eu-west-1a",
              "AvailabilityZoneId": "euw1-az3",
              "AvailableIpAddressCount": 8187,
              "CidrBlock": "192.168.0.0/19",
              "DefaultForAz": false,
              "MapPublicIpOnLaunch": false,
              "State": "available",
              "SubnetId": "subnet-0d491a1a798aa878d",
              "VpcId": "vpc-0b40bd7c59dbe4277",
              "OwnerId": "606671647913",
              "AssignIpv6AddressOnCreation": false,
              "Ipv6CidrBlockAssociationSet": [],
              "SubnetArn": "arn:aws:ec2:eu-west-1:606671647913:subnet/subnet-0d491a1a798aa878d",
              "EnableDns64": false,
              "Ipv6Native": false,
              "PrivateDnsNameOptionsOnLaunch": {
                  "HostnameType": "ip-name",
                  "EnableResourceNameDnsARecord": false,
                  "EnableResourceNameDnsAAAARecord": false
              }
          }
      }
    2. ゾーン B

      コマンド
      aws ec2 create-subnet \
        --availability-zone "eu-west-1b" \
        --vpc-id vpc-0b40bd7c59dbe4277 \
        --cidr-block 192.168.32.0/19 \
        --region eu-west-1
      出力
      {
          "Subnet": {
              "AvailabilityZone": "eu-west-1b",
              "AvailabilityZoneId": "euw1-az1",
              "AvailableIpAddressCount": 8187,
              "CidrBlock": "192.168.32.0/19",
              "DefaultForAz": false,
              "MapPublicIpOnLaunch": false,
              "State": "available",
              "SubnetId": "subnet-057181b1e3728530e",
              "VpcId": "vpc-0b40bd7c59dbe4277",
              "OwnerId": "606671647913",
              "AssignIpv6AddressOnCreation": false,
              "Ipv6CidrBlockAssociationSet": [],
              "SubnetArn": "arn:aws:ec2:eu-west-1:606671647913:subnet/subnet-057181b1e3728530e",
              "EnableDns64": false,
              "Ipv6Native": false,
              "PrivateDnsNameOptionsOnLaunch": {
                  "HostnameType": "ip-name",
                  "EnableResourceNameDnsARecord": false,
                  "EnableResourceNameDnsAAAARecord": false
              }
          }
      }
  3. Aurora VPC ルートテーブルの ID を取得します。

    コマンド
    aws ec2 describe-route-tables \
      --filters Name=vpc-id,Values=vpc-0b40bd7c59dbe4277 \
      --region eu-west-1
    出力
    {
        "RouteTables": [
            {
                "Associations": [
                    {
                        "Main": true,
                        "RouteTableAssociationId": "rtbassoc-02dfa06f4c7b4f99a",
                        "RouteTableId": "rtb-04a644ad3cd7de351",
                        "AssociationState": {
                            "State": "associated"
                        }
                    }
                ],
                "PropagatingVgws": [],
                "RouteTableId": "rtb-04a644ad3cd7de351",
                "Routes": [
                    {
                        "DestinationCidrBlock": "192.168.0.0/16",
                        "GatewayId": "local",
                        "Origin": "CreateRouteTable",
                        "State": "active"
                    }
                ],
                "Tags": [],
                "VpcId": "vpc-0b40bd7c59dbe4277",
                "OwnerId": "606671647913"
            }
        ]
    }
  4. Aurora VPC ルートテーブルを各アベイラビリティーゾーンのサブネットに関連付けます。

    1. ゾーン A

      コマンド
      aws ec2 associate-route-table \
        --route-table-id rtb-04a644ad3cd7de351 \
        --subnet-id subnet-0d491a1a798aa878d \
        --region eu-west-1
    2. ゾーン B

      コマンド
      aws ec2 associate-route-table \
        --route-table-id rtb-04a644ad3cd7de351 \
        --subnet-id subnet-057181b1e3728530e \
        --region eu-west-1
  5. Aurora サブネットグループを作成します。

    コマンド
    aws rds create-db-subnet-group \
      --db-subnet-group-name keycloak-aurora-subnet-group \
      --db-subnet-group-description "Aurora DB Subnet Group" \
      --subnet-ids subnet-0d491a1a798aa878d subnet-057181b1e3728530e \
      --region eu-west-1
  6. Aurora セキュリティグループを作成します。

    コマンド
    aws ec2 create-security-group \
      --group-name keycloak-aurora-security-group \
      --description "Aurora DB Security Group" \
      --vpc-id vpc-0b40bd7c59dbe4277 \
      --region eu-west-1
    出力
    {
        "GroupId": "sg-0d746cc8ad8d2e63b"
    }
  7. Aurora DB クラスターを作成します。

    コマンド
    aws rds create-db-cluster \
        --db-cluster-identifier keycloak-aurora \
        --database-name keycloak \
        --engine aurora-postgresql \
        --engine-version ${properties["aurora-postgresql.version"]} \
        --master-username keycloak \
        --master-user-password secret99 \
        --vpc-security-group-ids sg-0d746cc8ad8d2e63b \
        --db-subnet-group-name keycloak-aurora-subnet-group \
        --region eu-west-1
    --master-username および --master-user-password の値は置き換える必要があります。ここで指定する値は、Keycloak データベースの認証情報を構成するときに使用する必要があります。
    出力
    {
        "DBCluster": {
            "AllocatedStorage": 1,
            "AvailabilityZones": [
                "eu-west-1b",
                "eu-west-1c",
                "eu-west-1a"
            ],
            "BackupRetentionPeriod": 1,
            "DatabaseName": "keycloak",
            "DBClusterIdentifier": "keycloak-aurora",
            "DBClusterParameterGroup": "default.aurora-postgresql15",
            "DBSubnetGroup": "keycloak-aurora-subnet-group",
            "Status": "creating",
            "Endpoint": "keycloak-aurora.cluster-clhthfqe0h8p.eu-west-1.rds.amazonaws.com",
            "ReaderEndpoint": "keycloak-aurora.cluster-ro-clhthfqe0h8p.eu-west-1.rds.amazonaws.com",
            "MultiAZ": false,
            "Engine": "aurora-postgresql",
            "EngineVersion": "15.5",
            "Port": 5432,
            "MasterUsername": "keycloak",
            "PreferredBackupWindow": "02:21-02:51",
            "PreferredMaintenanceWindow": "fri:03:34-fri:04:04",
            "ReadReplicaIdentifiers": [],
            "DBClusterMembers": [],
            "VpcSecurityGroups": [
                {
                    "VpcSecurityGroupId": "sg-0d746cc8ad8d2e63b",
                    "Status": "active"
                }
            ],
            "HostedZoneId": "Z29XKXDKYMONMX",
            "StorageEncrypted": false,
            "DbClusterResourceId": "cluster-IBWXUWQYM3MS5BH557ZJ6ZQU4I",
            "DBClusterArn": "arn:aws:rds:eu-west-1:606671647913:cluster:keycloak-aurora",
            "AssociatedRoles": [],
            "IAMDatabaseAuthenticationEnabled": false,
            "ClusterCreateTime": "2023-11-01T10:40:45.964000+00:00",
            "EngineMode": "provisioned",
            "DeletionProtection": false,
            "HttpEndpointEnabled": false,
            "CopyTagsToSnapshot": false,
            "CrossAccountClone": false,
            "DomainMemberships": [],
            "TagList": [],
            "AutoMinorVersionUpgrade": true,
            "NetworkType": "IPV4"
        }
    }
  8. Aurora DB インスタンスを作成します。

    1. ゾーン A ライターインスタンスを作成します。

      コマンド
        aws rds create-db-instance \
          --db-cluster-identifier keycloak-aurora \
          --db-instance-identifier "keycloak-aurora-instance-1" \
          --db-instance-class db.t4g.large \
          --engine aurora-postgresql \
          --region eu-west-1
    2. ゾーン B リーダーインスタンスを作成します。

      コマンド
        aws rds create-db-instance \
          --db-cluster-identifier keycloak-aurora \
          --db-instance-identifier "keycloak-aurora-instance-2" \
          --db-instance-class db.t4g.large \
          --engine aurora-postgresql \
          --region eu-west-1
  9. すべてのライターインスタンスとリーダーインスタンスが準備完了になるまで待ちます。

    コマンド
    aws rds wait db-instance-available --db-instance-identifier keycloak-aurora-instance-1 --region eu-west-1
    aws rds wait db-instance-available --db-instance-identifier keycloak-aurora-instance-2 --region eu-west-1
  10. Keycloak で使用するライターエンドポイント URL を取得します。

    コマンド
    aws rds describe-db-clusters \
      --db-cluster-identifier keycloak-aurora \
      --query 'DBClusters[*].Endpoint' \
      --region eu-west-1 \
      --output text
    出力
    [
        "keycloak-aurora.cluster-clhthfqe0h8p.eu-west-1.rds.amazonaws.com"
    ]

ROSA クラスターとのピアリング接続の確立

Keycloak デプロイメントを含む各 ROSA クラスターに対して、これらの手順を一度実行します。

  1. Aurora VPC を取得します。

    コマンド
    aws ec2 describe-vpcs \
      --filters "Name=tag:AuroraCluster,Values=keycloak-aurora" \
      --query 'Vpcs[*].VpcId' \
      --region eu-west-1 \
      --output text
    出力
    vpc-0b40bd7c59dbe4277
  2. ROSA クラスター VPC を取得します。

    1. oc を使用して ROSA クラスターにログインします。

    2. ROSA VPC を取得します。

      コマンド
      NODE=$(kubectl get nodes --selector=node-role.kubernetes.io/worker -o jsonpath='{.items[0].metadata.name}')
      aws ec2 describe-instances \
        --filters "Name=private-dns-name,Values=${NODE}" \
        --query 'Reservations[0].Instances[0].VpcId' \
        --region eu-west-1 \
        --output text
      出力
      vpc-0b721449398429559
  3. ピアリング接続を作成します。

    コマンド
    aws ec2 create-vpc-peering-connection \
      --vpc-id vpc-0b721449398429559 \(1)
      --peer-vpc-id vpc-0b40bd7c59dbe4277 \(2)
      --peer-region eu-west-1 \
      --region eu-west-1
    1 ROSA クラスター VPC
    2 Aurora VPC
    出力
    {
        "VpcPeeringConnection": {
            "AccepterVpcInfo": {
                "OwnerId": "606671647913",
                "VpcId": "vpc-0b40bd7c59dbe4277",
                "Region": "eu-west-1"
            },
            "ExpirationTime": "2023-11-08T13:26:30+00:00",
            "RequesterVpcInfo": {
                "CidrBlock": "10.0.17.0/24",
                "CidrBlockSet": [
                    {
                        "CidrBlock": "10.0.17.0/24"
                    }
                ],
                "OwnerId": "606671647913",
                "PeeringOptions": {
                    "AllowDnsResolutionFromRemoteVpc": false,
                    "AllowEgressFromLocalClassicLinkToRemoteVpc": false,
                    "AllowEgressFromLocalVpcToRemoteClassicLink": false
                },
                "VpcId": "vpc-0b721449398429559",
                "Region": "eu-west-1"
            },
            "Status": {
                "Code": "initiating-request",
                "Message": "Initiating Request to 606671647913"
            },
            "Tags": [],
            "VpcPeeringConnectionId": "pcx-0cb23d66dea3dca9f"
        }
    }
  4. ピアリング接続が存在するまで待ちます。

    コマンド
    aws ec2 wait vpc-peering-connection-exists --vpc-peering-connection-ids pcx-0cb23d66dea3dca9f
  5. ピアリング接続を受け入れます。

    コマンド
    aws ec2 accept-vpc-peering-connection \
      --vpc-peering-connection-id pcx-0cb23d66dea3dca9f \
      --region eu-west-1
    出力
    {
        "VpcPeeringConnection": {
            "AccepterVpcInfo": {
                "CidrBlock": "192.168.0.0/16",
                "CidrBlockSet": [
                    {
                        "CidrBlock": "192.168.0.0/16"
                    }
                ],
                "OwnerId": "606671647913",
                "PeeringOptions": {
                    "AllowDnsResolutionFromRemoteVpc": false,
                    "AllowEgressFromLocalClassicLinkToRemoteVpc": false,
                    "AllowEgressFromLocalVpcToRemoteClassicLink": false
                },
                "VpcId": "vpc-0b40bd7c59dbe4277",
                "Region": "eu-west-1"
            },
            "RequesterVpcInfo": {
                "CidrBlock": "10.0.17.0/24",
                "CidrBlockSet": [
                    {
                        "CidrBlock": "10.0.17.0/24"
                    }
                ],
                "OwnerId": "606671647913",
                "PeeringOptions": {
                    "AllowDnsResolutionFromRemoteVpc": false,
                    "AllowEgressFromLocalClassicLinkToRemoteVpc": false,
                    "AllowEgressFromLocalVpcToRemoteClassicLink": false
                },
                "VpcId": "vpc-0b721449398429559",
                "Region": "eu-west-1"
            },
            "Status": {
                "Code": "provisioning",
                "Message": "Provisioning"
            },
            "Tags": [],
            "VpcPeeringConnectionId": "pcx-0cb23d66dea3dca9f"
        }
    }
  6. ROSA クラスター VPC ルートテーブルを更新します。

    コマンド
    ROSA_PUBLIC_ROUTE_TABLE_ID=$(aws ec2 describe-route-tables \
      --filters "Name=vpc-id,Values=vpc-0b721449398429559" "Name=association.main,Values=true" \(1)
      --query "RouteTables[*].RouteTableId" \
      --output text \
      --region eu-west-1
    )
    aws ec2 create-route \
      --route-table-id ${ROSA_PUBLIC_ROUTE_TABLE_ID} \
      --destination-cidr-block 192.168.0.0/16 \(2)
      --vpc-peering-connection-id pcx-0cb23d66dea3dca9f \
      --region eu-west-1
    1 ROSA クラスター VPC
    2 これは、Aurora VPC の作成時に使用した cidr-block と同じである必要があります。
  7. Aurora セキュリティグループを更新します。

    コマンド
    AURORA_SECURITY_GROUP_ID=$(aws ec2 describe-security-groups \
      --filters "Name=group-name,Values=keycloak-aurora-security-group" \
      --query "SecurityGroups[*].GroupId" \
      --region eu-west-1 \
      --output text
    )
    aws ec2 authorize-security-group-ingress \
      --group-id ${AURORA_SECURITY_GROUP_ID} \
      --protocol tcp \
      --port 5432 \
      --cidr 10.0.17.0/24 \(1)
      --region eu-west-1
    1 ROSA クラスターの "machine_cidr"
    出力
    {
        "Return": true,
        "SecurityGroupRules": [
            {
                "SecurityGroupRuleId": "sgr-0785d2f04b9cec3f5",
                "GroupId": "sg-0d746cc8ad8d2e63b",
                "GroupOwnerId": "606671647913",
                "IsEgress": false,
                "IpProtocol": "tcp",
                "FromPort": 5432,
                "ToPort": 5432,
                "CidrIpv4": "10.0.17.0/24"
            }
        ]
    }

接続の検証

ROSA クラスターと Aurora DB クラスター間の接続が可能であることを検証する最も簡単な方法は、Openshift クラスターに psql をデプロイし、ライターエンドポイントへの接続を試みることです。

次のコマンドは、デフォルト名前空間にポッドを作成し、可能であれば Aurora クラスターとの psql 接続を確立します。ポッドシェルを終了すると、ポッドは削除されます。

USER=keycloak (1)
PASSWORD=secret99 (2)
DATABASE=keycloak (3)
HOST=$(aws rds describe-db-clusters \
  --db-cluster-identifier keycloak-aurora \(4)
  --query 'DBClusters[*].Endpoint' \
  --region eu-west-1 \
  --output text
)
kubectl run -i --tty --rm debug --image=postgres:15 --restart=Never -- psql postgresql://${USER}:${PASSWORD}@${HOST}/${DATABASE}
1 Aurora DB ユーザー。これは、DB の作成時に使用した --master-username と同じにすることができます。
2 Aurora DB ユーザーパスワード。これは、DB の作成時に使用した --master—​user-password と同じにすることができます。
3 Aurora DB の名前(--database-name など)。
4 Aurora DB クラスターの名前。

Aurora データベースと Keycloak の接続

Aurora データベースが確立され、すべての ROSA クラスターとリンクされたので、Aurora データベースと Keycloak を接続するための関連する Keycloak CR オプションを以下に示します。これらの変更は、Keycloak Operator を使用した HA 用 Keycloak のデプロイガイドで必要になります。JDBC URL は、Aurora データベースライターエンドポイントを使用するように構成されています。

  1. spec.db.urljdbc:aws-wrapper:postgresql://$HOST:5432/keycloak に更新します。ここで、$HOSTAurora ライターエンドポイント URL です。

  2. spec.db.usernameSecret および spec.db.passwordSecret によって参照される Secrets に、Aurora の作成時に定義されたユーザー名とパスワードが含まれていることを確認してください。

次のステップ

Aurora データベースのデプロイが成功したら、Infinispan Operator を使用した HA 用 Infinispan のデプロイに進みます。

このページの内容