ClojureのWebアプリをAWS BeanstalkにDockerを使ってデプロイする

More than 1 year has passed since last update.

今までHerokuを使っていたのですが、機械学習モデルをデプロイする関係でメモリがきつくなってきたため、AWSに移行しようとしたというのが動機です。

AWSやDocker,デプロイ周りに詳しいわけではないので、あくまで表題を達成するための方法が記述されている、くらいの認識でお願いします。

(他のイケてるやり方があれば是非、教えてください)

なお本記事を読むにあたって、AWSの登録やDockerの環境は構築済みであるとしています。

AWSに関してはIAMなどの認証周りの設定まで終わらせておくと面倒が少なくて良いかもしれません。


webアプリの作成

まず今回デプロイの対象であるアプリを作ります。

ブラウザでアクセスしたらHello Worldと表示されるやつですね。

lein new compojure hello-world

cd hello-world
lein ring uberjar
java -jar target/hello-world-0.1.0-SNAPSHOT-standalone.jar

これで127.0.0.1:3000にアクセスしてHello Worldと出ればokです!

次にDockerコンテナ上にアプリを構築してみましょう。


webアプリをDockerコンテナ上で起動

公式Clojureの記述を参考にしました。

Dockerfileを作成して次の内容を書いてみて下さい。

FROM clojure

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY project.clj /usr/src/app/
RUN lein deps
COPY . /usr/src/app
EXPOSE 3000
RUN mv "$(lein ring uberjar | sed -n 's/^Created \(.*standalone\.jar\)/\1/p')" app-standalone.jar
CMD ["java", "-jar", "app-standalone.jar"]

project.cljを分けて先に置いてからlein depsをすると、依存ライブラリが変更された時のみアップデートされるようになって効率的らしいです。

EXPOSEはここでポートの設定を行わないとBeanstalkにデプロイした後に起動できません。

次にイメージの作成をしてコンテナを起動します。

docker build -t hello-world .

docker run -d -p 3000:3000 --name hello-world hello-world

基本的にはhttp://127.0.0.1:3000でアクセスできると思いますが、Mac環境だとポートのフォワードはVMに通す必要があるので、docker-machineで作ったVMのhostを指定します(次の例ではdefaultを指定)

docker-machine env defaultとすると次の設定が出力されます。

export DOCKER_TLS_VERIFY="1"

export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="XXX"
export DOCKER_MACHINE_NAME="default"

上記の例の場合http://192.168.99.100:3000にアクセスします。

ここまででブラウザにHello Worldの文字列が出ていれば成功です!


AWS Beanstalkにデプロイ

まずはプロジェクトをgitで管理します。

git init

git add .
git commit -m "init my project"

次にebをインストールをします。

Install the Elastic Beanstalk Command Line Interface (EB CLI)に従って、eb --versionが正常に動くところまで行います。

ここからはAWSの設定になります。

次のコマンドのそれぞれでインタラクティブに設定を行うことになります。

AWS上で複数設定を持っている人はそれぞれに--profile hogeでプロファイルを適応することを忘れないで下さい。

eb init

eb create


  • EB CLI の設定に詳細がかかれているので一読してみて下さい。



  • 手っ取り早く試したい人はデフォルトの設定に次の選択肢でいいかもしれません。


    • Code Commit: n

    • SSH setup: n

    • load balancer type: 2) application



ブラウザからAWSのElastic Beanstalkに移動すると上記で作成したアプリが表示されていると思います、見つからない場合はリージョン設定を確認してください。

また構成されたアプリのURLも記載されています。

eb openで、ローカル環境と同じくHello Worldが出てくればokです!

もし成功しなかった場合はeb logsでログを確認して見てください。

さて、ファイルを編集してもう一度デプロイしてみましょう。

src/hello_world/handler.cljHello Worldの文章を変更して再度コミットして下さい。

eb deployで再度デプロイします。

次にeb openでwebアプリが上記で編集したテキストが表示されていれば成功です!

最後に、ロードバランサーやEC2インスタンスなどが起動しているので、必要なければ忘れずに環境を消しておきましょう。

右上のボタンからterminateを選択すれば、構築した環境をまるごと消去できます。

以上になります。