普通のシステムエンジニアの備忘録

きみひで と言います。個人勉強で触れた技術など備忘禄と時々日常を綴ります。

【超簡単】FlaskアプリをElastic beanstalkにデプロイ

さっぱりピーマンな自分が備忘のために、

Flaskで作ったアプリをAWSのElastic beanstalkにデプロイする手順をまとめます。

 

参考にさせていただいたサイト

Elastic Beanstalk への Flask アプリケーションのデプロイ - AWS Elastic Beanstalk

微妙にバージョンや環境が異なりハマったので、私なりにリライトしてみます。

 

【実行環境】

OS:windows11

 

【初期設定】

最初にEB CLIというのを使います。

以下のサイトが参考になると思います。ググると色々でてきますので適時お願いします。

ebコマンド(awsebcli)のインストール #AWS - Qiita

 

【Flask で Python 仮想環境を設定する】

コマンドプロンプトでebっていれると別ウィンドウが上がってくる

こんな感じでコマンドプロンプトがもう一つ上がってくる。こちらをメインに作業する

 

プロジェクトディレクトリを作成&移動

■コマンド

 mkdir eb-flask
 cd eb-flask
実行結果

 

virt という名前の仮想環境を作成してアクティブ化

■コマンド

virtualenv virt

.\virt\Scripts\activate

★参考サイトだとactivateの部分がsourse~~ってなってますが、Windowsの場合だとコマンドが違うので注意です。

実行結果

コマンドプロンプトの先頭に (virt) と表示され、仮想環境を使用していることが示されます。このチュートリアルの残りの部分では、仮想環境を使用します。

 

pip install で Flask をインストール

■コマンド
pip install flask==2.3.3
★参考サイトでは、バージョンが2.0.3になっているが、この後でてくるWerkzeugとバージョンが合わないので、上位バージョンを選ぶこと
そのあたりが書いてある参考サイト

Flaskでurl_quoteが見つからなくなった問題 #Python - Qiita

実行結果

pip freeze で、インストールされているライブラリを表示

■コマンド
pip freese
実行結果

このコマンドは、仮想環境にインストールされるすべてのパッケージを一覧します。仮想環境にいるため、EB CLI などのグローバルにインストールされたパッケージは表示されません。

 

pip freeze からの出力を、requirements.txt という名前のファイルに保存
■コマンド
pip freeze > requirements.txt
実行結果

このファイルは、デプロイ中にライブラリをインストールするよう Elastic Beanstalk に指示します。

 

【Flask アプリケーションを作成する】

次に、Elastic Beanstalk を使用してデプロイするアプリケーションを作成します。ここでは、"Hello World" という RESTful ウェブサービスを作成します。    このディレクトリに、application.py という名前と以下の内容で新しいテキスト・ファイルを作成します   
 ★ファイル名は「application.py」にすること。それ以外の名前にすると上手くいかない。 Elastic beanstalkの構成設定でこの名前で固定になっているようす。
詳細は、こちらのサイトにあります。

Elastic BeanstalkでPython3.6/Flask1.0アプリを動かす | DevelopersIO

 

application.py のソース

from flask import Flask

# ==================================================
# ==================================================
application = Flask(__name__)

# ==================================================
# ルーティング
# ==================================================
@application.route('/')
def hello_world():
    return '<h1>ハローワールド</h1>'

if __name__ == "__main__":
    application.debug = True
    application.run()

ハローワールドと表示させるだけのシンプルソースです。

 

Python を使用して application.py を実行

■コマンド
python application.py
実行結果

ブラウザで以下のULR叩いてハローワールドと表示されればOKです。
http://127.0.0.1:5000/

終わるときは、コマンドプロンプトを選択してCtrl+C を押すと、ウェブ・サーバーを停止して仮想環境に戻ることができます。

 

【EB CLI でサイトをデプロイ】

ここまでで、Elastic Beanstalk でアプリケーションをデプロイするために必要な条件をすべて追加しました。プロジェクトディレクトリは次のようになります。

ただし、virt フォルダは、Elastic Beanstalk でアプリケーションを実行するために必要ありません。デプロイすると、Elastic Beanstalk によりサーバーインスタンスに新しい仮想環境が作成され、requirements.txt にリストされているライブラリがインストールされます。デプロイ中にアップロードする出典バンドルのサイズを最小化するには、virt フォルダを離れるように EB CLI に指示する .ebignore ファイルを追加します。

