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リソース破棄
知らないうちにお金かからないように。
参考
- EB CLI を使用して Docker 環境をローカルで実行する – AWS Elastic Beanstalk
- (ショロカレ 1 日目)Elastic Beanstalk と Docker コンテナで Worker Tier する – ようへいの日々精進XP
- (超メモ)Elastic Beanstalk の Worker Tier について(cron っぽいことをやってみる) – ようへいの日々精進XP
- ワーカー環境 – AWS Elastic Beanstalk
- Running cron jobs on Amazon Web Services (AWS) Elastic Beanstalk
- Pythonでrequests.get使った時SSLErrorが出ちゃう!