SummerEye part13 -AWS移行2-
前回苦労してAzureに立てたアプリをAWS Elastic Beanstalk Dockerに移行しました。
目次
やることリスト
- Computer Vision APIを使えるように修正
- Firebaseログインできるように修正
- 不要になったAzureリソース破棄
- 環境変数を設定する
- ちょっとデザイン頑張る
Computer Vision APIを使えるように修正
こんな感じでElastic BeanstalkのEC2にSSH接続して、Dockerコンテナ内部に入って、Pythonインタプリタを起動してコードを叩いてみました。
すると問題なくCompute Vision API叩けました。
>>> d_list = ['images/test/02352t.png'] >>> cvapi.get_description_list(d_list,True) a-brown-and-white-dog-looking-at-the-camera ['a-brown-and-white-dog-looking-at-the-camera']
ということは、FlaskのPOSTで問題が起きてる?
こんな感じでログとって見たところ、原因が判明しました。
os.makedirs()でパーミッションエラーが起こってました。なるほどー。
File "./snipet/local.py", line 48, in save_image os.makedirs(user_dir) File "/var/app/lib/python3.4/os.py", line 237, in makedirs mkdir(name, mode) PermissionError: [Errno 13] Permission denied: './images/20171222050610'
そもそも論で言えば、Elastic Beanstalkの思想的にDocker内にファイルを保存していくのはイケてない設計のはず。
解決策として思いついたのは以下の2つ。
- 画像をS3に保存する
- Dockerfileで適切な権限を設定する
画像をS3に保存する
設計的にはこちらが正しいと思います。
が、
- ユーザが画像をアップロード
- S3にバケット作成、オブジェクト追加
- Computer Vision APIでディスクリプション取得
- ファイル名変更(新しい名前にコピーして、古いファイルを削除するという方法しかない)
- S3からダウンロード
画像ファイルの送受信の回数がS3分増えるのが気になります。レイテンシー及び通信コスト。
素直なやり方ではある。
Dockerfileで適切な権限を設定する
自分でDockerコンテナイメージを作ったときは動いていたので、Elastic Beanstalkで意図的に権限が制限されている可能性があります。
もしかしたらちょっとの設定で解決できるかもしれないが、ハマる可能性あり。
amazon/aws-eb-python:3.4.2イメージのDockerfileとuwsgi-start.shをみると、uwsgiユーザがflaskアプリケーションを実行しているので、uwsgiユーザを/var/app/
ディレクトリの所有者にしてあげればOK?
パーミッションは減る方向なので問題ないかな?
ためしてみました。
Dockerfileに以下の1行追加。
RUN chown -R uwsgi:uwsgi /var/app
これで解決。
アプリケーションディレクトリの管理ユーザを変えてしまったので今後問題起きる可能性がありです。
注意しておきます。
Firebaseログインできるように修正
なんかできるようになってた。
原因不明の解決。モヤモヤしますが、とりあえずよしとします。
不要になったAzureリソース破棄
消すだけ。
消した。
次回
ひとまず、ローカルでの動きは再現できました。
あとは以下の2項目ができたらとりあえず公開可能な状態になります!
- 環境変数を設定する
- ちょっとデザイン頑張る
- Stripeを本番モードに切り替え
ささっと作るつもりだったのに随分時間がかかりました。。。