diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..91fd4eb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM python:3.12-slim + +# 必要なパッケージをインストール +RUN apt-get update && apt-get install -y \ + curl + +# pythonパッケージのインストール +COPY requirements.txt . +RUN pip install --upgrade pip +RUN pip install --no-cache-dir -r requirements.txt + +# 作業ディレクトリを設定 +WORKDIR /app + +# アプリケーションコードをコピー +COPY ./src /app + +# コンテナ起動時に実行されるコマンドを指定 +CMD ["python", "main.py"] \ No newline at end of file diff --git a/readme/components_design/AGENT.md b/readme/components_design/AGENT.md new file mode 100644 index 0000000..fe51108 --- /dev/null +++ b/readme/components_design/AGENT.md @@ -0,0 +1,61 @@ + +# エージェントへの目的 + +`terraform`フォルダを確認して`readme/components_design`フォルダに +.drawioファイル(XML形式)で作成してください + +## 役割 + +あなたはシステム構成を考える専門家です。 + +## 規約 + +【要件】 + +* 出力ファイルは`system_components.drawio`としてください。 +* リクエストに指定がない場合は環境変数は`_dev.tfvars`を優先してください。 +* サービスアカウントやロールなどは記載しなくて良い。 +* **重要**terraformに存在しないコンポーネントは使用しないこと +* ユーザーが利用するコンポーネント図と、開発者が利用するコンポーネント図は分離してください + + +【レイアウト要件】 +- Region、VPCを大きな枠で表現 + - Region: 最も外側の枠として配置 + - VPC: Regionの内側に配置 +- 接続線が重ならないよう、コンポーネントを階段状に配置 +- 各コンポーネント間の間隔を100px以上確保 +- ユーザーはVPCの外側に配置(インターネット経由でアクセスする想定) +- コンポーネントは左から右に向かってデータフローを表現(User → Frontend → Backend → Database) + +【スタイル要件】 + +**枠のスタイル:** +- VPC: `fillColor=#D5E8D4;strokeColor=#82b366;dashed=1;verticalAlign=top;fontStyle=1;fontSize=14` +- Region: `fillColor=#E1F5FE;strokeColor=#01579B;dashed=1;verticalAlign=top;fontStyle=1;fontSize=14` +- 枠のラベルは左上に配置(`align=left;spacingLeft=10;spacingTop=5`) + +**接続線:** +- 双方向通信: `endArrow=classic;startArrow=classic;strokeWidth=2` +- 単方向通信: `endArrow=classic;strokeWidth=2` +- HTTPSアクセス: `strokeColor=#4285F4`(青) +- データベース接続: `strokeColor=#DB4437`(赤) +- ストレージアクセス: `strokeColor=#34A853`(緑) +- 接続線にラベルを付ける(例: "HTTPS", "API", "SQL") + +【座標とサイズの目安】 +- Region枠: 幅800-1000px、高さ500-700px +- VPC枠: Region内部で余白50px程度、幅700-900px、高さ400-600px +- コンポーネントアイコン: 78x78 または 80x80 +- コンポーネント間の横間隔: 150-200px +- コンポーネント間の縦間隔: 100-150px + + +**アイコン:** + +- ユーザー/クライアントアイコン + - `shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.user`(共通で使用可能) + +- コンポーネントのアイコンについて以下のマップを参考にしてください + - 以下のアイコンを使用する場合、必ず対応する mxCell テンプレートを使用すること。 + - id / x / y / width / height / parent などは適宜書き換えて構いません。 diff --git a/readme/deploy.md b/readme/deploy.md index 0fc0931..fea0c58 100644 --- a/readme/deploy.md +++ b/readme/deploy.md @@ -1,11 +1,76 @@ # デプロイの方法について +## インストール方法 + +MACの場合 + +```sh +brew tap hashicorp/tap +brew install hashicorp/tap/terraform +# 確認 +terraform -version +``` + + ## 環境について * terraform * google cloud * Cloud Run Job +## 実行する方法 + +```sh +# 初期化を実行する +cd terraform +# Terraformの初期化 +terraform init +# アーティファクトやバケットについては先に生成する +terraform apply \ +-var-file=_dev.tfvars \ +-auto-approve \ +-target="google_artifact_registry_repository.repo" +# DockerファイルをビルドしてGARにプッシュする場合 +cd ../ +# 1. Artifact Registryへの認証設定(初回のみ実行) +source deploy.env +gcloud auth configure-docker "${AR_REGION}-docker.pkg.dev" +# arm64 +source deploy.env +gcloud builds submit --tag "${IMAGE_URI}" . +echo "${IMAGE_URI}" + +# デプロイするコンポーネントを確認する +cd terraform +terraform plan \ +-var-file=_dev.tfvars \ +-var="hash_suffix=${HASH_SUFFIX}" + +# デプロイを実行する +terraform apply \ +-var-file=_dev.tfvars \ +-var="hash_suffix=${HASH_SUFFIX}" \ +-auto-approve +``` +ローカルでビルドで試す場合 +```sh +# デフォルトでビルドする場合 +docker build -t cloud-run-job-base . +# arm64でビルドしたい場合 +docker buildx build -platform linux/amd64,linux/arm64 -t cloud-run-job-base . +# Dockerを実行する(1回だけ実行してコンテナインスタンスを削除する場合) +docker run --rm cloud-run-job-base:latest +``` + +### CI/CDでデプロイを実行する場合 + +**Github(Gitea) Acrtionsで実行する場合** + + +**Cloud Buildで実行する場合** + + +### Big Quderyにデータが取得できた場合をトリガーにしてJOBを実行する方法 diff --git a/terraform/run_job.tf b/terraform/run_job.tf index 9d5b1d1..c6be644 100644 --- a/terraform/run_job.tf +++ b/terraform/run_job.tf @@ -1,30 +1,29 @@ # Cloud Run Jobのリソース -resource "google_cloud_run_job" "job" { +# https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_job +resource "google_cloud_run_v2_job" "job" { name = "${var.job_name}-${var.env_name}-job" location = var.region - # サービスアカウントを指定 - service_account = google_service_account.job_sa.email template { template { - containers { - image = var.container_image + # サービスアカウントを指定 + service_account = google_service_account.job_sa.email + containers { + image = "${var.region}-docker.pkg.dev/${var.project_id}/cicd-repo-${var.env_name}/run-job-${var.job_name}-image:${var.hash_suffix}" resources { limits = { cpu = var.cpu_limit memory = var.memory_limit } } - - # env { - # 必要に応じ環境変数を設定 - # name = "ENV_VAR_NAME" - # } } - timeout_seconds = var.timeout_seconds + + timeout = var.timeout + } } + } diff --git a/terraform/sample.tfvars b/terraform/sample.tfvars index dd838f6..b094684 100644 --- a/terraform/sample.tfvars +++ b/terraform/sample.tfvars @@ -7,4 +7,4 @@ job_name = "ジョブ名を指定してください" cpu_limit = "1" memory_limit = "512Mi" -timeout_seconds = 900 +timeout = "1800s" diff --git a/terraform/variables.tf b/terraform/variables.tf index 26937d7..c298ec6 100644 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -26,10 +26,11 @@ variable "job_name" { } -# コンテナイメージの変数定義(CI/CDから渡される想定) -variable "container_image" { +# コンテナイメージのハッシュ値変数定義(CI/CDから渡される想定) +variable "hash_suffix" { description = "The container image for the Cloud Run Job." type = string + default = null } @@ -46,8 +47,8 @@ variable "memory_limit" { default = "512Mi" } -variable "timeout_seconds" { - description = "The timeout for the Cloud Run Job." - type = number - default = 300 +variable "timeout" { + description = "The task timeout in seconds for the Cloud Run Job." + type = string + default = "1800s" } \ No newline at end of file