↑このファイルを作る。

 

環境を作成し、Flask アプリケーションをデプロイ

eb init コマンドで EB CLI リポジトリを初期化します
■コマンド
eb init
実行すると別のウィンドウが立ち上がってきます。

regionなど設定を聞いてくるので回答していきます。
・region
 9) ap-northeast-1 : Asia Pacific (Tokyo)

 今回はTokyoにしておきます。どこでもいいです。

 

・アプリケーション名

→デフォルト: eb-flask  にします。

 

Pythonですか?

→Yesですね

 

・プラットフォームは?

1:1) Python 3.11 running on 64bit Amazon Linux 2023

書いてなかったですが、Python3.11を使っているので1を選択

 

 

SSH設定しますか?

→Yes

 

・キーペア選んで

新しいのつくってみます。4


・キータイプの名前は?

デフォルトにしておきます。

 

パスフレーズは?

空っぽでもよさそうなので、何も入れずにEnter。


ここまでで、一通り終わりです。

あと少しです。

 

環境を作成し、eb create を使用してそこにアプリケーションをデプロイ
■コマンド
eb create flask-env
実行結果(途中・・・5分くらいかかります)

 

デプロイが終わりましたので結果の確認です。

■コマンド
eb open

ブラウザが立ち上がり、サイトが見えればOKです。

お疲れさまでした。

 

【再デプロイ】

デプロイやり直す手順も書いておきます。

ソースの修正

今回はapplication.pyの一部を変更

再デプロイ

■コマンド
eb deploy
実行結果

再びeb openコマンドでサイトを開くと、変更が適用されていることがわかります。

 

AWSの管理画面で見ても、デプロイされていること確認できます。

 

【AIに負けるな】Python FlaskをAWS環境に構築目標

画像生成AIみたいに、やりたいことを書くとアッという間にWebサイトを作ってしまうツールが現れたという記事を見かけました。

SNS「X」が作れた!Webサイト自動作成AIツール「Create.xyz」の使い方 | AI-ワークスタイルlAIツールで仕事を効率化させるAIメディア (ai-workstyle.com)

 

 

create.xyzという名前らしいです。↓こやつです。

Create - free-to-use AI app builder

 

恐ろしい時代ですね。

そんな中、Djangoメインに個人開発してたんですが、小さいアプリ作る機会が増えてきたので軽いアプリ向けって噂のFlaskってフレームワークを覚えていきたいと思います。

 

まだ宣言だけなので、追記していきます。

 

Step1 Flaskを写経して覚える

Step2 AWSのElastic beanstalkで、最小限の力でウェブ公開

 

この2ステップで頑張ろうと思います。

では、まずインプットやっていきます。

-------------------------------------------------------

追記

Flaskの写経を少しやった

ハローワールドの表示Done

簡単なテンプレートhtmlで3画面遷移の画面作成Done

で、この時点でElastic beanstalkにアップすることに挑戦することにした。

明日は、そのあたりについてやってみる。

 

ー--------------------------

追記2

↓のサイトを参考に、同じようにやったらアップロード完成した。

初心者向け『Elastic Beanstalk への Flask アプリケーションのデプロイ』をやってみた | DevelopersIO

 

写経している環境も、Pythonのファイル名を変更したらなぜかできた。

変更前:app.py

変更後:application.py

これって名前固定のルールとかある・・?

と思いつつ調べると、指定が必要等の記事があった。

 

Elastic BeanstalkでPython3.6/Flask1.0アプリを動かす | DevelopersIO (classmethod.jp)

こちらのサイトに以下の記載が・・・

 

ハマったわ~。

とりあえず光が見えてよかった。

 

 

 

 

 

 

 

 

【非公式】はてなブログのサブアカウント切り替え方法

はてなブログで、サブアカウントが作れるみたいなので作ったんですが、メインアカウントに戻す方法が分かりにくかった(泣)

 

同じような人もいると思うので備忘として残しておきます。

 

Step1 はてなブログのヘッダー右端にいるアイコンをクリック。

    そうすると、右側にログインしてるユーザIDとかのウィンドウが出てくる。

 

はてなブログヘッダー

