エンジニア

Vue.js/DjangoのアプリケーションをElastic Beanstalkでデプロイする際の注意点

こんにちは!ハンズラボのりょうです。

今回は、Vue.js/Djangoのアプリケーションを、ElasticBeanstalkでデプロイする際に陥ったミスとその解決策についてのお話です。

背景

ElasticBeanstalk で環境プロパティ等の変更を行うたびに、アプリケーションが表示されなくなってしまう現象が発生し、環境プロパティを変更するたびに手動でデプロイをしなければならないので、なんとか解決したい!!

やりたいこと

環境プロパティ等の変更により ElasticBeanstalk が自動的に再デプロイされても、アプリケーションが表示されていること。

調査開始

まずは、これまでのデプロイの流れと本事象の発生タイミングをおさらいします。

  1. vue-cli-service build 操作を実施し、Vue.js のビルド結果を出力
  2. ebextensions の container_commands に collectstatic コマンドを設定
  3. eb deploy を実行(この時点ではアプリケーションは表示されている)
  4. 環境プロパティ等の設定変更を実施するとアプリケーションが表示されなくなる

.ebextensions/01_django.configの中身はこんな感じです。

container_commands:
    01_collectstatic:
        # ここでビルド結果を静的ファイル配置パスに配置
        command: ‘source /var/app/venv//bin/activate && python /var/app/staging/manage.py collectstatic --noinput’ 
    02_migrate: 
        command: ‘source /var/app/venv//bin/activate && python /var/app/staging/manage.py migrate’
        leader_only: true
    03_wsgipass:
        command: ‘echo “WSGIPassAuthorization On” >> ../wsgi.conf’

option_settings:
    aws:elasticbeanstalk:environment:proxy:staticfiles:
        /static: “static”
    aws:elasticbeanstalk:container:python:
        WSGIPath: app.wsgi:application

設定変更後のアプリケーションコードを見てみると、なんとVue.jsのビルド結果が消失していました。
むむむ、、

その後も調査を続けましたが、直接の原因がわからず、、
AWSサポートに本件について相談してみました。

すると、eb deploy 実行時点で存在していないファイル(eb deploy 中にビルドしたファイル等)については、デプロイ後、環境プロパティ等の設定変更を行った際に消失してしまうとのことでした。

確かに、eb deploy中に collectstatic を実行し、Vue.jsのビルド結果を静的ファイル配置パスに配置しているので、デプロイ実行時点ではファイルが存在していない。。

ということで、collectstatic を実行して、Vue.js ビルド結果を静的ファイル配置パスに配置してから eb deploy してみる

実践

以下の流れでデプロイしてみます。

  1. vue-cli-service build 操作を実施し、Vue.js のビルド結果を出力
  2. collectstatic を実施し、Vue.js のビルド結果をプロジェクトディレクトリの静的ファイル配置パスに配置
  3. eb deploy を実行

変更後の.ebextensions/01_django.configの中身はこんな感じです。
eb deploy前にcollectstaticコマンド実行しているので、01_django.configからは削除しています。

container_commands:
    01_migrate: 
        command: ‘source /var/app/venv//bin/activate && python /var/app/staging/manage.py migrate’
        leader_only: true
    02_wsgipass:
        command: ‘echo “WSGIPassAuthorization On” >> ../wsgi.conf’

option_settings:
    aws:elasticbeanstalk:environment:proxy:staticfiles:
        /static: “static”
    aws:elasticbeanstalk:container:python:
        WSGIPath: app.wsgi:application

確認

マネジメントコンソールから環境プロパティに変更を加えてると、、
アプリケーションは表示されたままでした!!
これで心置きなく環境プロパティを触れそうです。

最後まで読んでくださりありがとうございました!
それではまた。

一覧に戻る