Terraform を使用して SQL Server フェイルオーバークラスターインスタンスを Amazon EC2 および Amazon FSx にデプロイする - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Terraform を使用して SQL Server フェイルオーバークラスターインスタンスを Amazon EC2 および Amazon FSx にデプロイする

Mark Hudson と Matt Burgess、Amazon Web Services

概要

このパターンでは、Terraform を使用して、Amazon Elastic Compute Cloud (Amazon EC2) 上の Windows Server フェイルオーバークラスター (WSFC) ノード全体に SQL Server フェイルオーバークラスターインスタンス (FCIs) をデプロイします。さらに、このパターンでは、データとログファイルに Amazon FSx 共有ストレージを使用します。

SQL Server データベースが に移行する場合 AWS、最初の選択肢は Amazon RDS for SQL Server です。ただし、Amazon RDS for SQL Server が適していない場合があり、SQL Server を高可用性アーキテクチャの Amazon EC2 にデプロイする必要があります。このソリューションでは、SQL Server FCI が WSFC ノード全体にインストールされます。

このパターンに含まれる Terraform モジュールでは、最大 2 つの Amazon EC2 SQL Server インスタンスをプロビジョニングします。Amazon FSx for Windows File Server ファイルシステムはクォーラム監視として機能し、共有データとログファイルを保存します。設定されたインスタンスの数に関係なく、SQL Server インスタンスノードは常に FCI クラスターを作成して結合し、環境のパリティを確保します (通常は、開発環境用に 1 つのインスタンス、本番環境用に 2 つのインスタンスが設定されています)。高可用性のために 2 つのノードを使用する設定の場合、内部 Network Load Balancer がプロビジョニングされます。Network Load Balancer は、FCI クラスターに設定されたヘルスプローブを使用して、プライマリのノードを特定します。

前提条件と制限事項

前提条件

  • アクティブ AWS アカウント。

  • 個別のアベイラビリティーゾーンに 2 つのサブネットを持つ Amazon Virtual Private Cloud (Amazon VPC)。

  • Amazon VPC の DHCP オプションセット。Active Directory ドメイン名に解決するようにドメイン名を設定し、Active Directory ドメインコントローラーを指すようにドメインと NetBIOS ネームサーバーを設定します。詳細については、「追加情報」の「VPC の設定」を参照してください。

  • AWS Directory Service for Microsoft Active Directory (AWS Managed Microsoft AD).

  • カスタム Amazon マシンイメージ (AMI) 詳細については、「追加情報」の「AMI の設定」を参照してください。

  • SQL Server ISO イメージを含む Amazon Simple Storage Service (Amazon S3) バケット。この前提条件は、提供された component.yaml ファイルと EC2 Image Builder を使用してカスタム AMI を構築する場合にのみ必要です。

  • AWS Key Management Service (AWS KMS) 暗号化キー。

  • デフォルトでは、SQL Server は Developer エディションのプロダクトキーを使用してインストールされます。本番システムでは、関連する変数によってモジュールに渡された有効なプロダクトキーを使用してください。

制限事項

  • このソリューションには AWS Managed Microsoft ADが必要です。ただし、必要に応じて、代わりにセルフマネージド Active Directory 実装を使用できます。これを行うには、含まれている Amazon FSx Terraform モジュールを変更して active_directory_id 属性を削除します。次に、Terraform ドキュメントの記載に従って、セルフマネージド Active Directory に必要な 4 つの属性を追加します。

  • SQL Server は、混合モード認証を使用するように設定されています。必要に応じて、Windows のみの認証を使用できます。そのためには、提供されたユーザーデータスクリプトで、setup.exe コマンドに渡された /SECURITYMODE および /SAPWD パラメータを削除します。sql_accounts.tf ファイルを削除し、instances.tf ファイルを変更して sql_sa_password エントリを削除することができます。

  • デプロイされたクラスターを削除するときは、対応する仮想コンピュータオブジェクトと、Active Directory 内の個々のコンピュータオブジェクトを削除する必要があります。オブジェクトを削除するには、Active Directory 管理ツールを使用します。

  • 一部の AWS のサービス は、すべてで利用できるわけではありません AWS リージョン。利用可能なリージョンについては、「AWS サービス (リージョン別)」を参照してください。特定のエンドポイントについては、「サービスエンドポイントとクォータ」を参照して、サービスのリンクを選択してください。

