0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

WindowsのVirtualbox上にAWS localstackを自動構築

Last updated at Posted at 2022-10-01

目的

  • WindowsPC上にAWS localstack環境を構築する。
  • 構築したlocalstackは、ホストマシンであるWindowsPCや、
    VirtualBox上の別の仮想マシンからもアクセスできるようにする。

作業環境

  • Windows 10
  • Virtualbox 6.1.14
  • Vagrant 2.3.1

ここに、Vagrantとansible_localを利用して
【Virtualbox + Ubuntu + Docker Engine + localstack】
の環境を自動構築する。

仮想マシンのネットワークは、NAT(eth0)+ホストオンリーアダプタ(eth1)で構成する。
ネットワークの説明は こちらの記事 がわかりやすかった。
・仮想マシン⇒インターネットの通信はNAT(eth0)
・ホストマシン⇔仮想マシン、仮想マシン⇔仮想マシン間の通信はホストオンリーアダプタ(eth1)
を通ることになる。
localstackを利用する全てのホストマシンと仮想マシンが、
同じホストオンリーアダプタ(今回は192.168.56.0/24)に繋がるように構成する必要がある。

Virtualbox, Vagrant のインストール

各公式サイトからダウンロードしてインストールする。

Vagrant plugin のインストール

PowerShellから以下のコマンドでプラグインをインストール。
vbguestは必須ではないがVirtualboxとのバージョン差分を解消してくれるらしいので入れておく。

> vagrant plugin install vagrant-vbguest

今回は使わないが、プロキシ環境で利用する場合はproxyconfが必要。

> vagrant plugin install vagrant-proxyconf

作業フォルダと設定ファイルの準備

作業フォルダ作成

今回は以下のフォルダ構成にしています。

C:\users\(ユーザ名)\documents\vagrant\ubuntu22
├───Vagrantfile
└───provision
    └───ansible-playbook.yml

Vagrantfile作成

作業フォルダの直下に「Vagrantfile」というファイルを作成。

Vagrantfileサンプル
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  # 仮想マシンにインストールするOSの指定(Vagrant Cloudから取得される)
  config.vm.box = "bento/ubuntu-22.04"

  # 仮想マシンのホスト名(hostname)。省略可。
  config.vm.hostname = "awslocalstack"

  # Virtualboxのホストオンリーアダプタのネットワーク追加と固定IP設定。
  # デフォルトでホストマシン(WindowsPC)に付与されるアドレスが192.168.56.1のため同じセグメントのIPを指定。
  # Virtualboxのネットワーク設定を見たところ、192.168.56.100以降はDHCP用のようなので、~99の範囲で好きな数字を付ければOK。
  config.vm.network "private_network", ip: "192.168.56.10"

  # 共有フォルダの設定と作成。省略可。
  config.vm.synced_folder "./shared", "/vagrant_data", create:"true"

  # ansible_playbook.ymlを仮想マシン側で読み込むための共有フォルダの設定。必須。
  config.vm.synced_folder "./provision", "/home/vagrant/provision"

  # Virtualboxに対する設定。不要なものは省略可。
  config.vm.provider "virtualbox" do |vb|
    #vb.gui = true
    #vb.memory = "1024"
    vb.name = "ubuntu22-localstack"
    vb.customize ["modifyvm", :id, "--nictype1",  "virtio"]
    vb.customize ["modifyvm", :id, "--nictype2",  "virtio"]
  end

  # vbguestプラグインの設定。省略可。
  if Vagrant.has_plugin?("vagrant-vbguest")
    # set auto_update to false, if you do NOT want to check the correct
    config.vbguest.auto_update = true
  end

  # proxyプラグインの設定はこの辺りに記載すればいいはず。(試してない)

  # ansible_localの起動。必須。
  # 初回のvagrant up時に読み込まれる。(2回目以降は明示的にprovisionの指定が必要)
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "provision/ansible-playbook.yml"
  end

  # ansible_local後の仮想マシン再起動。必須。
  # 初回のvagrant up時に読み込まれる。(2回目以降は明示的にprovisionの指定が必要)
  config.vm.provision "shell" do |shell|
    # reboot for docker reload
    shell.privileged = true
    shell.inline = 'echo rebooting'
    shell.reboot = true
  end

  # localstackのコンテナ起動。必須。
  # vagrant up, vagrant reload時は毎回実行される。(run: "always") 
  # コンテナ起動直後はlocalstackが上がりきっていない場合があるためsleepを入れている。
  config.vm.provision "shell", run: "always", privileged: false, inline: <<-SHELL
    localstack start -d
    # wait localstack service ready
    timeout 60 bash -c 'if [ $? == 0 ]; then until ( curl -s localhost:4566 ); do sleep 5; done; fi'
    localstack status services
  SHELL

end

ansible-playbook作成

作業フォルダの直下に「provision」というフォルダを作成し、「ansible-playbook.yml」というファイルを作成。

