Artifact Registryの費用削減
Artifact Registryでは、アーティファクト1GBあたり、0.1$ほどの料金が発生します。
検証環境では、頻繁にアーティファクトがpushされるため、気が付いたら容量がそこそこ大きなものになっていたりということが多々あります。
すごく高い料金という訳ではありませんが、ちりつもで不要なリソースは削除していくのが望ましいでしょう。
Google Cloud の Artifact Registryの管理画面からリポジトリごとにクリーンアップポリシーというものが設定できます。
以下は、私がよく設定するクリーンアップポリシー例です。
最新の5件のアーティファクトを保持するポリシー
アップロードして3日を経過したアーティファクトを削除するポリシー
上記のクリーンアップポリシーを設定することで、検証環境に不必要なアーティファクトが残り続け、無駄な費用の発生を防止できます。
Cloud SQLの費用削減
Cloud SQL は、Google Cloudのサービスの中で割と高額になりがちのサービスの一つです。
夜間は利用しない、などの状況であれば、インスタンスを停止することで大幅に費用を削減できます。
Cloud SQLを毎回手動で停止する...といった人海戦術に頼るプロジェクトは令和のこの時代に流石にないとは思います。
自動で停止・起動させる方法は様々ですが、今回は「Workflows」と「Cloud Scheduler」を利用した方法で実現していきます。
Workflowsは、Cloud Schedulerと簡単に連携して、低コストで様々な処理を自動化できるサービスです。
CloudSQLを夜に停止、朝に起動...ということで「cloudsql-night-stop-morning-start」という名前でワークフローを作成します。
# Cloud SQL インスタンス群の起動・停止を一括制御するワークフロー
# --------------------------------------------------------------------
# この Workflow は、複数 Cloud SQL インスタンスの activationPolicy を
# "ALWAYS"(起動)または "NEVER"(停止)へまとめて変更するために使用する。
# Cloud Scheduler から引数 state を受け取り、環境変数 TARGET_INSTANCES に
# 設定された複数インスタンスを順に処理する。
# --------------------------------------------------------------------
main:
params: [args]
steps:
# -----------------------------------------------------
# ステップ1: 初期化および対象インスタンスの抽出
# -----------------------------------------------------
- init:
assign:
# 現在実行中のプロジェクト ID を環境変数から取得
- project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
# 環境変数 TARGET_INSTANCES をカンマで分割して配列化
# 例: "db1,db2" → ["db1", "db2"]
- instance_list: ${text.split(sys.get_env("TARGET_INSTANCES"), ",")}
# Cloud Scheduler から渡される "ALWAYS" / "NEVER"
- target_state: ${args.state}
# 処理結果を格納する配列を初期化
- execution_results: []
# -----------------------------------------------------
# ステップ2: インスタンスごとの処理
# -----------------------------------------------------
- process_instances:
for:
value: instance_name
in: ${instance_list}
steps:
# -------------------------------------------------
# Cloud SQL Admin API を使って activationPolicy を変更する
# ・成功 → operation_result に API レスポンスを格納
# ・失敗 → operation_result に error 情報を格納
# -------------------------------------------------
- update_instance_state:
try:
call: googleapis.sqladmin.v1.instances.patch
args:
project: ${project_id}
# 環境変数から取得したインスタンス名をそのまま利用
instance: ${instance_name}
body:
settings:
activationPolicy: ${target_state}
result: operation_result # ※成功時
except:
as: e
assign:
# 例外内容をオブジェクト化して後続の集計処理に渡す
- operation_result:
error: ${e.message}
status: "Failed"
# -------------------------------------------------
# API の実行結果(成功/失敗)を集計用配列に追記する
#
# status, operation_name, error_message の 3 点を統一形式にまとめて返却することで、
# ・後続の監視/通知処理に流用しやすい
# ・実行ログとして確認しやすい
# ・管理画面から json を見れば全体の成功/失敗が一目でわかる
# -------------------------------------------------
- collect_result:
assign:
- result_summary:
instance: ${instance_name}
# 成功時は API のレスポンスに status が存在しないため Success をデフォルトに設定
status: ${default(map.get(operation_result, "status"), "Success")}
# 成功時は operation の名前を、失敗時は "N/A"
operation_name: ${default(map.get(operation_result, "name"), "N/A")}
# 失敗時のみエラーメッセージが入る(成功時は null)
error_message: ${default(map.get(operation_result, "error"), null)}
# execution_results へ結果を append
- execution_results: ${list.concat(execution_results, [result_summary])}
# -----------------------------------------------------
# ステップ3: 全体結果の返却
# -----------------------------------------------------
- return_result:
return:
# 実行指示された状態(ALWAYS/NEVER)
target_state: ${target_state}
# 全インスタンス分の成功/失敗結果を返却
# Cloud Workflows の UI で実行結果をひと目で確認できる
details: ${execution_results}環境変数には、停止・起動を行いたいCloud SQLのインスタンス名を複数(一つでも可)設定します。
まずは、手動で実行してみましょう。
- 起動させたい場合{"state": "ALWAYS"}
- 停止させたい場合{"state": "NEVER"}
処理が成功した際の出力は下記のような形となります。
{
"details": [
[
{
"error_message": null,
"instance": "インスタンス名1",
"operation_name": "xxxe3503-ae6e-43d0-8cb2-xxx",
"status": "DONE"
}
],
[
{
"error_message": null,
"instance": "インスタンス名2",
"operation_name": "xxx85086-5c95-4948-98de-xxx",
"status": "DONE"
}
]
],
"target_state": "NEVER"
}手動実行で動作することは確認できたので、Workflowsの編集画面からトリガーを追加します。
Cloud Scheduler と Eventarc を選択できますが、今回は、Cloud Schedulerを選択します。
月曜日から金曜日の午前7時にCloud SQL を起動するスケジューラー
月曜日から金曜日の午後10時にCloud SQL を停止するスケジューラー
Cloud Runの費用削減
Cloud SQLと同様に、Cloud Run も最小インスタンスを0にすることで、利用しない時間帯の費用削減を行うことができます。
…
記事の続きは下のURLをクリック!
https://rightcode.co.jp/blogs/53994
エンジニア積極採用中です!
現在、WEBエンジニア、モバイルエンジニア、デザイナー、営業などを積極採用中です!
採用ページはこちら:https://rightcode.co.jp/recruit
社員の声や社風などを知りたい方はこちら:https://rightcode.co.jp/blogs?category=life
フリーランスエンジニア大募集中!
現在、「WEBエンジニア」「フロントエンジニア」「データサイエンティスト」など、様々な職種のフリーランスエンジニア様を募集中です。まずは以下よりお気軽にご応募ください!
採用ページはこちら:https://itanken.com/register
社長と一杯飲みながらお話しませんか?(転職者向け)
特設ページはこちら: https://rightcode.co.jp/gohan-sake-president-talk
もっとワクワクしたいあなたへ
現在、ライトコードでは「WEBエンジニア」「モバイルエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「営業」などを積極採用中です!
ライトコードは技術力に定評のある受託開発をメインにしているIT企業です。
有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。
- もっと大きなことに挑戦したい!
- エンジニアとしてもっと成長したい!
- モダンな技術に触れたい!
現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?
ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。
- ライトコードの魅力を知っていただきたい!
- 社風や文化なども知っていただきたい!
- 技術に対して熱意のある方に入社していただきたい!
一度、【Wantedly内の弊社ページ】や【コーポレートサイト】をのぞいてみてください。
Wantedly:https://www.wantedly.com/companies/rightcode
コーポレート:https://rightcode.co.jp/