Python

PythonマイクロサービスのDockerデプロイとCI/CDベストプラクティス

ⓘ本ページはプロモーションが含まれています

お得なお知らせ

スポンサードリンク
AI時代のキャリア構築

プログラミング学習、今日から動き出す

「何から始めるか」で止まっている人こそ、無料説明会や本で自分に合うルートを30分で確定できます。

Enjoy Tech!|月額制でWeb系に強い▶ (Kindle本)ITエンジニアの転職学|後悔しないキャリア戦略▶

▶ AIコーディング環境なら  実践Claude Code入門(Amazon)が実務で即使える入門書です。Amazonベストセラーにも選ばれていますよ。


スポンサードリンク

1. プロジェクト構成と依存管理

📌 ポイント

  • 明確なディレクトリ構造Poetry による単一ソース(pyproject.toml)の依存管理で、保守性・テスト容易性を最大化する。

📂 推奨ディレクトリレイアウト

pyproject.toml の抜粋(バージョンは 変数 で管理)

※ バージョンは {{ xxx_version }} のようにテンプレート化し、
Dependabot や Renovate と連携させることで定期的に最新安定版へ自動更新できます(後述)。

Poetry での操作例


2. Dockerfile の安全・軽量設計

📌 ポイント

  • BuildKit + マルチステージビルドで、ビルド時のツールやキャッシュを本番イメージに持ち込まない。
  • site‑packages ディレクトリ全体をコピーせず、requirements.txt から再インストールすることで不要ファイルを除外。

改訂版 Dockerfile

主な改善点

項目 従来の実装 改訂版
site‑packages のコピー COPY --from=builder /usr/local/lib/python3.11/site-packages/ … 依存リスト (requirements.txt) を再インストールし、ビルドキャッシュは残さない
不要ファイル ビルダーのキャッシュが混入する可能性あり --no-cache-dir とマウントキャッシュでビルド時のみ保持
ユーザー権限 USER appuser はそのままだが、作成手順が明示的に分離 同上だがコメントで意図を明記

3. ローカル開発環境(Compose & DevContainer)

📌 ポイント

  • Docker Compose v2 によるネットワーク・ヘルスチェックの自動管理。
  • VS Code の DevContainer でローカルと CI が同一イメージを使用でき、開発者ごとの環境差異が解消。

docker-compose.yml

DevContainer 設定 (.devcontainer/devcontainer.json)

Tip
docker-compose.yml と同じ Dockerfile(マルチステージ)を利用しているため、ローカルでも CI と同様のイメージが生成されます。


4. CI/CD パイプライン(GitHub Actions)

📌 ポイント

  • BuildKitTrivy による脆弱性診断、テスト実行、GHCR へのプッシュを一連のジョブで完結。
  • バージョン固定・再現性確保のため、外部 Action はタグまたは SHA‑1 でロック。

dependabot.yml(自動バージョン更新)

.github/workflows/ci-cd.yml

主な改善点

項目 従来の記述 改訂版
Trivy Action aquasecurity/trivy-action@master(ブランチ指定) aquasecurity/trivy-action@v0.12.0(安定タグ)
Azure デプロイ azure/aci-deploy@v1(旧名称・誤記) azure/container-apps-deploy@v1(正式)
バージョン固定 FastAPI・Uvicorn のハードコード {{ fastapi_version }} 等テンプレート化し Dependabot が自動更新
再現性 依存はロックされているが Action バージョン未固定 全 Action にタグ/SHA を明示

5. バージョン管理と自動更新の仕組み

📌 なぜ「バージョンを固定」しつつ「定期的に最新へ」?

  • 再現性:CI が同一コード・依存で常に同じイメージを生成できる。
  • セキュリティ:脆弱性が修正された新バージョンは速やかに取り込める。