製品バージョン

このソリューションは次のバージョンでテスト済みです。

アーキテクチャ

ソーステクノロジースタック

  • SQL Server

ターゲットテクノロジースタック

  • Amazon EC2 を使用した WSFC ノード上の SQL Server FCI

  • Amazon FSx for Windows File Server

  • Amazon S3 バケット

  • AWS Secrets Manager

  • AWS Managed Microsoft AD

  • AWS KMS

  • AWS Identity and Access Management (IAM)

ターゲットアーキテクチャ

このソリューション用のアーキテクチャを次の図に示します。

Amazon EC2 の Windows Server フェイルオーバークラスターノードに SQL Server フェイルオーバークラスターインスタンスをデプロイするアーキテクチャ。

図に示す内容は以下のとおりです。

  • EC2 インスタンスに AWS KMS および Secrets Manager へのアクセスを提供する IAM ロール

  • 2 つのアベイラビリティーゾーンにまたがるプライベートサブネットの Amazon EC2 インスタンスにデプロイされた 2 つの SQL Server ノード

  • アクティブな SQL Server インスタンスへの接続を容易にする Network Load Balancer (単一ノードクラスターのセットアップ時にはデプロイされません)

  • SQL Server ノードによって共有ストレージ用に両方のプライベートサブネットにデプロイされた Amazon FSx for Windows File Server ファイルシステム

  • Active Directory と SQL Server の認証情報と設定を保存するための Secrets Manager

  • SQL Server インストールイメージを保存するための Amazon S3 バケット

  • AWS Managed Microsoft AD for Windows 認証

  • AWS KMS 暗号化キーを作成するための

自動化とスケール

GitHub リポジトリにある Terraform モジュールを使用して、ターゲットアーキテクチャのデプロイを自動化できます。terraform.tfvars ファイルを変更して、環境に固有の変数値を含める必要があります。Amazon S3 バケット、 AWS Managed Microsoft AD コンポーネント、 AWS KMS 暗号化キー、および一部のシークレットは、このデプロイの前提条件であり、Terraform コードには含まれていません。

ツール

AWS のサービス

  • AWS Directory Service for Microsoft Active Directory は、ディレクトリ対応のワークロードと AWS リソースが で Microsoft Active Directory を使用できるようにします AWS クラウド。このパターンでは、 AWS Managed Microsoft AD は Windows Server および SQL Server 認証、DNS に使用されます。

  • Amazon Elastic Compute Cloud (Amazon EC2) は、 AWS クラウドでスケーラブルなコンピューティング容量を提供します。仮想サーバーを必要な数だけ起動して、迅速にスケールアップまたはスケールダウンができます。このパターンでは、SQL Server フェイルオーバークラスターインスタンスは Amazon EC2 インスタンスにインストールされます。

  • EC2 Image Builder は、カスタマイズされたサーバーイメージの作成、管理、デプロイを自動化するのに役立ちます。

  • Amazon FSx for Windows File Server は、Windows Server でフルマネージド共有ストレージを提供します。このパターンでは、FSx for Windows File Server は SQL Server データおよびログファイルとクォーラム監視用の共有ストレージを提供します。

  • AWS Identity and Access Management (IAM) は、誰を認証し、誰に使用を認可するかを制御することで、 AWS リソースへのアクセスを安全に管理するのに役立ちます。

  • AWS Key Management Service (AWS KMS) は、データの保護に役立つ暗号化キーの作成と制御に役立ちます。このパターンでは、Secrets Manager シークレット、Amazon Elastic Block Store (Amazon EBS) ボリュームの SQL Server ストレージ、および FSx for Windows File Server ファイルシステムを暗号化するために使用されます。

  • AWS Secrets Manager を使用すると、コード内のハードコードされた認証情報 (パスワードを含む) を Secrets Manager への API コールで置き換えて、プログラムでシークレットを取得することができます。このパターンでは、SQL Server をインストールして実行するための Active Directory 認証情報、sa ユーザー認証情報、およびデータベース接続情報が Secrets Manager に保存されます。

  • Amazon Simple Storage Service (Amazon S3) は、あらゆる量のデータを保存、保護、取得できるクラウドベースのオブジェクトストレージサービスです。このパターンでは、Amazon S3 バケットを使用して SQL Server のインストールイメージを保存します。

  • Amazon Virtual Private Cloud (Amazon VPC) は、定義した仮想ネットワークに AWS リソースを起動するのに役立ちます。この仮想ネットワークは、ユーザー自身のデータセンターで運用されていた従来のネットワークと似ていますが、 AWSのスケーラブルなインフラストラクチャを使用できるという利点があります。

