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に保存する

設計的にはこちらが正しいと思います。

が、

  1. ユーザが画像をアップロード
  2. S3にバケット作成、オブジェクト追加
  3. Computer Vision APIでディスクリプション取得
  4. ファイル名変更(新しい名前にコピーして、古いファイルを削除するという方法しかない
  5. S3からダウンロード

 

画像ファイルの送受信の回数がS3分増えるのが気になります。レイテンシー及び通信コスト。

素直なやり方ではある。

 

Dockerfileで適切な権限を設定する

自分でDockerコンテナイメージを作ったときは動いていたので、Elastic Beanstalkで意図的に権限が制限されている可能性があります。

もしかしたらちょっとの設定で解決できるかもしれないが、ハマる可能性あり。

amazon/aws-eb-python:3.4.2イメージのDockerfileuwsgi-start.shをみると、uwsgiユーザがflaskアプリケーションを実行しているので、uwsgiユーザを/var/app/ディレクトリの所有者にしてあげればOK?

パーミッションは減る方向なので問題ないかな?

 

ためしてみました。

Dockerfileに以下の1行追加。


RUN chown -R uwsgi:uwsgi /var/app

 

これで解決。

アプリケーションディレクトリの管理ユーザを変えてしまったので今後問題起きる可能性がありです。

注意しておきます。

 

Firebaseログインできるように修正

なんかできるようになってた。

原因不明の解決。モヤモヤしますが、とりあえずよしとします。

 

不要になったAzureリソース破棄

消すだけ。

消した。

 

次回

ひとまず、ローカルでの動きは再現できました。

あとは以下の2項目ができたらとりあえず公開可能な状態になります!

  • 環境変数を設定する
  • ちょっとデザイン頑張る
  • Stripeを本番モードに切り替え

 

ささっと作るつもりだったのに随分時間がかかりました。。。

 

参考

コメントを残す