SageMakerから異なるAWSアカウント上のRDSに接続する

概要

SageMakerを利用していて、「異なるAWSアカウント上のRDSと接続したい」といったこともあるかと思います。
今回は、このようなことを実現するためにハマったポイントをまとめておこうと思います。
最終的な構成図は下記の通りです。

「Account-α」に用意したSageMakerノートブックインスタンスから「Account-β」上のRDSにアクセスさせたい、というだけなのでとてもシンプルな構成です。
最初は、「SageMakerをVPC内に用意」して、「RDSが格納されているVPCとVPCピアリングする」だけで問題ないかと思っていたのですが、うまく繋がらずに少しハマってしまいました...。

ちょっと調べてみると、こちらに記述のある通り、SageMakerでVPCピアリングをするためには「route add」処理を実施する必要があるようで、この処理を実施したらちゃんと繋がるようになりました。
(同一VPC上でのEC2→RDSは疎通できるものの、SageMakerの場合は上記の設定が必要、ということです)

以下、今回の手順を詳解していきます。

対応方法の概要

最初に紹介した構成図を実現するために必要な手順は下記の通りです。
(なお、RDS側(構成図における「Account-β」)は既に構築済み、という前提で進めます。)

  • 1.VPC内にSageMakerノートブックインスタンスを用意する
  • 2.VPCピアリングとルートテーブルの修正
  • 3.SageMakerのライフサイクル設定

「1」、「2」については通常のVPCピアリングの手順ですが、SageMakerで実施する場合は「3」の手順が必要となる、というものです。
そして「3」の手順については上記で書いている通り、「route add」処理を実行させる、というものです。

手順の詳解

1.VPC内にSageMakerノートブックインスタンスを用意する

「Account-α」側の環境を構築します。
具体的には、下記のリソースを作成します。

  • VPC、サブネット、セキュリティグループ
  • SageMaker用IAMロール
  • SageMakerノートブックインスタンス

VPC

サブネット

セキュリティグループは、デフォルトで作成されるセキュリティグループの名前だけを「yoshim-20190703」と変更して利用しました。
続いて、SageMakerノートブックインスタンスに付与するIAMロールを作成します。
SageMakerにやって欲しいことは下記の通りなので、これらの実行が可能となるIAMロールを付与してください。

  • 1.SageMakerの操作
  • 2.rdsからデータを抽出する
  • 3.S3にアクセスする
  • 4.AWS Systems Manager parametor storeからRDSの認証情報を取得する(オプション)

ちなみに、もし「4.ssm parametor storeからRDSの認証情報を取得する」が必要な場合は、下記のようなIAMポリシーを作成してあげれば大丈夫です。
(必要であれば、「Resource」の部分を絞り込んでください)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameters",
                "secretsmanager:GetSecretValue"
            ],
            "Resource": "*"
        }
    ]
}

続いて、このVPC・サブネット上にSageMakerノートブックインスタンスを作成します。
下記のように、ネットワーク情報や対象のIAMロールを指定して作成すればOKです。

2.VPCピアリングとルートテーブルの修正

「Account-α」、「Account-β」を接続しているVPCピアリングを作成します。
こちらも対して手間はかかりません。

  • VPCピアリング申請(Account-α)
  • VPCピアリング承認(Account-β)

下記のように「Account-α」側から「Account-β」へピアリング申請を送ります。
リクエストを送る際は、送信先の「AWSアカウントID」と「VPC-ID」が必要となります。

リクエストを受ける側(Account-β)のVPC画面に行くと、下記のように「承諾の保留中」となっているものがあるので、このピアリングを指定した上で「リクエストの承諾」をします。

VPCピアリングが開通したら、あとはそれぞれのサブネットに適用しているルートテーブルにVPCピアリングを反映させる必要があります。
これは、「Account-α」、「Account-β」の両アカウントで修正する必要があります。

また、SageMakerノートブックインスタンス・RDSに付与されている「セキュリティグループ」や「NACL」の設定も必要です。
今回はRDSに付与されているセキュリティグループを下記のように修正しました。
(Account-αのVPCからの接続を通す)

もし、「Account-α上のEC2からAccoun-β上のRDSに接続」するだけであればここまでの手順で接続できるのですが、SageMakerの場合は追加で「3.SageMakerのライフサイクル設定」が必要です。

3.SageMakerのライフサイクル設定

今回私がハマったのはこの部分です。
詳細はこちらに記述のある通りですが、SageMakerノートブックインスタンス上で「Account-βのVPCのCIDR範囲へのアクセス時に、SageMakerノートブックインスタンスが格納されているVPCのVPCルーティングIPアドレスを介する」ように指定します。

 sudo ip route add (Account-βのピアリング先VPCのCIDR範囲) via (SageMakerノートブックインスタンスを格納しているVPCのVPCルーティングIPアドレス) dev eth2

今回の場合は、下記のようなコマンドを実行する必要があります。  sudo ip route add 10.2.0.0/16 via 10.1.0.1 dev eth2 

「VPCルーティングIPアドレス」は作成したVPCサブネットのCIDR範囲によってIPアドレスが自動的に決定されます。
今回SageMakerノートブックインスタンスを作成したVPCのCIDR範囲は「10.1.0.0/16」だったので、「10.1.0.1」となりますが、もし「192.168.0.0/16」だった場合は「192.168.0.1」サブネットのCIDR範囲は「10.1.0.0/24」だったので「10.1.0.1」となりますが、もし「192.168.0.0/24」だった場合は「192.168.0.1」になります。

10.0.0.1: VPC ルーター用に AWS で予約されています。

VPC とサブネット

上記の「route add」コマンドを毎回手入力で実行するのは手間なので、「ライフサイクル設定」でSageMakerノートブックインスタンス起動時に自動で実行するように設定しましょう。
ここまでくれば、SageMakerからRDSに接続できる状態となります。

おまけ

今回の話の本筋から少し外れてしまうので言及するにとどめますが、「SageMakerからRDSにアクセスする際の認証情報をどこで管理するか」、についても少し検討してもいいかもしれません。
今回私が作業した際には、「AWS Systems Manager」の「パラメータストア」に暗号化した状態で認証情報を格納し、SageMakerからこれにアクセスする形で認証情報を取得しました。
こちらの手順については、こちらのブログをご参照ください。

まとめ

SageMakerでVPCピアリングをする際にハマったポイントについてのご紹介でした。
もし同じようなことをする方の参考になれば幸いです。