a1インスタンスとDocker ComposeでOdoo ERPを5分で立ち上げる

ARM64アーキテクチャのAWS Graviton ProcessorはEC2 a1インスタンスシリーズで利用可能で、従来のIntel、AMDのCPUインスタンスシリーズよりも割安で利用できます。

Graviton モデル vCPU メモリ (GiB)  a1料金 c1料金 Intel モデル
a1.medium 1 2 0.0255USD/h
a1.large 2 4 0.051USD/h 0.085USD/h  c5.large
a1.xlarge 4 8 0.102USD/h 0.17USD/h  c5.xlarge
a1.2xlarge 8 16 0.204USD/h 0.34USD/h  c5.2xlarge
a1.4xlarge 16 32 0.408USD/h 0.68USD/h  c5.4xlarge

ARMアーキテクチャに追随しているソフトウェアといえばUbuntu+Dockerですが、ベルリンオフィスでオープンソースのERP、Odooのいくつかのアプリケーションを使う計画があり、せっかくであればa1インスタンスを使ってみようということで、Docker ComposeでOdooとPostgres DBコンテナを構築・実行しました。

サラの状態からOdooのアプリケーションにブラウザからアクセスできるようになるまで順調にいけば5分ですが、Docker Composeの導入でいくつか詰まるポイントがあるので、これからa1インスタンスをコンテナ運用や開発環境で使いたいという方へのTipsとして記述したいと思います。

a1インスタンスとUbuntu 18.04 LTS/ARM64 の起動

a1インスタンスが使えるリージョン(今回はアイルランド)でUbuntuでAMIを絞り込むと64bit (Arm)が選択できますのでそこから起動します。

これといって特筆すべきことはないのですが、Odooで使うPort 8069 をセキュリティグループで開けておきます。

a1.large、EBS 8GBで立ち上げました。

Docker CE for Ubuntuのインストール

公式ドキュメントのARM64レポジトリを選べば、特に間違えることはありません。

sudo apt-get update

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \
   "deb [arch=arm64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io

Docker Composeの導入

Docker Composeのレポジトリにあるバイナリは現状 Xアーキテクチャにしか対応していないので、pipを使ってソースを引っ張ってビルドする必要があります。まずpip3をインストールしましょう。

sudo apt-get install python3-pip

ではDocker Composeのインストールです。

sudo pip3 install -U docker-compose

すると以下のエラーが出てインストールできません。

Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-6rmu9gtw/pynacl/

ああ、はいはい、setuptoolsが古いんでアップデートですね、と安易にアップデートしてしまうと今度は鬼のように長いエラーを吐き出してpip自体がゲシュタルト崩壊してしまいます。

色々調べると libffiとlibsslのdevバージョンを入れると python3.6-devに呼応して正しくビルドできるようになります。

sudo apt-get install libffi-dev libssl-dev

あらてめてpipでdocker-composeをインストールします。

Docker ComposeによるOdooの構成、起動

ユーザーディレクトリ直下に公式ドキュメントを参考にしたdocker-compose.yamlファイルを設置します。

version: '2'
services:
  web:
    image: odoo:12.0
    depends_on:
      - db
    ports:
      - "8069:8069"
    volumes:
      - odoo-web-data:/var/lib/odoo
      - ./config:/etc/odoo
      - ./addons:/mnt/extra-addons
  db:
    image: postgres:10
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_PASSWORD=odoo
      - POSTGRES_USER=odoo
      - PGDATA=/var/lib/postgresql/data/pgdata
    volumes:
      - odoo-db-data:/var/lib/postgresql/data/pgdata
volumes:
  odoo-web-data:
  odoo-db-data:

dbにPostgresのコンテナイメージを使って、そのボリュームをコンテナの外に保存する方法を取っています。将来DBを外出ししてAurora化する際もyamlの書き換えだけで対応できます。 デタッチドモードで起動します。

sudo docker-compose up -d

IPアドレスとPort 8096でブラウザからアクセスします。

データベースの初期化は起動時の画面からアドミンユーザーを作るのと同時に行います。

2 vCPUのインスタンスですが、操作感にもたつきもなく、まずは十分なスペックです。

いかがでしたでしょうか。AWSには様々なコンテナ技術とプラットフォームが使えますが、古典的にEC2インスタンス上でDockerとDocker Composeを使うならば a1インスタンスは有力な選択肢になるはずです。