こんにちは!インサイトテクノロジーの松尾です。
本投稿では、AWS Glue ジョブで Python を使って ssh 接続する方法を紹介します。ssh 接続には paramiko を使用します。
はじめに
Glue ジョブから外部のサービスなどに処理を投げるときに REST API を呼ぶこともあると思いますが、今回、他の EC2 で処理をさせたいケースがあり、ssh 接続でコマンドをキックする必要性が生じました。
そこで、本投稿では、paramiko を使って AWS Glue の Python シェルから ssh 接続してコマンドを実行する方法を紹介します。
Glue での paramiko の利用の設定
Glue の実行環境には paramiko が既定でセットアップされているわけではないため、独自に追加してあげる必要があります。AWS ドキュメントによると簡単に指定できそうです。
--additional-python-modules パラメータでコンマ区切りの Python モジュールのリストを指定することで、新しいモジュールを追加したり、既存のモジュールのバージョンを変更したりできます
そこで以下のように指定することで、paramiko が使用できるようになります。
サンプルコード
では、さっそく適当な EC2 に接続できることを確認してみましょう。
例えば以下のようなコードを実行します。
# ----------------------------------------------------------
IP_ADDRESS = 'xx.xx.xx.xx'
USERNAME = 'xxxxxxx'
PASSWORD = 'xxxxxxx'
CMD = 'uname -a'
# ----------------------------------------------------------
import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.WarningPolicy())
client.connect(IP_ADDRESS, username=USERNAME, password=PASSWORD)
stdin, stdout, stderr = client.exec_command(CMD)
for line in stdout:
print(line)
client.close()
del client, stdin, stdout, stderr
例えば Cloudwatch logs に出力できるようにしておくと uname -a
の結果が Cloudwatch logs へ出力されることが確認できます(キャプチャの一番下の行)。
Linux ip-172-31-35-80.ap-northeast-1.compute.internal 6.1.56-82.125.amzn2023.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Oct 10 17:03:53 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
※CloudWatch Logs には paramiko のインストールの情報も出力されてました。
なお本来は、上記のように接続先、ユーザー名、パスワードなどの情報をハードコードするのは適切ではありません。ここでは ssh 接続できることを確認することが目的のため、そのあたりは気にしないことにします。
また、EC2 に接続する際にはおそらく同じ VPC で稼働させるのが一般的だと思います。今回はそこもいったん無視し、グローバル IP で接続して実験しています。
※いずれ VPC 内で処理するのも試してみたいところではあります
おわりに
AWS Glue ジョブの Python シェルで paramiko を使って ssh 接続する手順を紹介しました。REST API を利用できない場合でも、サーバーに ssh 接続は可能、というケースはゼロではないと思います。同様に scp も行えますので、scp で送って、ssh で処理して、scp で取得する、みたいな使い方もできるのではないでしょうか。
ぜひご活用ください!