Python、Docker、Kubernetesによるデータトランスフォーメーション
by Andrew Backes and Allen Fung
先日、ある日のデータファイルを変換して連結し、FTPサーバーにアップロードするアプリケーションを作成しました。具体的には、このアプリケーションが行うことは以下の通りです。
- S3から指定した日の個別のGZファイルをダウンロードします。
- ジッパーを開けると
- JSONをパイプで区切られたフォーマットに変換する
- 1日分のデータを1つのファイルに連結する
- そのファイルを圧縮する
- FTPでアップロードする
このアプリケーションには興味深い点がいくつかあります。まず、従来はこの種のアプリケーションにはシェルスクリプトを使用していましたが、今回はPythonを採用しました。この言語はユニットテストを容易にサポートしているため、アプリケーションのメンテナンス性が向上します。また、Pythonはより機能的なプログラミングスタイルをサポートしており、組織全体でより頻繁に使用されるようになってきています。
このアプリケーションのもうひとつの興味深い点は、Dockerコンテナの中で動作していることです。Dockerを使うことの重要な利点は、開発環境が本番環境とまったく同じであることです。その結果、デプロイ時にPythonのバージョンが間違っていたり、Pythonモジュールがなかったりといった問題に遭遇することはありませんでした。これにより、従来の環境では数日かかっていた本番環境への初期デプロイが数分で完了しました。
アプリケーションをサーバーのクラスターに展開するために、Kubernetesを使用しました。具体的には、「kubectl create」コマンドを使用しました。このコマンドの入力はYAMLファイルで、使用するdockerイメージ、CPUリソース、メモリリソースが含まれています。このアプリケーションは1つのコンテナで動作するように設計されていますが、Kubernetesでは複数のコンテナに数秒で簡単に拡張することができます。以下にその例を示します。
$ kubectl scale rc my-application -replicas=5
レプリカオプションが5に設定されているので、5つのコンテナにスケーリングしていることになります。なお、Kubernetesの上には、複数のクラスタを管理するためのツールも構築しています。このツールでは、デプロイ先を指定すると、指定した場所に適した環境変数を自動的に見つけてくれます。
ご覧いただいたように、Python、Docker、Kubernetesは、私たちがよりクリーンなコードを書き、より速く反復することを助け、より良い製品を生み出すことにつながっています。将来的には、より多くのレガシーアプリケーションをこの環境に移行していきたいと考えています。これに関するブログ記事にご期待ください。
このような問題を解決することに興味のある方は、ぜひご参加ください。 私たちのチームに参加してください。