skydum

個人的な作業記録とか備忘録代わりのメモ

G検定の勉強

G検定

業務でAIを扱うことになったのでG検定の勉強をしている。
多少はAIを勉強したことがあったがG検定の公式テキストを読んでみたら知らないことだらけだった。

G検定を合格するのに必要な勉強時間はは30時間~40時間ぐらいと検索すると出てくるが、40時間ぐらいでは終わる気がしない…。
勉強を始めた時に公式テキストをとりあえず1週して概要を掴んで、2周めは分からない所を言葉を調べながら読み進めていると終わらない。
G検定に通るだけなら概要だけ掴んだほうが良いのかなと思う。 (まだテストを受けていないのでこの方法が正解かどうかはわからないが)

勉強に使ったサイト

問題集

AWS Redshift ServerlessにSQL Workbench/Jで接続

AWSのRedshift ServerlessにSQL Workbench/J(JDBC)で接続

Redshiftを使ってみたかったのでWindows10から接続してクエリを実行できる環境を作ってみた。 同じような記事はたくさんあるが、分かりづらかったので自分用のメモ。 今回はパブリックサブネットにRedshiftを構成してインターネット経由で自IPからのみ接続を許可する構成とした。

テストのために何度かRedshiftのクラスタの構築とか削除を実行したら思ったより時間がかかった。

Redshiftを利用するための準備

  • Redshiftを利用するにはVPCとサブネットが最低3個必要。
  • 作成したVPCで利用するセキュリティグループも必要となるので事前に作成しておくこと。
    • 今回はテストだったのでセキュリティグループには自IPからはすべてのTCP, ポート範囲: 0-65535とした。

Redshift Serverlessの利用のための設定

  1. 変更した箇所は以下のところ
    • 設定
      • 設定をカスタマイズ
    • 管理者ユーザー認証情報をカスタマイズ
      • 管理者ユーザー名: admin
      • 管理者ユーザーパスワード: 8~64文字で作成
    • 関連付けられたIAMロール
      • S3とRedshiftを連携させたい場合は設定が必要
      • 監査ログ記録: ログを取得するならチェックを入れる
    • ワークグループ
      • ベースRPU容量: テストなので最小値の8
      • ネットワークとセキュリティ
        • VPC: 事前に作成したVPCを指定
        • VPCセキュリティグループ: 事前に作成したセキュリティグループを指定
        • サブネット: 事前に作成したサブネットから3個を指定する(今回はパブリックサブネットを3個指定)
  2. 設定が完了したら「設定を保存」を押下すると完了。
    大体2分ぐらいで利用が可能になる。

インターネット経由でRedshiftにアクセスする

  1. マネージメントコンソールのRedshiftから「ワークグループの設定」を押下。
  2. 右下の「パブリックにアクセス可能」が「オフ」になっているとインターネット側からアクセスできないので設定を変更するために、「編集」ボタンを押下。
  3. 「[パブリックにアクセス可能]をオンにする」にチェックを入れて、「変更を保存」を押下する。
  4. 1分程度すると設定がオンになるが、すぐには設定が反映されていないようなので数分待ったほうが良い。

SQL Workbench/Jで利用するJDBC用の接続文字列の確認

  1. マネージメントコンソールのRedshiftから「ワークグループの設定」を押下。
  2. 後で利用するのでJDBCのところの文字列をコピーして保存しておく。

