show log include yuh

勉強したことの復習を兼ねて、IT関係(ネットワーク/サーバ/アプリケーション)についてまとめてます。たまに趣味のこと

スポンサーリンク

ユーザ名やパスワードをプログラムに埋め込まないために

概要

クラウドサービスから情報を取得したりするとき、プログラムを書くとき、ハードコーディングしないための方法です。
今回は環境変数を利用してハードコーディングでgithub等にあげてしまわないようにします。
クラウドのデータベースをSQLAlchemyで読み込み、Flaskを実行するプログラムを例にしています。

方法

自分のOS内だけにもつ環境変数を用い、動作させるプログラムにユーザ名とパスワードを入力せず、環境変数から取得するように書きます。

環境変数をセット

今回の例では3つの環境変数(db_acount,db_passwd,db_url)に指定した値を定義しています。exportで代入する環境変数はシェルを閉じた瞬間消えてしまうため、環境変数を定義する場合は現在のシェルを実行するsourceを使います。
source variable.sh

#variable.sh
#!/bin/sh
export db_user="<db_user_name>"
export db_passwd="<db_password>"
export db_host="<db_host>"
export db_name="<db_name>"

環境変数をプログラムから読み込む

os.environ.getを利用することで先ほど定義した環境変数を読み込むことができます。
以下では先ほどの環境変数を読み込み、クラウドMySQLに接続するコードです。
プログラム内にはユーザ名やパスワードを入力されていないためソースコードを安全にgithub等にあげることができます。

# application.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_sslify import SSLify
import os

user = os.environ.get("db_acount")
password = os.environ.get("db_passwd")
host    = os.environ.get("db_url")
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://{0}:{1}@{2}/{3}?charset=utf8".format(db_user,db_password,db_host,db_name)
app.config["JSON_AS_ASCII"] = False
db = SQLAlchemy(app)

class UserData(db.Model):
    __tablename__ = "db"
    id      = db.Column(db.Integer, primary_key=True)
    message = db.Column(db.Text)
with app.app_context():
    db.create_all()

#Setting_Flask
app = Flask(__name__)
sslify = SSLify(app)

#API-routing
@app.route...