その他のツール

  • Microsoft SQL Server FCI は Windows Server クラスターノード全体にインストールされます。さらに、複数のサブネットにインストールできます。このパターンでは、SQL Server FCI インスタンスは WSFC ノード全体にインストールされます。

  • Terraform は、コードを使用してクラウドインフラストラクチャとリソースをプロビジョニングして管理するのに役立つ infrastructure as code (IaC) ツールです。このパターンでは、Terraform を使用してリソースを作成し、SQL Server FCI インスタンスを設定します。

  • Windows Server フェイルオーバークラスタリングは、SQL Server などのホストされるサーバーアプリケーションの高可用性をサポートするインフラストラクチャ機能を提供します。このパターンでは、FCI ノードは WSFC 機能を使用して、インスタンスレベルで冗長性を通じてローカルの高可用性を提供します。

コードリポジトリ

このパターンのコードは、GitHub の cluster-amazon-elastic-compute-cloud-amazon-fsx-microsoft-sql-server リポジトリで入手できます。このリポジトリでは、次のリソースを入手できます。

  • ソリューションの概要と追加のインストールおよび使用状況情報を提供する README.md ファイル

  • このパターンのコンポーネントをプロビジョニングするための Terraform 設定ファイルのベースセットと Amazon FSx 固有のモジュール

  • Amazon EC2 ユーザーデータスクリプトとして実行されるインスタンスセットアップスクリプト

  • Image Builder がカスタム AMI の作成に使用できる component.yaml ファイル

ベストプラクティス

セキュリティとパッチ適用

  • AMI の前提条件であるインストールと設定は、SQL Server FCI クラスターをデプロイするための最小要件です。組織の基準とセキュリティ要件に準拠するには、追加のソフトウェアと設定が必要になる場合があります。

  • デプロイ後、Windows に継続的にパッチを適用します。実行中のインスタンスに直接パッチを適用するか、最新の Windows パッチを使用して新しい AMI を作成し、新しい AMI を使用してインスタンスを (一度に 1 つずつ) 置き換えます。 は、最新のオペレーティングシステムパッチ、ドライバー、起動エージェントを含む新しい Windows AMIs を毎月 AWS リリースします。新しいインスタンスを起動する際、または独自のカスタムイメージを作成する際は、最新の AMI を確認してください。

  • Amazon EC2 インスタンスは、すべての送信トラフィックを許可するように設定されています。本番環境にデプロイする場合、セキュリティグループのアウトバウンドルールを設定して、このトラフィックを必要な送信先に制限する必要があります。

  • FSx for Windows File Server ファイルシステムは、ファイル共有とファイルおよびフォルダへのアクセスの監査ログを自動的に記録し、環境での要件である場合は目的の宛先に配信することができます。

  • Secrets Manager シークレットを定期的に自動でローテーションします。Amazon EC2 インスタンスのキーペアについては、「AWS Secrets Manager を使用して SSH キーペアを安全に保管およびローテーションする方法」で説明されている自動ローテーションソリューションを検討してください。Active Directory 認証情報と SQL Server の sa 認証情報シークレットについては、パスワード管理のポリシーに従って自動ローテーションを設定します。

