-コンテナごとFlaskアプリをデプロイ-前回は素のFlaskアプリケーションをデプロイしました。今回はDockerコンテナを動かしてみます。Containersと同じようなものです。ContainersEC2より自由度は下がりますが管理が楽になり、EBに単純にアプリケーションをデプロイするよりは自由度が上がります。それなりに学習コストも高くなりますが、かけただけの時間を将来削減できると信じて勉強します。今回は単一コンテナのDocker環境構築を行います。Beanstalkではユーザはアプリケーションをデプロイするだけです。Beanstalkが管理してくれます。BeanstalkにDockerコンテナイメージをデプロイする場合は、EC2の中にさらにDockerコンテナを起動し、外部とのポートの接続を行ってくれます。Wiki詳しい説明は公式へ。CLIインストールAWSマネジメントコンソールでポチポチやるのではなく、CUIでカタカタやっていきます。CLIツールが必要になるのでインストールします。仮想環境を用意し、有効にします。前回やったので詳しくはこちら。~/YOUR_DIRECTORY/bin/activateサンプルアプリを作成とりあえず動かしたい人はこちらのREADMEに従えば動くはずです。Docker自分で作りたい人は続きへ。適当なディレクトリを作成しapplication.pyを作成します。(ファイル名はapplication.pyにしましょう。application.pyapplication.pyはこんな感じ。app.run()requirements.txtを作成します。EB内ではこのファイルを元にライブラリをインストールします。多ければデプロイに時間がかかるので余計なものは入れないようにしましょう。プロジェクトのディレクトリ毎に仮virtualenvで仮想環境を作るのがいいと思います。今回のrequirements.txtには、flaskとだけ記入しましょう。今回は単一のDockerコンテナを利用するため、公式の以下のページを参考にします。ベースイメージを使用する必要があります。公式の案内では書いていませんでしたが、EXPOSEオプションがないと怒られます。8080Pythonのバージョンは3.4なので依存関係がある場合は注意してください。Beanstalkamazon/aws-eb-python:3.4.2というコンテナイメージを作っているDockerfileはおそらくこちらのGithubで公開されているものです。一応Officialと書いていますが、AWS側からのリンクがないので利用は自己責任で。files.どうしても別バージョンが使いたかったらDockerfile内で設定すれば使えるんでしょうか?ご存知の方がいたら教えてください。.runコマンドで試しにローカルで起動してみます。コンテナは8080番経由でアプリケーションを公開しています。my-app-imageブラウザからhttp://localhost:3000/にアクセスしてみましょう。お馴染みの文言が表示されればOKです。公式にはDockerfileからDockerfile.localにファイル名を変更するように書かれていましたが、不要です。Beanstalkが認識しなくなります。runコマンドで確認できます。Beanstalkデプロイに関してはこちらを参照にしてください。適当に質問を答えていくと、素のFlaskプロジェクトでは聞かれなかったことを聞かれます。Dockerfileを認識したようですね。以下の質問をされます。Yで答えると引き続きkeypairについて聞かれます。gitなどでソース管理している場合AWSのCodeCommitを使うかどうか聞かれます。デフォルトではno、つまり自分が使っているGithubなどを引き続き使用します。この場合はkeypairについて聞かれません。Beanstalkに環境を作成する環境を作成し、開きます。YOUR_ENV_NAMEしばらく実行ログが出力されます。アプリケーションをウェブブラウザで確認する環境の作成が完了したら、以下のコマンドでウェブブラウザを開きます。5秒ぐらいかかるので待ちます。openアプリケーションが動いているのがわかります。WebサーバがDockerfileで公開した8080番ポートに繋いでいる感じです。若干のブラックボックス感が怖いですが。動かすことができました。公式の情報に不足があったのでこちらがかなり参考になりました。runコマンドでローカルで確認することができます。内部処理的には普通にDockerコンテナbuildしてrunしてるっぽいです。80802,3分待ったらブラウザでアクセスしてみます。初回こそ時間がかかりますが、2回目からは迅速に確認できます(Docker側の設定をいじっていなければ)。deployコマンドを用います。aws.pushなどが紹介されていますが、こちらは廃止になりました。BeanstalkはアプリケーションをEC2インスタンスで動かしています。sshコマンドでSSH接続することが可能です。sshデプロイ周りでこけている場合はこの中のログを漁ってみると原因が掴めるかもしれません。Dockerでは、EC2の中でDockerコンテナがアプリケーションを動かしています。Wikiすなわち、アプリケーションの実行環境を確認するためにはEC2にSSH接続したのちDockerコンテナに入る必要があります。psでコンテナIDを取得します。execコマンドでDockerの中に入りましょう。lsすると/var/app/に自分がデプロイしたアプリケーションが配置されていることがわかります。このディレクトリにはbin/ディレクトリが新たに追加されています。これがユーザがrequirements.txtで定義したライブラリをインストールしたPython仮想環境です。DockerのPython環境を確認する/var/app/ディレクトリにあるbin/ディレクトリを使って仮想環境を有効化します。bin/activate(app)root@2181f0bf271e:/var/app#pipによるライブラリの管理状況を確認してみます。requirements.txtに定義した通りのライブラリがインストールされているはずです。freezeEB==0.1.5Flask==0.12.2Jinja2==2.10....Flaskのログを見るローカルのDockerコンテナで問題なく動いていればebでも問題なく動くはず、というかそれがDockerで開発するメリットのはずですが、現実は無情である。ローカルでは動いていたのにebでは動かないときはサーバのFlaskのログを見たくなりますよね。amazon/aws-eb-python:3.4.2-onbuild-3.5.1イメージのDockerfileを見てみると、/var/log/uwsgi/uwsgi.logにuWSGIのログを吐いていることがわかります。上記の方法でDockerコンテナまで入ったら、tailコマンドでログを見ましょう。/var/log/uwsgi/uwsgi.logこれでアプリケーションにアクセスすればログが取れます。Nginxのファイルアップロード制限を解除するNginxに対するファイルアップロードは制限値が設けられています。client_max_body_sizeで定義され、デフォルトでは1MBです。Dockerの場合デプロイの度に初期設定に戻されてしまいます。Beanstalkでは.ebextensions/ディレクトリに設定ファイルを配置することでソフトウェアの設定を変更できます。Beanstalkアプリのディレクトリに.ebextensions/ディレクトリを作成して.config拡張子のファイルに以下の記事のように記述をすればアップロード制限が10MBになります。Beanstalkにデプロイする際、ソースは一旦S3にzip形式で保存されます。terminateコマンドやAWSマネジメントコンソール上での環境やアプリケーションの削除を行っても残ります。大きなプロジェクトをデプロイするときはS3を逼迫していないか注意しましょう。おまけGithubにcloneしてそのまま使えるリポジトリ公開しました。他に公開してあったら消すので教えてください。Docker使い方はREADMEに書いておきます。initialization作成済みのebプロジェクト内の.git/ディレクトリを途中で削除した時などに発生します。initするなり、元のgitの設定を復元しましょう。details.requirements.txtを用いたpipインストールでエラーが発生しています。runを行うとより詳細な原因がわかります。grpcioのインストールでこけているみたいです。None該当の部分をコメントアウト。Dockerの起動まではできました。コメントアウトしたライブラリを捨て置くわけにもいきません。bin/activateで仮想環境に入ります。件のライブラリをインストールしてみます。grpcio)どうやら既にインストール済みのようです。requirements.txtにはgrpcio==1.8.2と書かれていましたが、こちらはどうでしょう。grpciogrpcio==1.8.1どうやらDocker内のpipでは1.8.2を認識していないため、そんなバージョンはないと怒られていたみたいですね。Dockerfileでpipのアップデートを指示できますが、amazonのコンテナイメージを使っており、どうやらrequirements.txtを読み込む方が早そうです。requirements.txt内の記述をgrpcio==1.8.2からgrpcio==1.8.1に変更しました。deployで解決しました。8080を実行したらエラーが発生しました。単一のコンテナでは実行できない?できなくなった?以前はこのプロジェクトを使ってローカルで確認できていたと思うんですが。して記事にも残っているし。