ソースに RDS を指定しながら、RDS for SQL Server 内にリンクサーバーを作成する方法を教えてください。

最終更新日: 2022 年 10 月 3 日

Microsoft SQL Server インスタンス用の Amazon Relational Database Service (Amazon RDS) から SQL Server に向かう、リンクサーバーを作成したいと思います。これを行うにはどうすればよいですか?

簡単な説明

Amazon RDS はマネージドサービスなので、そのユーザーにはシステム管理者のアクセス権限がありません。GUI から直接リンクサーバーを作成した場合には、エラーが発生します。リンクサーバーを作成するには、T-SQL を使用します。SQL Server のみがターゲットとしてサポートされます。

前提条件

RDS for SQL Server とターゲット SQL Server 間を接続できる必要があります。

注: リンクサーバーのパスワードと設定は、ホストの交換後もそのまま維持されます。

解決方法

RDS for SQL Server インスタンスから RDS for SQL Server へ

RDS for SQL Server をソースとし、RDS for SQL Server をターゲットとするリンクサーバーを作成する場合は、DNS 名を使用するのがベストプラクティスです。DNS 名を使用すると、ホストの交換やサーバーの差し替えによる IP アドレスの変更を回避できます。

Amazon RDS では、IP アドレスは動的ですがエンドポイントは静的です。このため、エンドポイントを使用してインスタンスに接続するのがベストプラクティスとなります。エンドポイントは、すべての Amazon RDS インスタンスにあります。

パラメータ:

  • @server: リンクサーバーの名前。
  • @datasrc: 使用している RDS のエンドポイント名。オンプレミスの Amazon Elastic Compute Cloud (Amazon EC2) インスタンスの場合は、オンプレミスの EC2 IP アドレスまたは DNS 名。
  • @rmtuser: ターゲットのデータベースにアクセスするためのログイン名。
  • @rmtpassword: 上記のログイン名用パスワード。

ステップ 1: 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

ステップ 2: リンクサーバーをテストする

1.    Microsoft SQL Server Management Studio (SSMS) により、RDS インスタンスに接続します

2.    [View] (表示) メニューで、[Object Explorer] (オブジェクトエクスプローラ) を選択します。

3.    [Server Objects] (サーバーオブジェクト)、[Linked Servers] (リンクサーバー) の順に選択します。

4.    サーバー名を右クリックして、[Test the connection] (接続をテスト) を選択します。

ステップ 3: リンクサーバーをクエリする

次のクエリを実行します。

select * from [LinkedServerName].[Databasename].[schemaname].[tablename]

RDS for SQL Server インスタンスから、EC2 SQL Server インスタンスまたはオンプレミスの SQL サーバーへ

ステップ 1: リンクサーバーを作成する

RDS for SQL Server をソースとして使用して、EC2 インスタンス上の SQL Server またはオンプレミスの 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

ステップ 2: リンクサーバーをテストする

1.    Microsoft SQL Server Management Studio (SSMS) により、RDS インスタンスに接続します

2.    [View] (表示) メニューで、[Object Explorer] (オブジェクトエクスプローラ) を選択します。

3.    [Server Objects] (サーバーオブジェクト)、[Linked Servers] (リンクサーバー) の順に選択します。

4.    サーバー名を右クリックして、[Test the connection] (接続をテスト) を選択します。

ステップ 3: リンクサーバーをクエリする

次のクエリを実行します。

select * from [LinkedServerName].[Databasename].[schemaname].[tablename]

Microsoft Windows 認証を使用してリンクサーバーを設定する

注: RDS for SQL Server から EC2 インスタンスまたはオンプレミス SQL Server に向かうリンクサーバーを、Windows 認証を試用して設定することはサポートされていません。

前提条件

  • ドメインを作成して AWS Managed Microsoft AD に参加させる必要があります。
  • ソースの EC2 SQL Server インスタンスとターゲットの RDS SQL Server 間に接続が必要です。

ステップ 1: EC2 またはオンプレミスの SQL Server から RDS for SQL Server に向かうリンクサーバーを、Windows 認証を使用して設定する

1.    ドメインログインを使用してログインし、次のクエリを実行してリンクサーバーを作成します。

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

ステップ 2: リンクサーバーをテストする

1.    Microsoft SQL Server Management Studio (SSMS) により、RDS インスタンスに接続します

2.    [View] (表示) メニューで、[Object Explorer] (オブジェクトエクスプローラ) を選択します。

