Glueの開発環境をVPC内に閉じるためSageMaker止めてEC2で構築してみた

Glueの開発にSageMaker使っていたのですが、いくつか自分の使い方では問題があったので自分で立ててみたら簡単でした。

SageMakerはネットワークが特徴的

SageMakerは色々なネットワーク設定があるのですが、VPCと一緒にインターネット出さないで使うとなると、少し面倒です。

いつもは便利なPre-Signed URLも現時点(2019/01/31)では無効化することはできないとサポートから回答もらいました。IAMで制限したりと方法はありますが、それにしても外からアクセスができてしまうのは嫌な場合があります。

このあたりをしっかり理解した上で、

aws.amazon.com

このスライド読めばセキュリティのコントロールはできます。

現場によっては単純にEC2の方が良かったりもします。 ではEC2で使えるZeppelinは?となりますが、これはどうしても使い慣れたJupyer使いたい。

ということで、SageMakerを内部からアクセスする方法模索していたら自分でEC2立ててしまうこともできることに気付きました。

これでEC2ベースで作られたポリシーの現場でも、Glueの開発環境が構築できます。

構成

エンドポイント経由でLivyに接続できるので、そこを使います。

f:id:yomon8:20190130004728p:plain

JupyterとSparkMagicインストール

早速環境構築から。

こちらの記事でLinuxの時のは書いたので、今度はWindows 2019で。

Livy+SparkmagicでWSL上のSparkをWindows側のJupyter notebookから使う - YOMON8.NET

① Anacondaインストール

ここからダウンロードしてクリックするだけ。

www.anaconda.com

② (Anaconda Prompt) widgetsnbextension有効化

>  jupyter nbextension enable --py --sys-prefix widgetsnbextension

③ (Anaconda Prompt) SparkMagicインストール

> pip install sparkmagic

④ (Anaconda Prompt) Glueの開発で利用するカーネルをインストール

> jupyter kernelspec install C:\Anaconda3\Lib\site-packages\sparkmagic\kernels\pysparkkernel

GlueのエンドポイントにSSHトンネル構築

公開鍵の登録

事前に利用する鍵の公開鍵側を開発エンドポイントに登録しておきます。

新規にエンドポイント作成する時に指定することもできますし、作成後に「アクション」>「SSHキーのローテーション」のメニューからも登録することができます。

SSHコマンドでトンネル構築

トンネルを 8998 番ポートに向けて掘ります。左側のリスニングポートは何でもいいですが、特になければ同じ 8998 で良いと思います。

> ssh -i .ssh/id_rsa  -vnNT -L :8998:169.254.76.1:8998 glue@ip-x-x-x-x.ap-northeast-1.compute.internal

トンネル実行できたら、curlコマンドで確認してみます。

> curl http://localhost:8998/sessions
{"from":0,"total":0,"sessions":[]}

Glue上のSparkを実行してみる

問題無く動いています。EC2上で大きな処理が流れるわけではないので、小さめのマシンでも開発用途には十分です。

f:id:yomon8:20190130004920p:plain

構成は自由自在

SSHトンネルを実行しているマシンと、Jupyterを実行するマシンは分けることも可能です。

その場合はJupyter実行するマシンでSparkMagicの宛先を設定する必要があります。

設定ファイルは.sparkmagicのフォルダに置きます。

%USERPROFILE%\.sparkmagic\config.json
~\.sparkmagic\config.json

例えば 10.1.0.1 のサーバーでこんなトンネルをほっていたとしたら、

 ssh -i .ssh/id_rsa  -vnNT -L :7777:169.254.76.1:8998 glue@ip-x-x-x-x.ap-northeast-1.compute.internal

こうやって設定入れます。

{
    "kernel_python_credentials" : {
      "username": "",
      "password": "",
      "url": "http://10.1.0.1:7777",
      "auth": "None"
    }
}