ansible-playbook.ymlサンプル
---
- hosts: all
  become: yes
  user: vagrant

  tasks:
    ### install pkg
    - name: apt-get install packages
      become: yes
      apt:
        name: "{{ item }}"
        state: present
        update_cache: yes
      with_items:
        - python3-pip

    ### install docker
    - name: apt-get install packages for docker
      become: yes
      apt:
        name: "{{ item }}"
        state: present
        update_cache: yes
      with_items:
        - ca-certificates
        - curl
        - gnupg
        - lsb-release

    - name: set dockers official gpg key
      become: yes
      apt_key:
        url: "https://download.docker.com/linux/ubuntu/gpg"
        state: present

    - name: set dockers stable repository
      become: yes
      apt_repository:
        repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable
        state: present

    - name: install docker
      become: yes
      apt:
        name: "{{ item }}"
        state: present
        update_cache: yes
      with_items:
        - docker-ce
        - docker-ce-cli
        - containerd.io
        - docker-compose-plugin

    - name: user add docker group
      become: yes
      user:
        name: "{{ ansible_user }}"
        groups: docker
        append: yes
        state: present

    ### install awscli, awscli-local, localstack
    - name: apt-get install pkg for localstack
      become: yes
      apt:
        name: "{{ item }}"
        state: present
        update_cache: yes
      with_items:
        - awscli

    - name: pip install for localstack
      become: no
      pip: 
        name: "{{ item }}"
        state: present
        executable: pip3
      with_items:
         - docker==5.0.0
         - localstack
         - awscli-local

    - name: set env localstack bind host
      become: no
      lineinfile:
        dest: ~/.profile
        line: export EDGE_BIND_HOST=0.0.0.0
        state: present

VagrantでのUbuntuインストール~localstackの起動の自動実行

作業フォルダに移動してVagrantを起動

Powershellで作業フォルダの直下に移動してコマンド投入することで、仮想マシンのインストール~localstackの起動までが自動で完了する。
初回はダウンロードするものが多いのでかなり時間がかかる。(ネットワーク環境にもよるが1時間程度?)

> cd C:\users\(ユーザ名)\documents\vagrant\ubuntu22
> vagrant up
...
...

    default: ┏━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┓
    default: ┃ Service                  ┃ Status      ┃
    default: ┡━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━┩
    default: │ acm                      │ ✔ available │
    default: │ apigateway               │ ✔ available │
    default: │ cloudformation           │ ✔ available │
    default: │ cloudwatch               │ ✔ available │
    default: │ config                   │ ✔ available │
    default: │ dynamodb                 │ ✔ available │

~~~~~~~~~~~~ 略 ~~~~~~~~~~~~

    default: │ swf                      │ ✔ available │
    default: │ transcribe               │ ✔ available │
    default: └──────────────────────────┴─────────────┘

最後にlocalstackの各サービスの状態が表示されれば正常終了。

localstackの動作確認(任意)

ホストマシン(WindowsPC)のPowerShellから、仮想マシン(Ubuntu)上のlocalstackに向けてaws cliコマンドを打ってみる。
ホストマシンにaws-cliがインストールされていない場合はインストールとconfigure設定が必要。(aws cli インストール手順はこちらを参照)

> aws s3 mb s3://testbucket --endpoint-url=http://192.168.56.10:4566
make_bucket: testbucket

次回以降も作業フォルダでvagrant upコマンドで起動すれば、仮想マシンと同時にlocalstackが起動するようになっている。
(VirtualboxのGUIから起動する場合はlocalstackは手動で立ち上げる必要がある)

ちなみにvagrant sshで仮想マシンの中に入れる。
もちろんTeraTerm等を使って設定した固定IPアドレスにログインしてもOK。
仮想マシンの終了はvagrant halt。

苦労した点

  • 仮想マシンのOSの選定
    最初はCentOS7を使おうとしていたが、デフォルトのPythonのバージョンが古く(※)、またEOL後の扱いも気になるためUbuntuに変更。
    ※localstackの動作要件としてPython3.7以上が必要だが、CentOS7.9のPythonは3.6だった。Ubuntu22だと3.10が入っていた。

  • Pythonの追加インストール
    OS標準のPythonを使うべきではないという記事を見つけたので、Pythonの構築から実行するようにplaybookを修正してみたのだが、なぜかlocalstackが正常に立ち上がらなくなってしまったため今回は断念した。
    そのうちリベンジしたい。

  • ansibleでのpip3の実行
    ansibleのモジュールがpipしかなかったため、pip3での実行方法がわからず苦労した。
    途中まで~/.bashrcにalias追記する方法をとっていたが、最終的に公式ドキュメントでexecutableオプションを見つけたためそちらを採用。

  • ansible_localでの仮想マシンの再起動
    dockerインストール後に再起動して色々設定を読み込み直したかったのだが、ansible_localだとコントローラーがいないためansible_playbookの中で再起動ができないようだった。(当然といえば当然)
    結局Vagrantfile側でrebootコマンドを実行させた。

  • WinsdowsPC(ホストマシン)や他のVirtualbox上の仮想マシンから、localstackにアクセスできない。
    ・ping⇒通る。
    ・awscliコマンドのエンドポイントが--endpoint-url=http://localhost:4566⇒通る。
    ・awscliコマンドのエンドポイントが--endpoint-url=http://192.168.56.10:4566⇒通らない。
    という状況だったため、ポート4566がlocalhost以外でLISTENできていない点が問題だった模様。
    公式ドキュメントにある環境変数EDGE_BIND_HOSTを変更したら通るようになった。

参考

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?