SQL Workbench/Jの設定

  1. SQL Workbench/Jをダウンロードする。
    https://www.sql-workbench.eu/

  2. Amazon Redshift JDBCドライバーをダウンロードする。
    https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/jdbc20-download-driver.html

  3. ダウンロードしたファイルを任意の場所に展開。
    今回はC:\Workbench-Build129-with-optional-libsに展開。
  4. C:\Workbench-Build129-with-optional-libs\JDBCDriversのフォルダを作成する。
  5. ダウンロードした Amazon Redshift JDBCドライバー(redshift-jdbc42-2.1.0.19.jar)をC:\Workbench-Build129-with-optional-libs\JDBCDriversにコピーする。
  6. C:\Workbench-Build129-with-optional-libs\SQLWorkbench64.exeを起動。
  7. 初回起動時に以下の画面が出てきたときは「Download JREを押下する。
  8. SQL Workbench/Jが起動してきたら「Manage Drivers」を押下する。
  9. Manage Driversの画面が開いたら左上の新規作成ボタンを押下。
    • Name: Redshift
    • Library: Libraryの横にあるフォルダボタンを押下して先程コピーしたC:\Workbench-Build129-with-optional-libs\JDBCDrivers\redshift-jdbc42-2.1.0.19.jarを選択。
    • Classname: 自動的に入る
    • Sample URL: jdbc:redshift://endpoint:port/database 単なる参考情報なので空欄でも可
    • OKを押下して完了。
  10. 赤枠内を埋めていく。
    • New Profile: Redshift
    • Driver: Redshiftを選択(これが出てこない場合はC:\Workbench-Build129-with-optional-libs\JDBCDriversにredshift-jdbc42-2.1.0.19.jarが存在するかどうか確認)
    • URL: マネージメントコンソールからコピーしたJDBCのURLをここに貼り付ける
    • username: admin
    • Password: Redshift構築時に入力したパスワード
    • 「Test」ボタンを押下して接続できるか確認する。
  11. 「Test」ボタンを押下してから以下の画面が出たら接続成功になるので、「OK」ボタンを押下して設定を保存しておく。

Redshift Serverlessの削除

  1. RedShift Serverlessを利用しない場合は削除しておきましょう。
  2. マネージメントコンソールのRedshiftから「ワークグループの設定」で「default-workgroup」を選択して「アクション」から「削除」を選択すると同時に「default-namespace」も削除できるので合わせて削除を実行。
    5分~10分ぐらいで削除が完了します。
  3. 作成したVPC, セキュリティグループ, IAMロールも削除します。
  4. 以上で完了。

windows10 + Apache2.4(Reverse Proxy) + waitress + Flask3.0の環境を構築

windows10 + Apache2.4(Reverse Proxy) + waitress + Flask3.x

WindowsでApache2.4 + mod_wsgiの場合numpyが動かない。 Python3.7 ~ Python3.11まで一応試したけど動かなかった。

Apache error log -- how to fix "numpy ImportError" or disable it?
https://stackoverflow.com/questions/69519963/apache-error-log-how-to-fix-numpy-importerror-or-disable-it

代替案としてwaitressを使って問題がないかテストをしたので構築時のメモ。
構築手順はとても簡単。

Waitress
https://docs.pylonsproject.org/projects/waitress/en/stable/index.html

1. 構築の準備

  1. Apache2.4のダウンロードをしてC:\Apache2.4に展開
  2. Microsoft Visual C++ 2015 再頒布可能パッケージ Update 3をダウンロードしてインストール
    Apacheを動かすのに必要
  3. Pythonのダウンロードをしてインストール
    ※インストール時にAdd python.exe to PATHのチェックをつけると便利です。

2. waitressとflaskの設定

  1. 以下のプログラムを任意の場所に保存
  2. 必要に応じてvenvを作成して、waitressとflaskをインストール
  3. python app.pyでアプリケーションを起動
# app.py  waitressの設定
from waitress import serve
from api import app

# リクエストを全てのインターフェイスで待ち受け
# ポート番号8080で待ち受け
# http://127.0.0.1:8080/ に来たリクエストも http://127.0.0.1:8080/test に来たリクエストも同じように扱う
# 同時に受け付けられるスレッド数を20とする
serve(app, host="0.0.0.0", port=8080, url_prefix="/test", threads=20)
# api.py flaskの設定

from flask import Flask, request, make_response
import json

app = Flask(__name__)


@app.route("/")
def status():
    headers = {
        key: str(value) for key, value in request.headers.items() if type(value) is str
    }
    res = make_response(
        "<br>".join([f"{key}: {value}" for key, value in headers.items()]), 200
    )
    res.headers["Content-Type"] = "text/html"
    return res

