Amazon EC2 インスタンスを踏み台ホストとして使用して、ローカルマシンからプライベート Amazon RDS DB インスタンスに接続するにはどうすればよいですか?

所要時間3分
0

Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを踏み台 (ジャンプ) ホストとして使用したいと考えています。次に、そのインスタンスを使用して、ローカルマシンからプライベート Amazon Relational Database Service (Amazon RDS) DB インスタンスに接続したいと考えています。

簡単な説明

Amazon EC2 インスタンスをジャンプサーバーとして使用して、ローカルマシンからプライベート Amazon RDS DB インスタンスに接続するには、次のステップを実行します。

1.    EC2 インスタンスを起動して設定し、インスタンスのネットワーク設定を行います。

2.    RDS DB インスタンスのセキュリティグループを設定します。

3.    ローカルマシンから RDS DB インスタンスに接続します。

重要: プライベート Amazon RDS または Amazon Aurora DB インスタンスに接続するには、VPN または AWS Direct Connectを使用するのがベストプラクティスです。これらのオプションを使用できない場合は、踏み台ホストを使用してください。次の設定例では、セキュリティグループを使用してアクセスを制限しています。ただし、サブネットのネットワークアクセスコントロールリスト (ネットワーク ACL) を制限して、接続のセキュリティを強化することもできます。また、0.0.0.0/0 ではなく、より小さい範囲を使用するようにインターネットゲートウェイのルートスコープを制限することも可能です。例えば、インターネットゲートウェイを追加する場合、送信先のルーティングテーブルに必要な CIDR 範囲のみを追加します。詳細については、ルーティングオプションの例を参照してください。

解決方法

以下の設定例は、Amazon Virtual Private Cloud (Amazon VPC) にある Amazon RDS for MySQL インスタンスの設定例です。インスタンスには EC2 インスタンス用のセキュリティグループが設定されています。

EC2 インスタンスを起動して設定する

1.    Amazon EC2 コンソールを開いて、[Launch instance] (インスタンスの起動) を選択します。

2.    Amazon マシンイメージ (AMI) を選択します。

3.    インスタンスタイプを選択してから、[次のステップ: インスタンスの詳細の設定] を選択します。

4.    [ネットワーク] には、RDS DB インスタンスが使用する VPC を選択します。

5.    [サブネット] には、ルーティングテーブルにインターネットゲートウェイがあるサブネットを選択します。インターネットゲートウェイがまだない場合は、EC2 インスタンスの作成後にサブネットに追加できます。

6.    [パブリック IP の自動割り当て] で、 [有効] が選択されていることを確認します。

7.    [次のステップ: ストレージの追加] を選択し、必要に応じてストレージを変更します。

8.    [次のステップ: タグの追加] を選択し、必要に応じてタグを追加します。

9.    [Next: Configure Security Group] (次のステップ: セキュリティグループの設定) を選択し、[Add Rule] (ルールの追加) を選択して以下を入力します。 タイプ:****カスタム TCP ルールを入力します。 **プロトコル:**TCP と入力します。 **ポート範囲:**22 と入力します。 **ソース:**ローカルマシンの IP アドレスを入力します。デフォルトでは、送信元 IP アドレスは誰でも利用できますが、ローカルパブリック IP アドレスへのアクセスを制限できます。

10.    [Review and Launch] (確認して起動) を選択します。

11.    [作成] を選択します。

RDS DB インスタンスのセキュリティグループを設定する

注意: 1 つ以上の EC2 インスタンスを RDS データベースに自動的に接続するには、「Automatically connect an EC2 instance to an RDS database」(EC2 インスタンスを RDS データベースに自動的に接続する) を参照してください。

1.    Amazon RDS コンソールを開き、ナビゲーションペインから [Databases] (データベース) を選択します。

2.    RDS DB インスタンスの名前を選択します。または、インスタンスが作成されていない場合は、RDS DB インスタンスを作成します。

3.    [Connectivity & security] (接続とセキュリティ) タブを選択します。

4.    [Security] (セキュリティ) セクションで、[VPC security groups] (VPC セキュリティグループ) の下にあるリンクを選択します。

5.    セキュリティグループを選択し、[アクション] を選択してから [インバウンドのルールの編集] を選択します。

6.    [Add rule] (ルールを追加) を選択してから、以下を入力します。 タイプ:****カスタム TCP ルールを入力します。 **プロトコル:**TCP と入力します。 **ポート範囲:**RDS DB インスタンスのポートを入力します。 **ソース:**EC2 インスタンスのプライベート IP アドレスを入力します。

7.    [Save (保存)] を選択します。

