ソースを RDS として RDS for SQL Server にリンクサーバーを作成する方法を教えてください。
Microsoft SQL Server インスタンス用の Amazon Relational Database Service (Amazon RDS) から SQL Server にリンクサーバーを作成したいと考えています。
簡単な説明
Amazon RDS はマネージドサービスなので、ユーザーにはシステム管理者権限がありません。GUI からリンクサーバーを直接作成すると、エラーが発生します。リンクサーバーを作成するには、T-SQL を使用します。
前提条件として、RDS for SQL Server とターゲット SQL Server が接続されている必要があります。
**注:**リンクサーバーのパスワードと構成は、ホストを交換した後もそのまま残ります。
解決策
RDS for SQL Server インスタンスから RDS for SQL Server インスタンスへ
RDS for SQL Server をソース、RDS for SQL Server をターゲットとするリンクサーバーを作成する場合は、DNS 名を使用してください。これにより、ホストの交換やサーバーの変更による IP アドレスの変更を防ぐことができます。
Amazon RDS では、IP アドレスは動的で、エンドポイントは静的です。そのため、エンドポイントを使用してインスタンスに接続するのがベストプラクティスです。すべての Amazon RDS インスタンスにはエンドポイントがあります。次のパラメータを参照してください。
- @server: リンクされたサーバー名。
- @datasrc: RDS エンドポイント名。Amazon Elastic Compute Cloud (Amazon EC2) のオンプレミスインスタンスの場合は、EC2 オンプレミスの IP アドレスまたは DNS 名。
- @rmtuser: ターゲットデータベースにアクセスできるログイン名。
- @rmtpassword: ログイン名のパスワード。
RDS for SQL Server インスタンスに接続する
マスターログインを使用してインスタンスに接続し、次のコマンドを実行します。IP アドレスではなく、必ずエンドポイントを使用してください。RDS インスタンスの IP アドレスは、ホストの交換中に変更されることがあります。
EXEC master .dbo.sp_addlinkedserver @server = N'LinkedServerRDSSQL', @srvproduct= N'', @provider= N'SQLNCLI', @datasrc= N'SQL-2019.ckeixtynaaaj.us-east-1.rds.amazonaws.com' go EXEC master .dbo.sp_addlinkedsrvlogin @rmtsrvname=N'LinkedServerRDSSQL' ,@useself=N'False' ,@locallogin=NULL,@rmtuser =N'linkedserverloginname',@rmtpassword='YourStrongPassword' go
リンクサーバーのテスト
- Microsoft SQL Server Management Studio (SSMS) で RDS インスタンスに接続します。
- [表示] メニューで、[オブジェクトエクスプローラー] を選択します。
- [サーバーオブジェクト] 、[リンクサーバー] を選択します。
- サーバー名を右クリックし、[接続をテスト] を選択します。
リンクサーバーへのクエリ
次のクエリを実行します。
select * from [LinkedServerName].[Databasename].[schemaname].[tablename]
RDS for SQL Server インスタンスから EC2 SQL Server インスタンスまたはオンプレミス SQL Server へ
リンクサーバーの作成
EC2 インスタンス上の SQL Server またはオンプレミス SQL サーバーのソースとして RDS for SQL Server を使用してリンクサーバーを作成します。
リモートサーバーの IP アドレスを使用してリンクサーバーを作成するには、以下のコマンドを実行します。
EXEC master .dbo.sp_addlinkedserver @server = N'LinkedServerRDSSQL', @srvproduct= N'', @provider= N'SQLNCLI', @datasrc= N'10.0.0.152' Go EXEC master .dbo.sp_addlinkedsrvlogin @rmtsrvname=N'LinkedServerRDSSQL' ,@useself=N'False' ,@locallogin=NULL,@rmtuser =N'linkedserverloginname',@rmtpassword='YourStrongPassword' Go
リモートサーバーの DNS 名を使用してリンクサーバーを作成するには、以下のコマンドを実行します。
EXEC master .dbo.sp_addlinkedserver @server = N'LinkedServerRDSSQL', @srvproduct= N'', @provider= N'SQLNCLI', @datasrc= N'ServerName.datacenter.mycompany.com' Go EXEC master .dbo.sp_addlinkedsrvlogin @rmtsrvname=N'LinkedServerRDSSQL' ,@useself=N'False' ,@locallogin=NULL,@rmtuser =N'linkedserverloginname',@rmtpassword='YourStrongPassword' go
リンクサーバーのテスト
- Microsoft SQL Server Management Studio (SSMS) で RDS インスタンスに接続します。
- [表示] メニューで、[オブジェクトエクスプローラー] を選択します。
- [サーバーオブジェクト] 、[リンクサーバー] を選択します。
- サーバー名を右クリックし、[接続をテスト] を選択します。
リンクサーバーへのクエリ
次のクエリを実行します。
select * from [LinkedServerName].[Databasename].[schemaname].[tablename]
Microsoft Windows 認証を使用してリンクサーバーを設定する
**注:**Windows 認証を使用して RDS for SQL Server から EC2 インスタンスまたは オンプレミスの SQL サーバーにリンクサーバーを構成することはできません。
前提条件
- ドメインを作成し、AWS Managed Microsoft AD に参加させる必要があります。
- ソース EC2 SQL Server インスタンスとターゲット RDS SQL Server が接続されている必要があります。
Windows 認証を使用して、EC2 またはオンプレミスの SQL サーバーから RDS for SQL Server にリンクサーバーを構成する
- ドメインログインでログインし、次のクエリを実行してリンクサーバーを作成します。
USE [master] GO EXEC sp_addlinkedserver @server=N'LinkedServerToRDSInstance',@srvproduct=N'',@provider=N'SQLNCLI',@datasrc=N'EndpointName'; GO EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LinkedServerToRDSInstance', @locallogin = NULL , @useself = N'True' GO
リンクサーバーのテスト
- Microsoft SQL Server Management Studio (SSMS) で RDS インスタンスに接続します。
- [表示] メニューで、[オブジェクトエクスプローラー] を選択します。
- [サーバーオブジェクト] 、[リンクサーバー] を選択します。
- サーバー名を右クリックし、[接続をテスト] を選択します。
リンクサーバーへのクエリ
次のクエリを実行します。
select * from [LinkedServerName].[Databasename].[schemaname].[tablename]
トラブルシューティング
クライアントから接続すると、次のエラーメッセージが表示されることがあります。
Msg 18456, Level 14, State 1, Line 21 Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'
このエラーは「ダブルホップ」から発生します。ダブルホップは、1 台のコンピューターを別のコンピューターに接続して 3 台目のコンピューターに接続するときに発生します。ダブルホップは、次のシナリオで発生する可能性があります。
- AWS Managed AD がクライアントと EC2 インスタンス間の認証を処理するためのサービスプリンシパル名設定 (SPN) がありません。
- リンクサーバーが RDS インスタンスエンドポイントなどのドメイン以外のエンドポイントで設定されています。EC2 と RDS の認証方法が両方とも KERBEROS である必要があります。
この問題を解決するには、次のステップを実行してください。
認証方法を確認して、RDS と EC2 の両方に接続するときに KERBEROS が選択されていることを確認します
クライアントからのドメインログインを使用して次のクエリを実行します。
select @@servername as ServerName, session_id,net_transport, auth_scheme from sys.dm_exec_connections where session_id= @@spid;
ドメインの一部である SQL Server サービスアカウントの SPN を修正します
- [Active Directory ユーザーとコンピューター] で、[example.com] 、[例 (ドメイン名)]、[ユーザー] を選択します。
- プロパティを表示するには、YourServiceAccount を右クリックします。
- [委任] タブで、[任意のサービスへの委任についてこのユーザーを信頼する (Kerberosのみ)] を選択し、[OK] を選択します。
- EC2 インスタンスまたはオンプレミス SQL Server で SQL Server サービスを再起動します。
- 以下のコマンド例に示すように、サービスアカウントの SPN を追加します。例を自身のドメイン名に置き換えてください。ServiceAccountName と EC2Name ドメインを、ご使用のドメインの正しい値に置き換えてください。
setspn -A MSSQLSvc/Ec2name.domain.com example\ServiceAccountName setspn -A MSSQLSvc/Ec2name.domain.com:1433 example\ServiceAccountName
新しく作成された SPN を確認するには、以下のコマンドを実行します。
setspn -l example\ServiceAccountName
RDS example.com エンドポイントを使用してリンクサーバーを再作成します
-
サーバー名を取得するには、RDS for SQL Server で次のクエリを実行します。
select @@servername as ServerName, session_id,net_transport, auth_scheme from sys.dm_exec_connections where session_id= @@spid;
-
上記のコマンドの出力で、サーバー名の列をチェックして SPN を確認します。
setspn -l YourServerName
-
出力には、次の例に示すように、RDS インスタンスに登録されている ServicePrincipalNames も表示されます。
MSSQLSvc/ YourServerName.example.com:1433
-
ドメインログインを使用してリンクサーバーを再作成するには、次のコマンドを実行します。データソースは、ステップ 2 でコマンド出力から取得したものと同じです。
USE [master] GO EXEC sp_addlinkedserver @server=N'LinkedServerToRDSInstance',@srvproduct=N'',@provider=N'SQLNCLI',@datasrc=N'YourServerName.example,com'; GO EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LinkedServerToRDSInstance', @locallogin = NULL , @useself = N'True' GO
クライアントからの接続をテストします。
異種のリンクサーバーの場合は、RDS Custom for SQL Server を使用できます。
関連情報
関連するコンテンツ
- 質問済み 12日前lg...
- 質問済み 6年前lg...
- 質問済み 2ヶ月前lg...
- 質問済み 10ヶ月前lg...
- AWS公式更新しました 2年前
- AWS公式更新しました 7ヶ月前
- AWS公式更新しました 2年前