3. Apachehttpd.confの変更と起動

  1. Apacheに来たリクエストをhttp://127.0.0.1:8080/で動作させるwaitressに転送するためにC:\Apache24\conf\httpd.confをエディタで開いてhttpd.confの最下行に以下の内容を追加
  2. コマンドプロンプトC:\Apache24\binを開いてhttpdを実行
  3. ブラウザからhttp://127.0.0.1/にアクセスするとレスポンスが表示されます
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

ProxyRequests Off
ProxyPass / http://127.0.0.1:8080/        # http://localhostにアクセスが来たらhttp://127.0.0.1:8080/へリクエストを転送する設定
ProxyPassReverse / http://127.0.0.1:8080/    # http://localhostにアクセスが来たらhttp://127.0.0.1:8080/へリクエストを転送する設定

AWSのService Quotasからクォータの緩和申請を行う

AWS EC2のvCPUの緩和申請の方法

手元のPCではスペック不足でAIが動作しなかったので、EC2で動かそうとしたらエラーが出てインスタンスが起動しなかった。 EC2のサービス クォータに引っかかったので緩和申請を行う。

AWSにサービス クォータの緩和申請を行う

リージョンを変更する

クォータはリージョン毎に制限が異なるため、EC2インスタンスを立てたいリージョンに変更してから緩和申請の作業を行ってください。

緩和申請を行うにはvCPUの数が必要なので調べる

インスタンスタイプ
https://us-east-1.console.aws.amazon.com/ec2/home?region=us-east-1#InstanceTypes:

今回起動したいインスタンスg4dn.xlargeなのでvCPUの数は4個。

緩和申請を行うためにService Quotasを開く

  1. EC2のクォータを変更したいのでAmazon Elastic Compute Cloud (Amazon EC2)をクリック。

クォータの申請を行う対象を選ぶ

  1. クォータを検索の検索窓に「On-demand」と入力して検索。
  2. 検索結果が表示されたら、今回はGタイプのインスタンスのクォータを変更したいので選択。
  3. 選択したら右上の「アカウントのクォータを増やすをクリック」。

クォータの引き上げをリクエストする

  1. クォータの引き上げリクエストの画面が表示されたら、クォータ値を変更に「4」を入力して、リクエストをクリック
  2. リクエストが完了するとAWS空メールが届きます。
    またダッシュボードで現在の申請状況を確認することが可能です。

ダッシュボードでリクエスト状況の確認

  1. リクエストをクリックした後でダッシュボードの下の方に現在のステータスが表示。

審査完了後

  1. 申請内容の審査が終わると審査結果の書かれたメールが届き、ダッシュボードの画面上は以下のように表示されます。
    今回は申請が完了してから承認されるまで15分程度でした。

クォータが反映されたか確認する

  1. クォータの引き上げの申請が承認されてから反映されるまで約30分程度かかります。
  2. 「最近解決したサービスのクォータのリクエスト」に表示されているリンクをクリックすると設定が反映されたかどうか確認できます。

EC2インスタンスの起動

無事起動することができました。

windows+apache2.4+mod_wsgi(コンパイル)+flask(venv)の環境を構築する

windows+apache2.4+mod_wsgi+flask(venv)

Windows上でApacheを動かしてmod_wsgiでFlaskが動作する環境を作る必要があったので、作業メモ。 mod_wsgiWindowsコンパイルしてインストールを行います。

設定に利用したファイルは記事の最後にの掲載しています。

環境

インストール作業

インストール手順

  1. Python3.11.xをインストール
  2. Apache2.4.xをインストール
  3. mod_wsgiをインストール
  4. Flaskのインストールとアプリケーションを作成
  5. Apachehttpd.confを編集
  6. Apacheを起動して動作テスト

Python3.11.xのダウンロードとインストール

下記のリンクからpythonをダウンロードして、全てデフォルトでインストールを行う。

https://www.python.org/downloads/

Apache2.4.xのダウンロード

下記のリンクからファイルをダウンロードしてC:\Apache24にファイルを展開する
別の所に展開するとmod_wsgiが正常に動かないので変更しないこと

https://httpd.apache.org/download.cgi

mod_wsgiのインストール(詳細版)