Active Directory の管理

  • FCI クラスターの一部として、Windows は Active Directory でコンピュータ名オブジェクト (CNO) を生成します。CNO は DNS リクエストに応答し、アクティブな SQL ノードにトラフィックを転送します。この Active Directory 提供の DNS を使用することはお勧めしません。TTL が高すぎて妥当なフェイルオーバー時間が得られず、多くの場合、新しいプライマリ IP アドレスが反映されるまでに 5 分以上かかります。一方、高可用性のインストールでは、内部 Network Load Balancer は 30 秒以内にフェイルオーバーするように設定されています。

  • クラスターを作成するには、Active Directory のドメイン管理者が必要です。この要件は、クラスターオブジェクトの作成と Active Directory でのアクセス許可の変更に必要なアクセス許可が昇格されているためです。ただし、SQL Server サービスはドメイン管理者として実行する必要はありません。そのため、この目的のために 2 番目の Active Directory ユーザーを作成することをお勧めします。ただし、サービスがドメイン管理者ユーザーとして実行される場合は、このユーザーを削除できます。その場合、ドメイン管理者ユーザーは、このパターンの一部として作成された Active Directory 管理者グループに追加する必要があります。

エピック

タスク説明必要なスキル

アクティブディレクトリグループを作成する。

で AWS Managed Microsoft AD、次のグループを作成します。

  • クラスター管理者グループ – このグループは、各クラスターノードのローカル管理者グループに追加されます。

  • クラスターリモートデスクトップグループ – このグループは、各クラスターノードのローカルリモートデスクトップユーザーグループに追加されます。

詳細については、 AWS ドキュメントの「グループの作成 AWS Managed Microsoft AD」を参照してください。

AD 管理者

Active Directory ユーザーを作成する。

で AWS Managed Microsoft AD、次のユーザーを作成します。

  • ドメイン管理者ユーザー – このアカウントはクラスターを作成するために使用します。

  • ドメインユーザー – SQL Server サービスでは、このアカウントは実行のために使用します。このユーザーを、前のタスクで作成したクラスター管理者グループに追加します。

詳細については、 AWS ドキュメントの AWS Managed Microsoft AD 「 ユーザーの作成」を参照してください。

AD 管理者

Active Directory 認証情報をシークレットに追加する。

Secrets Manager を使用して 4 つのシークレットを作成し、次の情報を保存します。

  • ドメイン管理者ユーザーのユーザー名

  • ドメイン管理者ユーザーのパスワード

  • ドメインユーザーのユーザー名

  • ドメインユーザーのパスワード

詳細については、 AWS ドキュメントの「 AWS Secrets Manager シークレットを作成する」を参照してください。

AWS 管理者
タスク説明必要なスキル

Windows AMI を作成する。

前提条件となるソフトウェアと設定を含むカスタム Windows AMI を作成します。詳細については、「追加情報」を参照してください。

AWS 管理者、AWS DevOps

Terraform をインストールします。

Terraform をインストールするには、Terraform ウェブサイトの指示に従ってください。

AWS DevOps

リポジトリをクローン作成します。

このパターンのリポジトリのクローンを作成します。詳細については、GitHub ウェブサイトの「リポジトリをクローンする」を参照してください。

AWS DevOps
タスク説明必要なスキル

Terraform 変数を変更する。

指定された terraform.tfvars ファイルを更新して、すべての変数を環境に適した値に設定します。

例えば、domain_group_administrators 変数と domain_group_rdp_users 変数を更新して、Active Directory ドメイン名と前に作成した Active Directory グループの名前を使用します。

AWS DevOps

Terraform を初期化します。

提案されたデプロイを確認するには、リポジトリのルートに移動します。Terraform コマンドラインインターフェイス (CLI) を使用して terraform init を実行し、次に terraform plan を実行します。

AWS DevOps

リソースをデプロイする。

SQL クラスターと関連リソースをデプロイするには、Terraform CLI を使用して terraform apply を実行します。

AWS DevOps、AWS 管理者

デプロイを検証する。