Step2 Step1のウィンドウの一番下にいる「©Hatena」をクリック。

    はてなのトップ画面が表示される。

 

Step3 自分のアイコン下にあるIDをクリック。Myはてな管理画面へたどり着く。

 

Step4 設定ボタンをクリック。はてなアカウント情報の詳細画面へ移動する。

   もう少し!

Step5 画面を下の方へスクロールするとサブアカウント設定のボタンが出てくるので、そこをクリック。

Step6 これで最後。サブアカウントのIDとアドレスの横に切り替えボタンがあるので、そこをクリックする。そうするとアカウントが切り替わります。

 

 

かなり回り道してる気もしてますが、画面ポチポチして切り替えができるので、今のところは、こうやってアカウント切り替えしてます。

 

ログアウト&ログインが王道かもしれませんが、私と同じようにポチポチしたい人はこれでやってみてください(笑)

 

Python スケジュールのエクセルからWBSのフォーマットを吐き出す

スケジュール表をWBSにする必要が出てきた。

ただ、スケジュールがコロコロ変わるので、それに合わせてWBSもメンテする必要がある。

毎回WBSに書くのは面倒なので、WBSの形式にアウトプットするプログラムを組んだ!

 

 

import openpyxl
import pprint
import os


####書き出しエクセルの情報
#書き出すエクセルファイル
resultFileName = 'output.xlsx'
resultFile = openpyxl.load_workbook(resultFileName)
#書き出しカラム
out_planday_start   = "B"
out_planday_end     = "C"
out_taskName       = "A"
out_doneday_start  = "B"
out_doneday_end    = "C"
out_pic            = "D"

# シートを取得
sheetResult = resultFile['Sheet1']
resultGyo = 1

 

#計画日がセットされる列
plandayColumn = "A"
#タスク名がセットされる列
taskNameColumn = "B"
#実績日がセットされる列
danedayColumn = "C"
#担当者がセットされる列
picColumn = "D"

 

#Sheet名
SheetName = "Sheet1"

readFile = "test.xlsx"

for num in range(10):
    caseGyo = str(num + 1)
#    print(caseGyo)
    planday  =  plandayColumn  + caseGyo
    taskName =  taskNameColumn + caseGyo
    daneday  =  danedayColumn  + caseGyo
    pic      =  picColumn      + caseGyo

    wb = openpyxl.load_workbook(readFile)
    sheet = wb[SheetName]
    cell1 = sheet[planday]
    cell2 = sheet[taskName]
    cell3 = sheet[daneday]
    cell4 = sheet[pic]

    if (cell1.value == None):
       continue
    print(readFile, ",", cell1.value, "," , cell2.value,"," , cell3.value,"," , cell4.value)

 

    sheetResult[out_planday_start     + str(resultGyo)] = cell1.value
    sheetResult[out_planday_end       + str(resultGyo)] = cell1.value
    sheetResult[out_taskName          + str(resultGyo)] = cell2.value    
    sheetResult[out_pic               + str(resultGyo)] = cell4.value    
    
    if (cell1.value != None):
       sheetResult[out_doneday_start     + str(resultGyo+1)] = cell3.value
       sheetResult[out_doneday_end       + str(resultGyo+1)] = cell3.value
    
    resultGyo = resultGyo + 2

# 保存する
resultFile.save(resultFileName)
    

PowerShell 定期的にフォルダをZIP化して対比しておくソース2

先日作成したShellだけど、コピー元のファイルを削除してはいけなかったので、24時間以内に作成されたファイルのみ抜き出して圧縮するように変更した。

 

以下ソースー----------------------

#定期的にフォルダをZIP化して対比しておくソース

#イベントログを書き出す関数
function writeEventlog([String]$LEVEL, [String]$MESSAGE){

}


$deletetime = Get-Date
$deletelimittime =  (Get-Date).AddHours(-24) 
$nametime = Get-Date -UFormat "%Y%m%d"
#対象フォルダリスト
$ConfFile = "C:\Users\user\Desktop\wk\20220630\FileArchiveList.conf"
#zipファイルの移動先フォルダ
$movepath = "C:\Users\user\Desktop\wk\20220630\moveTo"
#0:正常、1:異常
$SHELLRET = 0 


#main
writeEventlog "INFO" ("start")
writeEventlog "INFO" ("ConfigFile=" + $ConfFile)