システムにmod_wsgiをインストールする
手順は長いですが結構簡単です。

  1. pythonにパスが通っていないのでpythonのインストール場所へ移動する。
    cd C:\Users\%USERNAME%\AppData\Local\Programs\Python\Python311

  2. pipのバージョンを最新にする。
    python -m pip install --upgrade pip

  3. mod_wsgiをインストールする(エラーが出て失敗すると思います。)
    python -m pip install mod_wsgi

  4. エラーを解消していきます。
    Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/ がないと怒られているのでダウンロード。

  5. ダウンロードしたファイルを実行して暫く待つと以下の画面が現れるので、C++によるデスクトップ開発にチェックを入れてインストールを実行。

  6. インストールが完了したら閉じる

  7. 再度python -m pip install mod_wsgiを実行すると、またエラーが出ます。

  8. エラーを解消していきます。
    Apacheのヘッダファイルがないと怒られています。
    c:\Apache24\include\apr_network_io.h(29): fatal error C1083: include ファイルを開けません。'apr_perms_set.h':No such file or directory

  9. Apacheが利用するAPIコンパイルするために利用するファイルをダウンロード。
    https://apr.apache.org/download.cgi

  10. ファイルがダウンロードできたらC:\apr-1.7.4にファイルを展開する。

  11. apr_perms_set.hをmod_wsgiのインストール時にMS Build Toolが利用できるように環境変数にパスを通す。
    インストール時に見つからなかったapr_perms_set.hC:\apr-1.7.4\includeに入っています。

  12. コマンドプロンプトに以下の文字を入力します。
    SET INCLUDE=C:\apr-1.7.4\include

  13. 再度python -m pip install mod_wsgiを実行するとインストールに成功します。

Flaskのインストールとアプリケーションを作成

Flaskのインストールとvenvの作成

  1. mkdir c:\flask-app
  2. cd c:\flask-app
  3. c:\Users\test\AppData\Local\Programs\Python\Python311\python.exe -m venv venv
  4. venv\Scripts\activate
  5. pip install --upgrade pip
  6. pip install flask

Flaskで作ったアプリケーションの構成

app.wsgi mod_wsgiでFlaskを動かすときに必要となるファイル

#!C:/flask-app/venv/script/python.exe  # venvの中のpythonのパスを記載する
import sys

# 今回作ったアプリケーションを動かすためにPythonPathに追加する
sys.path.insert(0, r'C:/flask-app')

# venvで仮想環境を利用するので仮想環境のPythonPathを追加する
sys.path.insert(0, r'C:/flask-app/venv/Lib/site-packages')

# as applicationは変更できません
from api import app as application

Apachehttpd.confを編集

  1. mod_wsgiApacheで動作させるにはmod_wsgiがpip installでインストールされた場所の情報が必要となるので以下のコマンドを実行する必要があります。
    mod_wsgi-express module-config

  2. コマンドプロンプトを開いて以下の場所へ移動します。
    cd C:\Users\%USERNAME%\AppData\Local\Programs\Python\Python311\Scripts

  3. mod_wsgi-express module-configを実行すると以下のように情報が表示されますので、メモ帳などに保存しておいてください。

  4. テキストでディタでApacheのコンフィグファイルを開きます。
    C:\Apache24\conf\httpd.conf

  5. ファイルが開いたら先程メモ帳に保存しておいた内容をhttpd.confの最終行に追記。

  6. WSGIPythonHomeに記載されているPythonのパスをvenvの中のpythonに変更します。
    c:\flask-app\venv\Scripts

  7. 上記を追加した更に下側にflask-appをApacheが認識できるように設定を追加します。

Apacheを起動して動作テスト

  1. コマンドプロンプトを開く
  2. cd c:\Apache24\bin
  3. httpd -t で構文チェックを行い問題がないことを確認
  4. http
  5. ブラウザを開いてhttp://localhost/statusにアクセスして以下の表示が出たら正常に起動しています
  6. プログラムを修正した場合はhttpdを一度停止して、再度起動し直してください。
    WindowsではWSGIDaemonProcessが利用できず、WSGIScriptReloadingも利用できないため、プログラム修正時はApacheの再起動が必須です。

ソースコード全文

1. api.py(クリックすると展開します)

