Elixirデプロイメント完全ガイド
Elixirデプロイメント完全ガイド
Section titled “Elixirデプロイメント完全ガイド”Elixirアプリケーションのデプロイメントを、実務で使える実装例とともに詳しく解説します。
1. デプロイメントとは
Section titled “1. デプロイメントとは”デプロイメントの基本
Section titled “デプロイメントの基本”Elixirアプリケーションは、mix releaseコマンドで生成される自己完結型リリースを使用してデプロイします。
デプロイメントの流れ ├─ リリースのビルド ├─ コンテナ化(Docker) ├─ デプロイ(Kubernetes/Render) └─ 監視とログ2. リリースの作成
Section titled “2. リリースの作成”基本的なリリース
Section titled “基本的なリリース”# リリースのビルドMIX_ENV=prod mix release
# リリースの起動_build/prod/rel/my_app/bin/my_app startリリース設定
Section titled “リリース設定”import Config
config :my_app, MyAppWeb.Endpoint, http: [port: System.get_env("PORT", "4000") |> String.to_integer()], url: [host: System.get_env("HOST", "localhost")]
config :my_app, MyApp.Repo, url: System.get_env("DATABASE_URL")Elixirデプロイメントの基本思想
Section titled “Elixirデプロイメントの基本思想”Elixirアプリケーションのデプロイメントの根幹には、mix releaseコマンドで生成される自己完結型リリースがあります。これは、アプリケーションのソースコード、依存ライブラリ、そして軽量なErlang VM (BEAM)をすべて一つの実行可能なファイルにまとめる機能です。このリリースの最大の利点は、デプロイ先のサーバーにElixirやErlangを事前にインストールする必要がないことです。これにより、デプロイプロセスが劇的に簡素化され、DockerやKubernetesのようなコンテナ環境との相性が非常に良くなります。
DockerとKubernetesを使用したデプロイメント 🐳
Section titled “DockerとKubernetesを使用したデプロイメント 🐳”自己完結型リリースをコンテナ化してデプロイするのは、最も一般的で堅牢な手法です。このプロセスは、通常、多段階ビルド (Multi-stage build) を使用して、本番用コンテナイメージのサイズを最小限に抑えます。
Dockerfileの例
Section titled “Dockerfileの例”# ビルドステージ# 完全なElixir環境を使ってリリースをビルドFROM hexpm/elixir:1.14.3-erlang-25.3.2-ubuntu-jammy AS builderWORKDIR /appCOPY mix.exs mix.lock ./RUN mix deps.get --only prodCOPY priv privCOPY lib libCOPY config configRUN mix release --env=prod
# ランタイムステージ# わずか数MBの軽量なAlpineイメージに、ビルドしたリリースをコピーFROM alpine:3.18.2WORKDIR /appRUN apk add --no-cache opensslCOPY --from=builder /app/_build/prod/rel/my_app ./CMD ["/app/bin/my_app", "start"]Kubernetesのデプロイメント設定
Section titled “Kubernetesのデプロイメント設定”ビルドしたDockerイメージをKubernetesクラスタにデプロイするための設定例です。
apiVersion: apps/v1kind: Deploymentmetadata: name: myappspec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp # Dockerイメージのリポジトリとタグを指定 image: your-docker-registry/my_app:latest ports: - containerPort: 4000この設定により、Kubernetesはアプリケーションのコンテナを3つ起動し、自動的に負荷分散を行います。
Render.comでのデプロイメント 🚀
Section titled “Render.comでのデプロイメント 🚀”Render.comのようなPaaSは、上記のDockerやKubernetesの設定を気にすることなく、Elixirアプリケーションをデプロイできます。Renderは、Gitリポジトリと連携するだけで、自動的にビルドとデプロイを実行します。
Render.yamlの設定例
Section titled “Render.yamlの設定例”Renderは、render.yamlという設定ファイルで、アプリケーションのビルドと起動方法を自動で認識します。
services:- type: web name: myapp env: elixir # ビルドコマンド。依存関係を取得し、リリースをビルド。 buildCommand: "mix do deps.get, compile, release" # アプリケーションの起動コマンド startCommand: "_build/prod/rel/my_app/bin/my_app start" envVars: - key: SECRET_KEY_BASE generateValue: trueRenderとElixirの強力な相性
Section titled “RenderとElixirの強力な相性”Renderは、Elixirの強みである分散ノード機能や自動スケーリングをネイティブにサポートしています。これにより、複数のインスタンスが互いに連携し、トラフィックの急増にも柔軟に対応できる、高可用性かつリアルタイムなアプリケーションを簡単に構築できます。
CI/CDパイプラインの自動化 🤖
Section titled “CI/CDパイプラインの自動化 🤖”提供されたGitHub Actionsの例は、CI/CDプロセスを自動化するための良い出発点です。これをさらに洗練させ、デプロイフックを使用して自動デプロイを実現するワークフローの例を以下に示します。
GitHub Actionsワークフローの例 (.github/workflows/ci.yml)
Section titled “GitHub Actionsワークフローの例 (.github/workflows/ci.yml)”name: Elixir CI/CD
on: push: branches: - main
jobs: build_and_deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Elixir uses: erlef/setup-elixir@v1 with: elixir-version: '1.14' otp-version: '25' - name: Install dependencies run: mix deps.get - name: Run tests run: mix test - name: Build release # プロダクション環境用の設定でリリースをビルド run: mix release --env=prod
- name: Deploy to Render # テストとビルドが成功した場合にのみ実行 if: success() run: curl -X POST ${{ secrets.RENDER_DEPLOY_HOOK }}このワークフローは、mainブランチへのプッシュをトリガーに、テストを実行し、リリースをビルドします。すべてのステップが成功した場合にのみ、curlコマンドでRenderのデプロイフックを呼び出し、デプロイプロセスを自動で開始します。これにより、「テストが通ったときだけデプロイする」という安全で堅牢なパイプラインが構築できます。