デプロイを検証するには、次の手順を実行します。

  1. リモートデスクトップを使用して、デプロイされた Windows Amazon EC2 インスタンスのいずれかに接続します。

  2. 詳細については、 AWS ドキュメントの「RDP を使用して Windows インスタンスに接続する」を参照してください。

  3. Windows Failover Cluster Manager を開きます。クラスターが作成されたこと、および SQL Server ロールが作成され実行中であることを確認します。

  4. SQL Server との接続と認証をテストするには、SQL Server Management Studio などのデータベースツールを使用して SQL Server エンドポイントに接続します。(エンドポイント値は Secrets Manager に保存されます)。詳細については、 AWS ドキュメントのAmazon EC2 で Microsoft SQL Server に接続する」を参照してください。

DBA、AWS システム管理者

トラブルシューティング

問題ソリューション

Terraform のプロビジョニングは完了しましたが、Windows Failover Cluster Manager はクラスターの作成が完了しているか、クラスターが操作不能な状態であるかを示していません。

リソースのインストール全体とクラスターの設定には 45~60 分かかる場合があります。Terraform が完了したら、ユーザーデータスクリプトを完了まで実行する必要があります。そのためには、複数回の再起動が必要です。進行状況をモニタリングするために、C:\ ドライブの Checkpoints ディレクトリと C:\Program Data\Microsoft SQL Server\150\Log の SQL Server インストールログを使用できます。完了すると、Installation Complete メッセージが C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log ファイルに書き込まれます。

機能しているクラスターをプロビジョニングした後、Terraform を使用してクラスターを削除したり再作成したりすることはできません。Terraform は完了しますが、クラスターは正しく設定されません。

プロビジョニングプロセスの一環として、マシンと仮想オブジェクトを Active Directory および Active Directory DNS に登録します。Amazon EC2 クラスターノードとクラスターノード用のコンピュータ名が存在する場合、FCI は正しく初期化できず、プロビジョニングが失敗します。

この問題を解決するには、以下の手順を実行します。

  1. Active Directory ユーザーとコンピュータの Amazon EC2 ノード、クラスター仮想コンピュータ、クラスター ID を削除します。

  2. Active Directory DNS でクラスター仮想コンピュータの DNS エントリを削除します。

  3. 次のコマンドを実行して、クラスター ID ランダム文字列 Terraform リソース terragrunt destroy -target=random_string.cluster_id を削除します。このアクションにより、既存の Amazon EC2 インスタンスが削除されます。

  4. terraform apply を実行して、3 つの新しいリソース、つまり 2 つの FCI Amazon EC2 インスタンスと 1 つのランダム文字列クラスター ID を想定します。

関連リソース

AWS ドキュメント

追加情報

Terraform モジュール情報

このモジュールでは、AMI 設定とユーザーデータ設定を組み合わせて、最適なプロビジョニング時間と安定性の組み合わせが得られるようにします。プロビジョニング中、Windows では複数回の再起動と待機が必要です。チェックポイントメソッドは、永続ユーザーデータの再起動中に無限ループから保護するために実装されています。ユーザーデータは永続化するように設定されています。そのため、ユーザーデータ設定スクリプトはべき等になるように開発され、そうあり続ける必要があります。べき等性は、更新プロセスを合理化し、FCI クラスターの再参加または再作成のための手動設定を行わずに、更新サイクル中にインスタンスをスワップアウトできるようにするものです。

SQL Server 接続文字列とフェイルオーバークラスタリング

モジュールは、このデータベースの接続文字列で使用するエンドポイントアドレスを含むシークレットを発行します。シークレット名は {environment_name}/sqlserver/{cluster_name}/endpoint という形式に従います。ノードが 1 つだけ使用されるインストールでは、これは Amazon EC2 インスタンス SQL Server インターフェイスの IP アドレスであると想定できます。高可用性インストール (2 つのインスタンス) では、これは内部 Network Load Balancer の DNS 名であると想定できます。