from flask import Flask
from flask.json.provider import DefaultJSONProvider

DefaultJSONProvider.ensure_ascii = False


app = Flask(__name__)

COUNT = 0


@app.route("/status", methods=["GET"])
def status():
    return {"status": "正常"}


@app.route("/count", methods=["GET"])
def count_up():
    global COUNT
    COUNT += 1

    return {"count": COUNT}


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

2. app.wsgi(クリックすると展開します)

#!C:/flask-app/venv/script/python.exe

import sys
sys.path.insert(0, r'C:/flask-app')
sys.path.insert(0, r'C:/flask-app/venv/Lib/site-packages')

from api import app as application

3. httpd.conf(クリックすると展開します)

# httpd.confの下に追記してください
LoadFile "C:/Users/test/AppData/Local/Programs/Python/Python311/python311.dll"
LoadModule wsgi_module "C:/Users/test/AppData/Local/Programs/Python/Python311/Lib/site-packages/mod_wsgi/server/mod_wsgi.cp311-win_amd64.pyd"
#WSGIPythonHome "C:/Users/test/AppData/Local/Programs/Python/Python311"
WSGIPythonHome "C:/flask-app/venv/Scripts"

# Apacheの80ポートにアクセスが来た時の設定を記載する
<VirtualHost *:80>
    # レスポンスヘッダに含まれるサーバー名
    ServerName localhost

    # http://IP/ にアクセスが来た時にどこのフォルダを参照するのか
    DocumentRoot "C:/flask-app"

    # http://IP/ にアクセスが来た時に "C:/flask-app/app.wsgi"を実行する
    WSGIScriptAlias / "C:/flask-app/app.wsgi"

    # 以下の様にした場合は http://IP/test にアクセスが来た時に "C:/flask-app/app.wsgi"を実行する
    # WSGIScriptAlias /test "C:/flask-app/app.wsgi"

    # c:/flask-appへのアクセスを許可する
    <Directory "C:/flask-app">
        Require all granted
    </Directory>
</VirtualHost>

Docker + python + mysqlclientをインストール

Docker + python + mysqlclientをインストールする

Dockerにmysqlclientを入れようとした所ちょっとハマったので忘れないようにメモ。
mysqlclientは色々なOSにインストールする度に躓いてしまう。
mysqlclientのバージョンによって少しだけ必要なパッケージが異なる。

Dockerの中にmysqlclientを入れるためとはいえ、gccとか入れておきたくはないのでマルチステージビルドをした方が良いのかなと思いつつも、検証用に使うだけなのでこのまま使うこととする。

mysqlclient<2.2.0の場合

  • python 3.11.4
  • mysqlclient<2.2.0
FROM python:3.11.4-slim

RUN apt-get update \
    && apt-get install --no-install-recommends -y default-libmysqlclient-dev gcc \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY . /app

RUN pip install --no-cache-dir --upgrade pip && pip install --no-cache-dir -r requirements.txt

EXPOSE 5000

CMD ["python", "app.py"]

mysqlclient>=2.2.0の場合

  • python 3.11.4
  • mysqlclient>=2.2.0
FROM python:3.11.4-slim

RUN apt-get update \
    && apt-get install --no-install-recommends -y default-libmysqlclient-dev gcc pkg-config \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY . /app

RUN pip install --no-cache-dir --upgrade pip && pip install --no-cache-dir -r requirements.txt

EXPOSE 5000

CMD ["python", "app.py"]

Amazon CodeWhispererでinvalid clientエラー

Amazon CodeWhispererでinvalid clientエラーが出て使えなくなった

vscodeでCodeWhispererを使おうとAWS Toolkitから以下の画面を開いてvscodeに表示されているコードを入力し、

メールアドレスとパスワードを入力すると認証が完了するはずだけれども以下の画面が出て認証に失敗した。

調査

ブラウザのデベロッパーツールを開いて通信を除いてみるとSSOのあたりで失敗している。

調べてみたら以下のIsusueが見つかった
invalid_client error when signing in with AWS Builder ID #3706

解決

windowsの場合は以下のフォルダにあるファイルを削除すると良いらしいので削除したところ無事使えるようになった。