2
3

More than 1 year has passed since last update.

AWS+DockerコンテナにおけるStreamlit環境構築

Last updated at Posted at 2021-12-28

はじめに

WEBアプリケーションを開発するにあたり、AWSに構築したDockerコンテナ上におけるStreamlitの使い方について調査したのでまとめる。無料枠で構築するのでセキュアなWEBアプリケーションではないことにご注意ください。

セキュアにしたい場合は下記の技術記事を参照ください。

次の手順で環境構築の方法を説明する。

  • AWS VPCとEC2インスタンスの構築
  • Dockerの構築
  • StreamlitによるWEBアプリケーションの構築

最終的に構築したい環境は下図の通りである。

image.png

AWS VPCとEC2インスタンスの構築

参照資料をもとに下図のようにAWSのVPCとEC2インスタンスを構築する。

image.png

インバウンドルールは下記のように設定する。

image.png

参照資料

Dockerの構築

Dockerをインストールする。

$ sudo yum install -y docker
$ sudo systemctl start docker
$ sudo usermod -a -G docker ec2-user

自動起動を有効にする。

$ sudo systemctl enable docker

docker-composeをインストールする。

$ sudo curl -L https://github.com/docker/compose/releases/download/1.28.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

参照資料

StreamlitによるWEBアプリケーションの構築

コンテナを作成する。ポートの指定は下記の技術記事を参照した。

参照記事

$ docker run -it -p 443:8501 --name stl_hello jupyter/datascience-notebook  /bin/bash

app.pyファイルを作成する。

import streamlit as st
st.title("hello")

streamlitをインストールし、app.pyを実行する。

$ pip3 install streamlit
$ python3 -m streamlit run app.py

ターミナル上に下記が表示される。

image.png

ローカルPCのWEBブラウザで開く。
http://EC2インスタンスのIPアドレス:443

image.png

補足:Streamlitの常時実行

Streamlitを常時実行するには下記のように実行すればよい。

# EC2インスタンスでの実行
$ nohup docker run -it -p 443:8501 --name stl_hello jupyter/datascience-notebook  /bin/bash &
# Docker containerでの実行
$ nohup python3 -m streamlit run app.py &

実行されているか確認するには下記を実行すればよい。

$ ps -aux | grep docker

参照

補足:簡易的なStreamlitのユーザー認証

import streamlit as st


def is_authenticated(password):
    return password == "admin"


def generate_login_block():
    block1 = st.empty()
    block2 = st.empty()

    return block1, block2


def clean_blocks(blocks):
    for block in blocks:
        block.empty()


def login(blocks):
    blocks[0].markdown("""
            <style>
                input {
                    -webkit-text-security: disc;
                }
            </style>
        """, unsafe_allow_html=True)

    return blocks[1].text_input('Password')


def main():
    st.header('Hello')
    st.balloons()


login_blocks = generate_login_block()
password = login(login_blocks)

if is_authenticated(password):
    clean_blocks(login_blocks)
    main()
elif password:
    st.info("Please enter a valid password")

参照

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3