Aurora を夜間停止する
API は呼び出された時だけ料金が発生しますが、データベースサーバーは稼働中ずっと課金されます。 今回作成したリソースの中でも Auroro の料金が最も高いので、サーバーを一時停止させないで帰宅してしまった時に自動的に一時停止するようにします。
aws-tools
定期実行は AWS EventBridge のスケジュールを定義して行います。
EventBridge では AWS のリソースに対して API を呼ぶように定義することができます。 が、1つのイベントで複数の処理をしたり要件が複雑になったときに EventBridge に記述するのがキツくなるというのと、 OpenTofu の記述が複雑になるので、よく使う API をラッピングした aws-tools という Docker イメージを用意して、これを呼ぶことで実現したいと思います。
https://github.com/spin-dd/aws-tools にプロジェクトがありますので、これを clone して ビルドし、作成した Docker イメージを API 実装と AW 基盤構築 で登録した tools という ECR レポジトリにプッシュします。
これを使った Lambda 関数を定義し、この Lmabda 関数を EventBridge スケジュールから呼び出します。
.env ファイル
tools ECR レポジトリにアクセスする AWS のキー情報、並びに ECR レポジトリ名を設定します。
AWS_ACCESS_KEY_ID=*****
AWS_SECRET_ACCESS_KEY=*****
AWS_REGION=us-west-2
ECR_LAMBDA=sample-ai-tools
ビルドとプッシュ
以下の bash スクリプトでビルドとプッシュを行います。
% bin/ecr_login.bash .env.test
% bin/ecr_build.bash .env.test
% bin/ecr_push.bash .env.test
toolsと saving リソースの作成
docker compose run --rm tool tofu -chdir=tofu/rag plan -out rag.plan -target=module.tools
docker compose run --rm tool tofu -chdir=tofu/rag apply rag.plan
docker compose run --rm tool tofu -chdir=tofu/rag plan -out rag.plan -target=module.saving
docker compose run --rm tool tofu -chdir=tofu/rag apply rag.plan
saving のイベント定義
rds_stop として RDS を止めるイベントを定義しています。.
events = {
rds_stop = {
params = {
args = ["rds", "stop-cluster", var.aurora_cluster.cluster_identifier]
}
cron_expr = "cron(0 21 ? * Mon-Sun *)"
}
}
params は Lambda 関数のコンテキストに渡されますが、 Lambda の中ではargs の配列を受け取って click で定義したコマンドに丸投げするようになっています。 つまり、 rds グループの stoo-cluster サブコマンドに、 RDS の識別子をわたすことで、 cron_expr で指定した時間に RDS が止まるようになっています。
もしも、朝に自動起動するようにしたいのであれば、 rds_start みたいなエントリを定義し、 cron_exprで時間を指定し、 start-cluster サブコマンドを呼び出すようにすれば良いです。
コマンドの実態自体はawstoolsパッケージ の commands 配下に実装してあり、これ自体は bin/app.py を使うことでホスト OS からコマンドとしても実行することが可能です。
あとがき
株式会社 SPIN D&D (https://www.spin-dd.com/) ではシステムのバックエンド構築に関して AWS と Python エコシステムを活用していることを本サンプルで紹介することができました。 また、生成 AI をつかったソリューションに関しても注力していることもご理解いただけたと思います。
本サンプル以外の事例として弊社では以下のようなシステム構築を行なっています。
建設業務の会計業務管理システムを Django REST Framework(REST) と Graphine に(GraphQL)API サーバーで構築 (フロントは TypeScript/React)
同様な API サーバーを使った社内販売システム(フロントは Flatter)
シングルサインオンシステム
修理見積システム
割賦販売管理
...
AWS でのシステム構築のご相談や、仲間として一緒に働いてみたい、など問い合わせは https://www.spin-dd.com/ にアクセスしていただければと思います。
Comments