Amazon SageMaker実運用: NAT GatewayでNotebookの接続元IPアドレスを固定する

Amazon SageMakerを使っていてNotebookインスタンスから以下を行いたくなったので構成を考えてみた。

  • Notebookインスタンスから外部システムにアクセスしたい
    • 対象のシステムはアクセス制限を行なっており接続元IPアドレスを固定したい
  • NotebookインスタンスマネージドNFSサービスであるAmazon EFSをマウントしたい
    • VPC内のインスタンスからはマウントできるよう設定済み

解答

AWS Machine Learning Blogに正解が書いてあった。

構成

上記を踏まえて以下のような構成を考えた。

Notebookインスタンス

前提として人間がNotebookを使用する方法は当然ながらWeb UIを使う。

NotebookインスタンスからのVPC内/外部アクセス

後述するようにNotebook作成時にVPCとPrivate Subnetを紐づける。
すると指定したPrivate Subnet内にNICが作成され、NotebookインスタンスからVPC内にアクセスできるようになる。
NAT Gatewayを配置しているので、NAT GatewayにattachしたEIPアドレスを接続元として外部にアクセスできるようになる。
ちなみにPublic SubnetからNAT Gatewayへのrouteは動作しない(?)ので、Private Subnetを紐づける必要がある。

おそらくNotebookインスタンス自体は専用の不可視VPC内で起動されている。
(No VPC 設定でNotebookインスタンスを起動してもNICが2つ存在する,VPCを紐づけるとNICがもう1つ増える)

なお接続対象の外部システムについてこの記事では触れないが、以下のような外部システムを想定している。

  • 接続元IPアドレスによるアクセス制限を行なっている
  • HTTPSとSSH両方で接続したい

NotebookインスタンスからのEFSボリュームマウント

Private SubnetにNICが作成されているのでEFSボリュームにも問題なくアクセスできる。
Web UIからTerminal(こちらもWeb UI)を開いて sudo mount ~ 等実行することもできる。
しかし Lifecycle configuration なる便利機能が追加されており、スクリプトを指定するとある程度自動化できる。

その他GPUインスタンス他

既存のいわゆるAIプロジェクトで使うことを想定しているためGPUインスタンス等がある。
以下に少し情報がある。

ELBとWebインスタンス

機械学習Jobの結果をWebから閲覧したいことがあるのでシンプルなWebサーバーを立てる。
ELBをPublic Subnetに、Webサーバー用のEC2インスタンスを同じAZのPrivate Subnet上に立てて追加してしまうのがAI R&Dエンジニアにとって楽そう。

SSH接続について

最初にSSHログインする踏み台ホストのIPアドレスは固定したいのでインスタンスにEIPを振る。
可用性を考えるとAZごとに配置すると安全。
万が一AZがダウンした場合は手動でログインし直すことにする。
ファイルはEFSに置いておけばそれほど困らない想定。

Notebookインスタンス作成方法

以前より細かく設定できるようになっている。ありがたい。

2018.03に書いた記事からの差分は以下。

  • VPC
    • 今回はVPCを選択する
  • Subnet(s)
    • 現時点ではSubnetが1つ指定できる
    • 表示されたSubnetからPrivate Subnetを選ぶ
  • Security group(s)
    • 必要なSecurity Groupを選ぶ
    • こちらは複数選択できる
  • Direct internet access
    • NATでインターネットアクセスするので Disable を選ぶ
  • Lifecycle configuration
    • Notebookインスタンスの作成/起動時にスクリプトを実行できるようになっていた、便利
    • (たぶん)次の記事で書く => 書いた

ということでSageMakerの進歩のおかげで希望に近い構成が作れそうな予感がしてきた。