AWS ECR を使う開発に便利な Vagrantfile

概要

ECS で稼働させるアプリケーションを開発していますが、Docker for Mac は何かと遅いので、Docker/ECR まわりの作業だけ Vagrant上でやるための Vagrantfile を作りました。その内容を残しておきます。

Vagrantfile

# Vagrant環境に予めインストールしておきたいものを記述する
# ここでは、AWS CLI をインストールし、 ECR へ Push するための docker login コマンドを alias として追加している
$provision_script = <<SCRIPT
apt-get update
apt-get install -y zip unzip
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install --update
rm awscliv2.zip
echo 'alias ecr-docker-login="docker login -u AWS -p $(aws ecr get-login-password) https://$(aws sts get-caller-identity --query Account --output text).dkr.ecr.${AWS_REGION}.amazonaws.com"' >> .bashrc
SCRIPT

Vagrant.configure("2") do |config|
  # お好みの Distro の Box を以下サイトから検索して指定。ここでは Ubuntu 18.04 を使用。
  # https://app.vagrantup.com/boxes/search
  config.vm.box = "bento/ubuntu-18.04"

  # メモリを増やしておく
  config.vm.provider "virtualbox" do |v|
    v.memory = 4096
    v.cpus = 2
  end

  # Windows + Hyper-V の場合
  # config.vm.provider "hyperv" do |v|
  #   v.memory = 4096
  #   v.cpus = 2
  # end

  # VM 上で初めから Docker を使えるようにしておく
  config.vm.provision "docker"
  # 初期インストールスクリプト実行
  config.vm.provision "shell", inline: $provision_script

  # Dockerコンテナでサービスするポートにホストからアクセスできるようにする
  config.vm.network "private_network", ip: "172.12.8.150"
  config.vm.network "forwarded_port", host: 8080, guest: 80

  # ホスト側のソースコード VM 内で参照するため共有しておく
  # (gitwork の下に、 github から clone したリポジトリがある想定)
  config.vm.synced_folder "#{ENV['HOME']}/gitwork", "/home/vagrant/gitwork", type: "nfs"

  # Windows の場合
  # config.vm.synced_folder "#{ENV['HOMEDRIVE']}\\#{ENV['HOMEPATH']}\\gitwork", "/home/vagrant/gitwork", type: "nfs"

  # ホスト(ローカル)での AWS Credential を共有したい場合
  # config.vm.synced_folder "#{ENV['HOME']}/.aws", "/home/vagrant/.aws", type: "nfs"
end

使用方法

vagrant up して、VMが起動したら vagrant ssh し、上記でマウントしたソースコードディレクトリに移動して docker build します。

ECR に Push するときは

$ AWS_REGION=ap-northeast-1 ecr-docker-login     # AWS_REGION には使用する ECRリポジトリがあるリージョンを指定

とした後に、ドキュメント通り、タグ付けと docker push を行います。

終わりに

今回は、Mac上に開発環境が出来上がっている状態で作成したので、ソースコードなどのリソースはホスト(Mac) のファイルシステムをマウントする形にしていますが、ゼロから作るのであれば、VagrantVMファイルシステム上に git clone して開発環境を作ったほうが何かと幸せかもしれません。

VS Code なら SSH Remote Connect を使えば開発作業もある程度シームレスにできるでしょう。

参考

qiita.com