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 FCIsが 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 は開発者エディションのプロダクトキーを使用してインストールされます。本番システムは、関連する変数によってモジュールに渡された有効な製品キーを使用することが期待されます。

制約事項

  • このソリューションには が必要です 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 FCIsは、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 管理者グループに追加する必要があります。

エピック

タスク説明必要なスキル

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_administratorsdomain_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 フェイルオーバークラスターマネージャーを開きます。クラスターが作成されたこと、および SQL Server ロールが作成され実行中であることを確認します。

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

AWS システム管理者

トラブルシューティング

問題ソリューション

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

リソースのインストール全体とクラスターの設定には 45~60 分かかる場合があります。Terraform が完了したら、ユーザーデータスクリプトを完了まで実行する必要があります。そのためには、複数回の再起動が必要です。進行状況をモニタリングするには、C:\ドライブの Checkpoints ディレクトリと の SQL Server インストールログを使用できますC:\Program Data\Microsoft SQL Server\150\Log。完了すると、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、2 つの FCI Amazon EC2 インスタンスと 1 つのランダム文字列クラスター ID の 3 つの新しいリソースを想定します。

関連リソース

AWS ドキュメント

追加情報

Terraform モジュール情報

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

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

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

このモジュールでは、フェイルオーバークラスタリング仮想 IPs はサポートされていません。仮想 IP を動作させるには、同じサブネットにとどまる必要があります。では AWS、1 つのサブネットを複数のアベイラビリティーゾーンにまたがることはできません。したがって、仮想 IPsます。

各 Amazon EC2 インスタンスには 3 つのプライベート IP アドレスが割り当てられます。それらの usais は次のとおりです。

  • ネットワークトラフィックのプライマリ 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 認証方法を有効にします ( を組織の Windows ドメイン名<domain>に置き換えます)。

    • 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 ギャラリーを次のようにセットアップします。

    • [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 ドキュメントのEC2 Image Builderconsole ウィザードを使用してイメージパイプラインを作成する」の手順に従います。前の前提条件でレシピのコンポーネントを作成するには、次のステップを使用します。

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

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

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

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

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