SummerEye part12 -AWS移行-

前回までAzure Webapp for ContainersでDockerコンテナを動かしていましたが、Stripe周りを実装したところエラー。

怪しいと思われるところを一通り修正したのですが、解決せず。

ちなみに手元のDockerでは動きます。

環境をそのまま持ってけるのがDockerの強みじゃなかったのか、とげんなりしていました。

 

もーわからん。ということで、一旦AWSで構築し直します。

 

IAMユーザ作成

Summereye用のユーザを作成します。

こっちの記事にまとめました。

 

aws-cliにprofileを追加

前項で作成したIAMユーザを追加します。


aws configure --profile YOUR_PROFILE_NAME

 

requirements.txt整理

Azure関連のライブラリはいらなくなるので一旦整理して、必要なものだけ入れました。

 

main.py、Dockerfile修正

main.pyをapplication.pyにリネームします。

Dockerfileも変更。ベースイメージをAWSが公開しているコンテナイメージにします。

とりあえずこれだけにします。


FROM amazon/aws-eb-python:3.4.2-onbuild-3.5.1

EXPOSE 8080

 

ビルド、起動してみます。


docker build -t summereye .

docker run -it --rm -p 80:8080 summereye

 

eb initでアプリケーションを登録していればeb localコマンドでもコンテナを起動できます(後述)。

 

Elastic Beanstalkにデプロイ

まずはElastic Beanstalkにアプリケーションを登録します。


eb init

 

ローカルで確認。


eb local run --port 8080

 

デプロイ。


eb deploy

 

諸々エラー解消

firebaseにアクセスするとSSLError

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)

 

調べてみるとこれは標準ライブラリのrequestsでhttpsにアクセスすると発生するエラーのようです。

(firebaseを利用する際、ライブラリPyrebaseの中でrequestsを使用している)

 

自分でrequestsを使っている場合は以下のように回避すれば良いですが、ライブラリの中を書き換えるのは嫌ですね。

 

ローカルでは動いているので他の環境が影響してそうです。

MacのOpenSSLバージョン


$ openssl version

OpenSSL 0.9.8zh 14 Jan 2016

 

Docker内のOpenSSLバージョン


# openssl version

OpenSSL 1.0.1i 6 Aug 2014

 

Dockerの方が新しい。ムムム。

Dockerの中に入ってチェックしてみます。

 

以下ではそれぞれこのような表記にしています。

  • $: Mac
  • #: Docker
  • >>>: Pythonインタプリタ

 


$ docker exec -it IMAGE_ID bash

# source bin/activate

# python

>>> import requests

>>> requests.get('http://www.google.com')

<Response [200]>

>>> requests.get('https://www.google.com')

requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)

 

はい、これです。

libssl-devをインストールしたら解決しました。

何回かこのエラーでハマってる気がする。今回は比較的早く解決。


# apt-get update

# apt-get install -y libssl-dev

 

同様のことをdocker buildの時にもやってもらうようにDockerfileに追記。


FROM amazon/aws-eb-python:3.4.2-onbuild-3.5.1

RUN apt-get update && apt-get install -y \
    libssl-dev

EXPOSE 8080

 

Azureに画像アップロードできていない

Docker内に直接入って、Pythonインタプリタから画像をパス指定して実行したらできた。

POSTでなにか失敗しているかも?

引き続き調査。

 

Elastic Beanstalkにデプロイすると502 Bad Gateway

ここまで手元でDockerコンテナ立てて、動くようにしたのにEBにデプロイします。

前半で作成したprofileを指定します。忘れないように。


eb init --profile YOUR_PROFILE_NAME

 

したら502。

一応デプロイ中のログも見られる。ちょっと辛そう。

 

ぱっと見うまくいってそうですが。。。

 

とりあえず、application.py、Dockerfile、requirements.txtをまっさらにしてもう一度チェック。

やっぱり502。根本的にElastic Beanstalk Dockerをもう一度復習する。

 

結構長い時間かけて検証しました。

  • 怪しげなところをコメントアウト(PythonライブラリやDocerfileの設定など)
  • 新しくEBプロジェクトを作り直してどのファイルが原因か検証

 

その結果どうやら.git/ディレクトリがエラーの原因みたいでした。

requirements.txtかDockerfileの書き方だと思ったのですが。

 

とりあえず.git/ディレクトリを別の場所に移動して、.ealsticbeanstalk/ディレクトリを削除してeb init


Cannot setup CodeCommit because there is no Source Control setup, continuing with initialization

 

git initして新しいgitリポジトリとしてeb initしたらデプロイまでできました。

(その後既存のリモートリポジトリとマージするのに一手間かかりましたが)

 

次回

一旦キリのいいところまで開発してクローズにしたい。

年内に以下のタスクを終わらせたいですね。

 

Computer Vision APIを使えるように修正

Computer Vision APIに投げる段階でミスってる?ローカルでは動いているので不可解。

今回解消できず、原因不明だったのでデバッグから。

 

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

こちらもローカルでは動くのにElastic Beanstalk上からだとエラー。

こちらはエラーメッセージが出てるので光明あり。

 

環境変数を設定する

鍵とか諸々。考えて扱う。

こちらを参考に。

 

ちょっとデザイン頑張る

頑張る。

 

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

知らないうちにお金かからないように。

 

参考

コメントを残す