このセキュリティグループ設定により、EC2 インスタンスのプライベート IP アドレスからのトラフィックが許可されます。EC2 インスタンスと RDS DB インスタンスが同じ VPC を使用する場合、RDS DB インスタンスのルートテーブルを変更する必要はありません。VPC が異なる場合は、VPC ピアリング接続を作成してこれらの VPC 間における接続を許可します。

注意:よりスケーラブルなソリューションを使用する場合は注意が必要です。例えば、セキュリティグループルールでセキュリティグループ ID を使用する場合は、1 つのインスタンスへのアクセスが制限されていないことを確認してください。代わりに、特定のセキュリティグループ ID を使用するすべてのリソースへのアクセスを制限するようにルールを設定します。

ローカルマシンから RDS DB インスタンスに接続する

RDS DB インスタンスに接続するステップは、使用するクライアントに応じて異なります。詳細については、Amazon RDS DB インスタンスへの接続を参照してください。MySQL を使用する場合は、クライアントアプリケーションと Amazon RDS 間の接続の暗号化に SSL を使用することがベストプラクティスです。

次の例では、MySQL Workbench クライアントを使用して踏み台ホストに接続します。

1.    新しい接続を開始し、[Connection Method] で [Standard TCP/IP over SSH] を選択します。

2.    SSH 設定について EC2 インスタンスに関する次の詳細情報を入力します。 パブリック IP の自動割り当て:****DNS ホスト名オプションで [有効] が選択されていることを確認します。 **SSH ホスト名:**EC2 インスタンスのパブリック DNS 名またはそのパブリック IP アドレスを入力します。 [SSH Username] (SSH ユーザー名): EC2 インスタンスのユーザー名を入力します。例えば、ec2-user は EC2 Linux マシンのユーザー名です。 **SSH キーファイル:**EC2 インスタンスを作成したときに使用したプライベートキーを選択します。 **注:**パブリック IP アドレスで起動された EC2 インスタンスは、作成された VPC で DNS ホスト名がアクティブ化されている場合、パブリック DNS になります。

3.    MySQL インスタンスの設定について以下の詳細情報を入力します。 **MySQL ホスト名:**RDS DB インスタンスのエンドポイントを入力します。 **MySQL サーバーのポート:**3306 と入力します。または、カスタムポートを使用する場合は、カスタムポート番号を入力します。 **ユーザー名:**RDS DB インスタンスのユーザー名を入力します。 **パスワード:**RDS DB インスタンスのパスワードを入力します。

4.    [Test Connection] (接続をテスト) を選択します。

5.    正常に接続できたら、接続名を入力し、接続を保存します。

SSH トンネルを使用してローカル MySQL クライアントからプライベート RDS インスタンスに接続するには、次のコマンドを参照してください。

Linux または macOS:

1.    SSH トンネルを設定するには、次のコマンドを実行します。

ssh -i "YOUR_EC2_KEY" -L LOCAL_PORT:RDS_ENDPOINT:REMOTE_PORT EC2_USER@EC2_HOST -N -f

**注:**YOUR_EC2_KEYLOCAL_PORTRDS_ENDPOINTREMOTE_PORTEC2_USER、および EC2_HOST を関連する情報に置き換えてください。

前述のコマンドでカスタムフィールドを入力すると、コマンドは次の例のようになります。

ssh -i "ec2Key.pem" -L 3336:rdsinstance.xxx.xxx.rds.amazonaws.com:3306 ec2-user@ec2-34-244-136-223.xxxcompute.amazonaws.com -N -f

2.    トンネルがローカルポートでリッスンしていることを確認するには、次のコマンドを実行します。

lsof -i4 -P | grep -i "listen" | grep LOCAL_PORT
nc -zv 127.0.0.1 LOCAL_PORT

注: LOCAL_PORT はローカルポートの番号に置き換えてください。

3.    トンネルがローカルポートで正常にリッスンすると、次のような出力が表示されます。

lsof -i4 -P | grep -i "listen" | grep 3336
ssh       17692 user    8u  IPv4 0x3bc46bcfeffce12f      0t0  TCP localhost:3336 (LISTEN)

nc -zv 127.0.0.1 3336
Connection to 127.0.0.1 port 3336 [tcp/directv-tick] succeeded!

4.    次のコマンドを実行し、EC2 インスタンスを踏み台ホストとして使用して、ローカルマシンから RDS インスタンスに接続します。

mysql -h 127.0.0.1 -P LOCAL_PORT -u RDS_USER -p

注: LOCAL_PORT はローカルポートの番号に、DB_USER は RDS DB ユーザー名に置き換えてください。


関連情報

Amazon RDS DB インスタンスに接続するときの問題を解決するにはどうすればよいでしょうか。

コメントはありません