今まで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.clj
のHello World
の文章を変更して再度コミットして下さい。
eb deploy
で再度デプロイします。
次にeb open
でwebアプリが上記で編集したテキストが表示されていれば成功です!
最後に、ロードバランサーやEC2インスタンスなどが起動しているので、必要なければ忘れずに環境を消しておきましょう。
右上のボタンからterminateを選択すれば、構築した環境をまるごと消去できます。
以上になります。