#!/bin/bash
yum update -y
yum install -y python3-pip jq
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
REGION=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/placement/region)
SECRET_ARN=$(aws rds describe-db-instances \
--db-instance-identifier production-db \
--query 'DBInstances[0].MasterUserSecret.SecretArn' \
--output text --region $REGION)
SECRET_JSON=$(aws secretsmanager get-secret-value \
--secret-id "$SECRET_ARN" \
--query SecretString --output text --region $REGION)
DB_USER=$(echo "$SECRET_JSON" | jq -r '.username')
DB_PASS=$(echo "$SECRET_JSON" | jq -r '.password')
DB_HOST=$(aws rds describe-db-instances \
--db-instance-identifier production-db \
--query 'DBInstances[0].Endpoint.Address' \
--output text --region $REGION)
mkdir -p /opt/guestbook
python3 -m venv /opt/guestbook/venv
source /opt/guestbook/venv/bin/activate
pip install flask pymysql
cat > /opt/guestbook/app.py <<'PYEOF'
from flask import Flask, request
import pymysql, os
app = Flask(__name__)
def get_db():
return pymysql.connect(
host=os.environ['DB_HOST'],
user=os.environ['DB_USER'],
password=os.environ['DB_PASS'],
database='guestbook', autocommit=True)
@app.route('/health')
def health():
return 'OK', 200
@app.route('/')
def index():
db = get_db()
cur = db.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS messages (id INT AUTO_INCREMENT PRIMARY KEY, msg TEXT, ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP)")
cur.execute("SELECT msg, ts FROM messages ORDER BY ts DESC LIMIT 20")
msgs = cur.fetchall()
html = "<h1>Guestbook</h1><form method=POST><input name=msg><button>Envoyer</button></form>"
for m in msgs:
html += f"<p><b>{m[1]}</b>: {m[0]}</p>"
return html
@app.route('/', methods=['POST'])
def post():
db = get_db()
cur = db.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS messages (id INT AUTO_INCREMENT PRIMARY KEY, msg TEXT, ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP)")
cur.execute("INSERT INTO messages (msg) VALUES (%s)", (request.form['msg'],))
return index()
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
PYEOF
export DB_HOST="$DB_HOST" DB_USER="$DB_USER" DB_PASS="$DB_PASS"
cd /opt/guestbook && nohup /opt/guestbook/venv/bin/python app.py &