#対象フォルダリスト読み込み
$ArchiveList = Get-Content $ConfFile

foreach($Confline in $ArchiveList){
    if($Confline -match "^$"){ continue }
    if($Confline -match "^#"){ continue }

    try{
        #コピーフォルダ
        $copypathFrom = $Confline
        $copypathTo  = $copypathFrom + "_" + $nametime
        $copypathToZip = $copypathTo + ".zip"
        $copypathToDummyFile = $copypathTo + "\" + $nametime

        ##フォルダ作成
        #Copy-Item $copypathFrom -destination $copypathTo -recurse
        New-Item $copypathTo -ItemType Directory

        echo $copypathToDummyFile 
        #ダミーファイル作成
        Out-File $copypathToDummyFile

        #24時間以内に作成されたファイルをコピー
        Get-ChildItem $copypathFrom | 
        Where-Object{ -not $_.PSIsContainer } |
        Where-Object{ $_.CreationTime -gt $deletelimittime } |
        Copy-Item -destination $copypathTo


        #ZIP圧縮
        Compress-Archive -Path $copypathTo -DestinationPath $copypathToZip

        #フォルダ削除
        Remove-Item -Path $copypathTo -Recurse

        #zipファイル移動
        Move-Item $copypathToZip $movepath 

        #古いファイル削除
        #Get-ChildItem -Path $copypathFrom -Recurse | Where-Object{$_.LastWriteTime -lt $deletetime} | Remove-Item -Force #-WhatIf
    }catch{
        writeEventlog "ERROR" ("Archive error. RET=" + $RET_CMD + " Exception=" + $_.Exception)
        $SHELLRET = 1
    }

}

exit $SHELLRET

 

PowerShell 定期的にフォルダをZIP化して対比しておくソース

日次でファイルのアーカイブしなきゃいけなくなったので作成したPowershell

 

FileArchiveList.confを用意

 

以下ソースー----------------------

#定期的にフォルダをZIP化して対比しておくソース

#イベントログを書き出す関数
function writeEventlog([String]$LEVEL, [String]$MESSAGE){

}


$deletetime = Get-Date
$nametime = Get-Date -UFormat "%Y%m%d"
#対象フォルダリスト
$ConfFile = "C:\Users\user\Desktop\wk\20220630\FileArchiveList.conf"
#zipファイルの移動先フォルダ
$movepath = "C:\Users\user\Desktop\wk\20220630\moveTo"
#0:正常、1:異常
$SHELLRET = 0 


#main
writeEventlog "INFO" ("start")
writeEventlog "INFO" ("ConfigFile=" + $ConfFile)


#対象フォルダリスト読み込み
$ArchiveList = Get-Content $ConfFile

foreach($Confline in $ArchiveList){
    if($Confline -match "^$"){ continue }
    if($Confline -match "^#"){ continue }

    try{
        #コピーフォルダ
        $copypathFrom = $Confline
        $copypathTo  = $copypathFrom + "_" + $nametime
        $copypathToZip = $copypathTo + ".zip"
        $copypathToDummyFile = $copypathTo + "\" + $nametime

        #フォルダコピー
        Copy-Item $copypathFrom -destination $copypathTo -recurse

        echo $copypathToDummyFile 
        #ダミーファイル作成
        Out-File $copypathToDummyFile

        #ZIP圧縮
        Compress-Archive -Path $copypathTo -DestinationPath $copypathToZip

        #フォルダ削除
        Remove-Item -Path $copypathTo -Recurse

        #zipファイル移動
        Move-Item $copypathToZip $movepath 

        #古いファイル削除
        Get-ChildItem -Path $copypathFrom -Recurse | Where-Object{$_.LastWriteTime -lt $deletetime} | Remove-Item -Force #-WhatIf
    }catch{
        writeEventlog "ERROR" ("Archive error. RET=" + $RET_CMD + " Exception=" + $_.Exception)
        $SHELLRET = 1
    }

}

exit $SHELLRET

 

SQL serverでバックアップ復元する方法

仕事でバックアップの復元しようとおもったら困ったので備忘録

 

SSMSのDB右クリックし、タスク→復元→データベースを選択

 

タイムラインをクリック


特定の日付と時刻を設定してOK!

 

失敗したら、ここの「接続先データベースへの既存接続を閉じる」オプションをチェック