3.    [Server Objects] (サーバーオブジェクト)、[Linked Servers] (リンクサーバー) の順に選択します。

4.    サーバー名を右クリックして、[Test the connection] (接続をテスト) を選択します。

ステップ 3: リンクサーバーをクエリする

次のクエリを実行します。

select * from [LinkedServerName].[Databasename].[schemaname].[tablename]

トラブルシューティング

クライアントからの接続時に、次のエラーメッセージが表示されることがあります。

Msg 18456, Level 14, State 1, Line 21
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'

このエラーは「ダブルホップ」が原因です。ダブルホップは、1 台のコンピューターが他のコンピューターに接続することで、さらに次のコンピューターに接続しようとする場合に発生します。ダブルホップは、以下のようなシナリオで発生する可能性があります。

  • AWS Managed AD がクライアントと EC2 インスタンス間の認証を処理するために使用する、サービスプリンシパル名 (SPN) の設定が存在しない。
  • リンクサーバーが、ドメイン (RDS インスタンスのエンドポイントなど) 以外のエンドポイントを使用するように設定されている。EC2 と RDS の両方で、認証方法に KERBEROS を使用する必要があります。

問題を解決するには、次の操作を実行します。

ステップ 1:認証方法をチェックして、RDS と EC2 の両方への接続用に、KERBEROS が選択されていることを確認します

クライアントのドメインログインを使用して、次のクエリを実行します。

select @@servername as ServerName, session_id,net_transport, auth_scheme from sys.dm_exec_connections where session_id= @@spid;

ステップ 2: ドメインの一部である SQL Server サービスアカウントの SPN を修正する

1.    Active Directory の [Users and Computers] (ユーザーとコンピューター) で、[YourDomain.com][ YourDomain][Users] の順に選択します。

2.    [YourServiceAccount] を右クリックしてプロパティを表示します。

3.    [Delegation] (委任) タブで、[Trust this user for delegation to any service (Kerberos only)] (すべてのサービス (Kerberos のみ) への委任でこのユーザーを信頼する) を選択し、次に [OK] を選択します。

4.    EC2 インスタンスまたはオンプレミスの SQL Server で SQL Server サービスを再起動します。

5.     次に示すコマンド例のように、サービスアカウントの SPN を追加します。YourDomainName\ServiceAccountNameEC2Name ドメインは、ご使用のドメインに合わせて適切な値に置き換えます。

setspn -A MSSQLSvc/Ec2name.domain.com YourDomainName\ServiceAccountName
setspn -A MSSQLSvc/Ec2name.domain.com:1433 YourDomainName\ServiceAccountName

6.    次のコマンドを実行して、新しく作成された SPN を確認します。

setspn -l YourDomainName\ServiceAccountName

ステップ 3: RDS の YourDomain.com エンドポイントを使用してリンクサーバーを再作成する

1.    RDS for SQL Server で次のクエリを実行して、サーバー名を取得します。

select @@servername as ServerName, session_id,net_transport, auth_scheme from sys.dm_exec_connections where session_id= @@spid;

2.    次の例に示すように、前出のコマンド出力でサーバー名の列をチェックし、SPN を確認します。

setspn -l YourServerName

また、前出のコマンド出力では次の例のように、RDS インスタンスに登録済みの ServicePrincipalNames も表示されます。

MSSQLSvc/ YourServerName.yourdomainname.com:1433

3.    次のコマンドを実行して、ドメインログインを使用するリンクサーバーを再作成します。データソースは、ステップ 2 でコマンド出力から取得したものを使用します。

USE [master]
GO
EXEC sp_addlinkedserver    @server=N'LinkedServerToRDSInstance',@srvproduct=N'',@provider=N'SQLNCLI',@datasrc=N'YourServerName.YourDomainnanme,com';
GO
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LinkedServerToRDSInstance', @locallogin = NULL , @useself = N'True'
GO

4.    クライアントから接続をテストします。

注: 現在、SQL Server のターゲットとしては、1 つのリンクサーバーがサポートされます。これは、Amazon RDS がマネージド型サービスであるのが理由です。ユーザーには、追加の ODBC をインストールしたり、Oracle、MYSQL、PostgreSQL などの各種データベースサーバーに接続するために必要なドライバーをインストールしたりするための、OS へのアクセス権は付与されません。

異種間リンクサーバーの場合は、RDS Custom for SQL Server を使用できます。


Implement linked servers with Amazon RDS for Microsoft SQL Server (Amazon RDS for Microsoft SQL Server を使用してリンクサーバーを実装する)

この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?