LocalStackを使ってPythonSDK(AWS)の動作確認をしてみた

概要

AWS環境構築用にboto3 や AWS CLIを使っているのだが、動作確認するだけで自分の環境が汚れてしまうのがどうも気にくわない。

また、スクリプト自体はunittest や shunit2 で単体テストを回して品質を担保したいが、一番重要なAWSコマンド実行の部分を動作させられないといまいち。

環境を汚さず品質担保するうまい方法はないかプロに聞いてみたら、LocalStackというのがあるからやってみれ、とのことだった。 ので、ひとまず使ってみた。

ゴール

WindowsVirtualBox上に、LocalStackのサーバーを立てて、LocalStackに向けてS3のバケット作成コマンド実行する。

バージョン情報

Windows10

VirtualBox 5.1.30

Vagrant 2.0

Python3.6

結論

LocalStack仮想サーバーを構築する

下記のVagrantfileをローカルの適当なディレクトリに作成して、vagrant up を実行する。

(IPアドレス、ポート、メモリサイズ等は環境に合わせて変更してください)

Vagrant.configure(2) do |config|
      config.vm.provider "virtualbox" do |vb|
        vb.name = "local_stack"
        vb.memory = "2048"
      end
      config.vm.box = "bento/centos-7.2"
      config.vm.hostname = 'localstack'
      config.vm.network "private_network", ip: "192.168.100.201"

      config.vm.provision :shell, inline: <<-SHELL 
      for interface in $(grep 'NM_CONTROLLED=no' /etc/sysconfig/network-scripts/ifcfg-* -l)
      do
        sudo sed -i -e 's/NM_CONTROLLED=no/NM_CONTROLLED=yes/' $interface
        sudo ifdown $interface
        sudo ifup $interface
      done
      SHELL

      config.vm.provision :shell, inline: <<-SHELL
        sudo yum install -y docker
        sudo systemctl start docker
        sudo systemctl enable docker
        sudo -i docker run -itd -p 4567-4583:4567-4583 -p 8080:8080 localstack/localstack
      SHELL
end

ブラウザで http://192.168.100.201:8080 にアクセスして、下記のような画面(ダッシュボード)が表示されれば、LocalStackの構築は完了。

f:id:yamatatsu-blog:20180124224202j:plain

LocalStackに向けて create bucketを実行する

以下のようなPythonコードを実行する。 boto3のインストール方法については割愛。

import boto3 as bt3

client = bt3.client('s3', endpoint_url='http://192.168.100.201:4572')
client.create_bucket(Bucket='kudarizakawonobore-bucket')

実行成功したら、 LocalStackのダッシュボードを確認すると、S3のバケット作成が行われたことが確認できる。

f:id:yamatatsu-blog:20180124225121j:plain

やってること

vagrantのプロビジョニングでdocker のインストールとコンテナの構築を実施。
コンテナ作成時にポート4567~4583 までを仮想マシンのポートとつなげておけば、仮想マシンのポートをエンドポイントに指定するだけで応答を返してくれる。
(ダッシュボードは8080)

vagrantが使える環境であれば割と簡単に実行できる。

課題

今回はとりあえず動かしてみただけだが、単体テスト実行時だけは LocalStackを向いて、本番実行するときは所望の環境に向いてくれるように設定するのが好ましい。 やり方についてはこれから検討予定。