このモジュールでは、フェイルオーバークラスタリング仮想 IP はサポートされていません。仮想 IP を動作させるには、同じサブネット内に配置する必要があります。では AWS、1 つのサブネットを複数のアベイラビリティーゾーンにまたがることはできません。そのため、仮想 IP を使用した場合、このモジュールの能力を高可用性とみなすことはできません。

各 Amazon EC2 インスタンスには、3 つのプライベート IP アドレスが割り当てられます。使用方法は次のようになります。

  • ネットワークトラフィック用のプライマリ IP – 送信トラフィック用ソース IP です。

  • FCI 通信 – フェイルオーバークラスターの状態および同期を維持するために使用されます。

  • SQL Server (TCP ポート 1433) – リスナーであり、ハートビートトラフィックをリッスンしてプライマリのインスタンスを判断します。

VPC の構成

前提条件には、DNS 解決に Active Directory を使用するように設定された DHCP オプションセットが一覧表示されます。ただし、この前提条件は必須要件ではありません。必須要件は、EC2 インスタンスが Active Directory ドメイン名を解決できることです。この要件を満たすには、 Amazon Route 53 Resolver エンドポイントを使用するなど、他の方法を使用できます。詳細については、「Directory Service の DNS 解決と Amazon Route 53 Resolver の統合」(AWS ブログ記事) を参照してください。

AMI の設定

このパターンで使用される AMI には、以下の前提条件となるソフトウェアと設定が含まれている必要があります。

  1. SQL Server 2019 のインストールファイルを C:\SQL_Install_media にダウンロードして展開します。

  2. 次の Windows 機能をインストールします。

    • Install-WindowsFeature Failover-Clustering

    • Install-WindowsFeature RSAT-AD-PowerShell

    • Install-WindowsFeature RSAT-AD-Tools

    • Install-WindowsFeature RSAT-Clustering-Mgmt

    • Install-WindowsFeature RSAT-Clustering-PowerShell

    • Install-WindowsFeature RSAT-Clustering-CmdInterface

  3. 次のように Windows ファイアウォールを無効にします。

    • Get-NetFirewallProfile | Set-NetFirewallProfile -Enabled False

  4. 次のように CredSSP 認証方法を有効にします (<domain> を組織の Windows ドメイン名に置き換えます)。

    • Enable-WSManCredSSP -Role "Server" -Force

    • Enable-WSManCredSSP -Role "Client" -DelegateComputer *.<domain>.com -Force

  5. 次のレジストリキーを設定します。

    • NTLM 認証情報を許可します。

      • HKLM:\Software\Policies\Microsoft\Windows\CredentialsDelegation

        • 名前: AllowFreshCredentialsWhenNTLMOnly

        • 値: 1

        • 型: REG_DWORD

    • ローカルドメインコンピュータに PowerShell の NTLM の使用を許可します。

      • パス: HKLM:\Software\Policies\Microsoft\Windows\CredentialsDelegation\AllowFreshCredentialsWhenNTLMOnly

        • 名前: 1

        • 値: wsman/*.<domain>.com

        • 型: REG_SZ

  6. PowerShell Gallery を次のようにセットアップします。

    • [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

    • Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force

    • Set-PSRepository -Name PSGallery -InstallationPolicy Trusted

  7. 次の Windows PowerShell モジュール* をインストールします。

    • Install-Module -Name ComputerManagementDsc

    • Install-Module -Name FailOverClusterDsc

    • Install-Module -Name PSDscResources

    • Install-Module -Name xSmbShare

    • Install-Module -Name xActiveDirectory

    • Install-Module -Name SqlServer

Image Builder を使用して AMI を作成するには、Image Builder ドキュメントの「Create an image pipeline using the EC2 Image Builderconsole wizard」の手順に従います。前の前提条件でレシピのコンポーネントを作成するには、次の手順を実行します。

  1. GitHub リポジトリami フォルダから component.yaml ファイルをダウンロードします。

  2. コンテンツを新しい Image Builder コンポーネントにコピーします。

  3. 以下のプレースホルダーをお客様の情報で更新します。

    • <domain> – Active Directory ドメイン名

    • <bucket_name> – SQL Server イメージを含む Amazon S3 バケットの名前