実装例

  1. Poetry のバージョン変数化
    pyproject.toml 内の依存は {{ fastapi_version }} などプレースホルダーで記述。
  2. GitHub Actions のテンプレート置換
    yaml
  3. name: Render version placeholders
    id: render
    run: |
    FASTAPI=$(curl -s https://pypi.org/pypi/fastapi/json | jq -r '.info.version')
    UVICORN=$(curl -s https://pypi.org/pypi/uvicorn/json | jq -r '.info.version')
    echo "fastapi_version=$FASTAPI" >> $GITHUB_OUTPUT
    echo "uvicorn_version=$UVICORN" >> $GITHUB_OUTPUT

    その後
    envに注入し、sed等でpyproject.toml
    を書き換えてビルド。

  4. Dependabot の活用

  5. 上記 dependabot.yml が自動的に PR を作成。
  6. CI がマージ前にテスト・スキャンを走らせ、問題なければ自動マージ(auto-merge: true)も設定可能。

  7. GitHub Actions のバージョンロック
    yaml
    uses: docker/setup-qemu-action@v3 # タグで固定
    uses: aquasecurity/trivy-action@v0.12.0 # タグまたは SHA-1


6. 主要クラウドへのデプロイ比較

項目 AWS ECS/Fargate Azure Container Apps GCP Cloud Run
CLI / Action aws-actions/amazon-ecs-deploy-task-definition@v2 azure/container-apps-deploy@v1(正式) google-github-actions/deploy-cloudrun@v0
デプロイ単位 タスク定義 + サービス コンテナアプリ+環境 Service (Revision)
シークレット管理 AWS Secrets Manager / Parameter Store → ECS task definition Azure Key Vault → env vars(container‑app) Secret Manager → env vars
料金モデル vCPU・メモリ使用量に従量課金 実行時間とリソース予約で従量課金 リクエスト数+実行時間で従量課金
主な設定ファイル例 ecs/task-def.json(JSON) az containerapp env create …(CLI) gcloud run deploy …(CLI)

デプロイ手順の共通パターン

  1. コンテナレジストリにプッシュ → GHCR / ECR / ACR など
  2. GitHub Actions のステップで対象クラウド用 CLI/Action を呼び出す
  3. 環境変数・シークレットは各クラウドのマネージドサービスから注入

ポイント:同一ワークフロー内に if: contains(matrix.cloud, 'aws') 等で分岐させれば、1 つの YAML ですべてのプロバイダーへデプロイ可能。


7. 運用・監視・セキュリティの基本設定

📌 ロギングとメトリクス(OpenTelemetry + Prometheus)

docker-compose.yml に追加

otel/otel-config.yaml(抜粋)

アプリ側依存とコード例

src/myservice/metrics.py

📌 非 root 実行とイメージスキャン

  • DockerfileUSER appuser を必ず設定(上記参照)。
  • CI の Trivy スキャンは「高・クリティカル」だけ CI を失敗させ、低リスクは issue として残す。

📌 定期的な脆弱性データベース更新

Trivy はデフォルトで毎日 DB を取得しますが、自前のキャッシュレイヤーを作ることでビルド時間短縮も可能です。
CI の最初に以下を実行すると、GitHub Actions のキャッシュ機能と組み合わせられます。


8. まとめ

項目 ベストプラクティス
プロジェクト構造 src/ 配下にコード、Poetry が唯一の依存管理ツール
Dockerfile BuildKit + マルチステージ → ビルドキャッシュはランタイムに持ち込まない。非 root ユーザーで実行
ローカル開発 Compose v2 + DevContainer で本番と同一イメージを使用し、ヘルスチェック・ネットワーク自動管理
CI/CD GitHub Actions にてビルド・テスト・Trivy スキャン・GHCR プッシュ+各クラウドへデプロイ。Action はすべてタグ固定で再現性確保
バージョン更新 Dependabot + {{ xxx_version }} テンプレート → 定期的に PR が作成され、マージすると自動で最新ライブラリになる
クラウドデプロイ比較 AWS/ECS‑Fargate・Azure Container Apps・GCP Cloud Run を同一ワークフローで切り替え可能
観測性 & セキュリティ OpenTelemetry → Prometheus、非 root コンテナ、Trivy 高リスクスキャン、GitHub Secrets/クラウド KMS でシークレット管理

このガイドラインを自プロジェクトに取り込むことで、「コードの書きやすさ」⇔「本番運用の堅牢性」 の両輪が揃い、開発スピードと安全性を同時に向上できます。

次のステップ
1. 本リポジトリで dependabot.yml を有効化 → 依存自動更新を開始。
2. Dockerfile と CI のバージョン固定が完了したら、GitHub Actions のワークフロー実行で一度ビルド・テスト・スキャンを走らせる。
3. 任意のクラウド(AWS / Azure / GCP)へデプロイし、OpenTelemetry ダッシュボードでメトリクスが可視化されていることを確認。

以上、2026 年時点の 最新・安全・再現性 を担保した Python マイクロサービス構築手順でした。 🚀

スポンサードリンク

お得なお知らせ

スポンサードリンク
AI時代のキャリア構築

プログラミング学習、今日から動き出す

「何から始めるか」で止まっている人こそ、無料説明会や本で自分に合うルートを30分で確定できます。

Enjoy Tech!|月額制でWeb系に強い▶ (Kindle本)ITエンジニアの転職学|後悔しないキャリア戦略▶

▶ AIコーディング環境なら  実践Claude Code入門(Amazon)が実務で即使える入門書です。Amazonベストセラーにも選ばれていますよ。


-Python