やったこと
AWSのサービスをまだ全然理解できてない(特にコンテナ周り)のでまずはEC2にインスタンス立ててその中にdjangoで作ったwebサーバーを入れたコンテナを立ててアクセスする。という流れをやってみました。djangoを使ったwebページはすでに作成していることを前提に話を進めていきます。
開発環境
- python3.6.5
- django 2.0.6
- docker 18.03.1-ce
インスタンスを立てる
AWSコンソールからインスタンスを作成します。今回はAmazon Linux 2
のt2.micro
を使用しました。
また、今回はdjangoのアプリのリポジトリをあらかじめcode commitに作成したのでインスタンスにcode commitの権限を付与したロールを設定します。djangoを使って8000ポートからアクセスするようにするのでセキュリティグループのルールに8000 tcp 0.0.0.0/0
を設定します。
必要なものをインスタンスにインストールする
$ yum update
$ yum install -y docker
$ yum install git
先ほども書いたように今回はdjangoで作成したwebページをcode commitにあげているのでgitもインストールします。
$ git config --global credential.helper '!aws --region ap-northeast-1 codecommit credential-helper $@'
$ git config --global credential.UseHttpPath true
codecommitからクローンできるように設定をします。この設定に関してはこの記事を参考にさせていただきました。
イメージの作成
開発環境が整ったらイメージの作成をします。
今回はcode commitからコードを取ってきているのでdjangoの使い方等は割愛します。
今回Dockerfileは以下のようになっています。
FROM ubuntu:17.10
RUN mkdir -p /root/firm/ \
&& mkdir -p /root/firm/django_app \
&& mkdir -p /root/.aws
COPY vis_ml /root/firm/django_app/
COPY aws /root/.aws/
RUN apt update \
&& apt install apt-utils -y \
&& apt install python3 -y \
&& apt install python3-pip -y \
&& pip3 install -r /root/firm/django_app/requests.txt \
&& pip3 install awscli
EXPOSE 8000
CMD ["python3", "/root/firm/django_app/manage.py", "runserver", "0.0.0.0:8000"]
以下を実行してイメージの作成を行います
$ docker build -t django_app .
無事にイメージを作ることができました。
REPOSITORY TAG IMAGE ID CREATED SIZE
django_app latest 234567890123 About an hour ago 1.58GB
ubuntu 17.10 123456789012 3 weeks ago 100MB
コンテナの起動
以下のコマンドを実行してコンテナを起動します。今回は8000番ポートをdjangoのwebページに使用しているので8000を開けるようにします。
$ docker run -p 8000:8000 -d django_app:latest
これでできた!と思って http://パブリックDNS:8000
にアクセスすると
DisallowedHost at Invalid HTTP_HOST header: ‘hoge:8000’. You may need to add ‘hoge’ to ALLOWED_HOSTS.
と怒られてしまいました。
調べてみると、djangoのフォルダにある setting.py
の中にあるALLOWED_HOSTS = []
の部分にインスタンスのパブリックIPとDNSを入力してあげたら良さそう。
これを設定してイメージを作り直し、コンテナを起動して再度http://パブリックDNS:8000
にアクセスするとHello, world. You're at the polls index.
と無事に応答がありました!
最後に
意外と簡単にインスタンスにコンテナを立ててwebサーバーにする。という部分はできました。まだ全然勉強できてないけどECSとかfargateとか使ったらもっと楽にできるのかなぁと…その辺はもっと勉強します。