2025年のDevOps技術7選とは何か?
DevOpsは、開発(Development)と運用(Operations)を組み合わせた手法として誕生したが、2025年においては技術的な側面だけでなく、カルチャーや組織の変革、そして人と人とのつながりの重要性 が強調されている。AI-powered automation、GitOps、platform engineering などの技術トレンドが、現代のソフトウェア開発とインフラ管理の未来を形作っている。
本記事では、DevOpsDays Tokyo 2025 で注目されたプラットフォームエンジニアリングやインナーソース、AIといったトピックを含め、現代ソフトウェア開発に必須の7つの技術領域について詳しく解説する。
DevOps技術7選の基本情報
技術分野 | 主要ツール | 2025年の注目ポイント |
---|---|---|
Infrastructure as Code | Terraform、Ansible、Pulumi | AI in Infrastructure as Code、Policy-as-Code |
GitOps | Argo CD、Flux、GitLab | Git as the single source of truth |
観測可能性 | Prometheus、Grafana、Jaeger | End-to-end observability、OpenTelemetry adoption |
CI/CD | Jenkins、GitHub Actions、CircleCI | AI-driven automated testing |
コンテナオーケストレーション | Kubernetes、Docker Swarm | セキュリティ強化とエッジコンピューティング対応 |
マイクロサービス | Spring Cloud、Istio、Envoy | AI/MLワークロードとの統合 |
Dapr | Dapr Runtime、各言語SDK | 標準的なAPIでDaprのビルディングブロックを呼び出し、任意の言語および任意のフレームワーク |
DevOps技術7選の詳細情報
1. Infrastructure as Code(IaC)
Infrastructure as Code or IaCは、コンソールやCLIなどの手動プロセスに依存せず、コードを通じてインフラストラクチャをプロビジョニングおよび管理するプロセス である。2025年においては、AIとInfrastructure as Codeの統合、Policy-as-Code(PaC)の標準化、自己修復インフラ自動化 が主要なトレンドとなっている。
OpenTofu has been on an impressive growth trajectory, and this trend will accelerate in 2025 といわれるように、オープンソースのIaCツールの採用も進んでいる。特に注目すべきは、AI tools like GitHub Copilot and Cursor are reshaping how teams write code, accelerating development processes by providing LLM-powered code generation という点で、AIがIaCの開発プロセスを大きく変化させている。
2. GitOps
GitOpsは、インフラストラクチャとアプリケーション構成を管理するためのプラクティス集合で、既存のプロセスを拡張し、アプリケーションライフサイクルを改善する ものである。GitOpsは、Gitリポジトリをインフラストラクチャ定義の単一の信頼できるソースとして使用 し、GitOpsにより、開発者はインフラストラクチャ変更を配信プロセスの一部として考慮し、同じ配信CI/CDパイプラインに統合 できる。
2025年のGitOpsは、Infrastructure-as-appsがinfrastructure-as-codeを論理的な終点まで構築し、GitOps管理の原則を導入 している。これにより、アプリケーションとデータストアとの通信にDaprを利用することで、テスト環境ではRedisを、本番環境ではクラウドデータベースを、といった使い分けが、アプリケーションのコードを変更せずとも可能 になる。
3. 観測可能性(Observability)
オブザーバビリティとは、簡単に言えば、システムの出力を調査することによって内部の状態を測定する能力 のことである。近年、クラウド環境やマイクロサービスアーキテクチャの普及により、システムの複雑性が増しており、従来のモニタリングでは対応が難しくなったことを背景に、Observabilityの重要性が高まっています 。
2025年における観測可能性は、メトリクス、ログ、トレースを統合したEnd-to-end観測可能性 とOpenTelemetryが業界標準としての位置づけ を確立している。OpenTelemetryは、メトリクス、トレース、ログを収集するための統一されたアプローチを提供し、一度インストルメントすれば任意の観測可能性バックエンドにデータを送信 できる。
4. CI/CD(継続的インテグレーション・継続的デリバリー)
CI/CDは、新たなソフトウェアをリリースする(あるいは既存のソフトウェアをアップデートする)技術的プロセスの完全な自動化 を実現する技術である。2025年においては、AI-driven automated testing and self-healing systems が注目されており、AIが潜在的な障害を識別し、テストケースを生成し、修復プロセスを自動的にトリガー できるようになっている。
日本の大企業文化の中にCI/CDやDevOpsをどう根づかせるか という課題に対しても、定着させるためのプロセス設計 や技術では埋まらないズレを見える化し、対話の土壌をつくる取り組み が重要視されている。
5. コンテナオーケストレーション
コンテナオーケストレーションは、複数のコンテナの展開、管理、スケーリング、ネットワーキングを自動化する技術である。Kubernetesが事実上の標準となっており、2025年においては、real-time threat detection and response in CI/CD pipelines やzero-trust security models in DevOps といったセキュリティ面での強化が進んでいる。
また、エッジコンピューティングとの統合も重要なトレンドとなっており、リソース制約のある環境でのコンテナ実行やリアルタイム処理への対応が求められている。
6. マイクロサービス
マイクロサービスアーキテクチャは、アプリケーションを構成するための機能を提供する多数のプログラムが疎結合によって連係することで実現 される。2025年においては、MLOps(Machine Learning Operations) との統合が進んでおり、automated ML model versioning and governance、continuous integration and deployment (CI/CD) for ML models が注目されている。
マイクロサービス開発における課題解決の鍵として、サービス間の連携を容易にする技術が重要になっており、次に紹介するDaprのような技術が注目されている。
7. Dapr(Distributed Application Runtime)
Dapr(Distributed Application Runtime)は、マイクロサービスの連携を簡単にするAPIを提供するランタイム である。Daprは、任意のプログラミング言語で呼び出せる標準的なhttpやgRPC APIによってアクセスされる一連のビルディングブロックで構成 されており、開発者がイベントドリブンのクラウドネイティブな分散アプリケーションを簡単に構築できる ようにする。
Daprを一言で表すと「マイクロサービスを役割や機能ごとに整理するサービス」で、アプリケーションに通信機能を透過的に提供してくれるランタイム として機能し、各アプリケーションが通信先に依存しなくなるため、異なる環境にサービスを移動したり、新しいアプリケーションを導入したりすることが容易 になる。
DevOps技術のメリットとデメリット
全体的なメリット
メリット分野 | 具体的効果 | 技術的根拠 |
---|---|---|
開発効率向上 | 開発サイクルの短縮 自動化による手作業削減 | AI-driven automated testing 技術的プロセスの完全な自動化 |
システム信頼性 | 障害予防と自動復旧 監視とアラートの充実 | predictive analytics for incident management システムの出力を調査することによって内部の状態を測定 |
運用コスト削減 | インフラ効率化 人的リソース最適化 | cross-cloud and multi-cloud orchestration AI agents designed to handle routine infrastructure management tasks |
スケーラビリティ | 需要に応じた自動拡張 リソース最適配分 | 多数のプログラムが疎結合によって連係 Kubernetesによる自動スケーリング |
技術別デメリットと対策
技術分野 | 主なデメリット | 推奨対策 |
---|---|---|
Infrastructure as Code | 初期学習コストの高さ 複雑性の増大 | providing software developers with pre-built building blocks 段階的導入とチーム教育 |
GitOps | change by committee要素でのプロセスの煩雑化 承認プロセスの時間増加 | 適切なガバナンス設計 自動化によるボトルネック解消 |
観測可能性 | データ量の爆発的増加 ツール運用の複雑性 | OpenTelemetryによる標準化 階層化された監視戦略 |
マイクロサービス | 分散システムの複雑性 サービス間通信の管理 | Daprによるサービス間連携の簡素化 適切なサービス分割設計 |
DevOps技術7選の使い方
1. Infrastructure as Code の実装
Terraformを使った基本的なインフラ定義
# main.tf - 基本的なAWSリソース定義
terraform {
required_version = ">= 1.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = var.aws_region
}
# VPC作成
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
enable_dns_support = true
tags = {
Name = "main-vpc"
Environment = var.environment
}
}
# サブネット作成
resource "aws_subnet" "public" {
count = 2
vpc_id = aws_vpc.main.id
cidr_block = "10.0.${count.index + 1}.0/24"
availability_zone = data.aws_availability_zones.available.names[count.index]
map_public_ip_on_launch = true
tags = {
Name = "public-subnet-${count.index + 1}"
Type = "Public"
}
}
# EKSクラスター作成
resource "aws_eks_cluster" "main" {
name = var.cluster_name
role_arn = aws_iam_role.eks_cluster.arn
version = "1.28"
vpc_config {
subnet_ids = aws_subnet.public[*].id
}
depends_on = [
aws_iam_role_policy_attachment.eks_cluster_policy,
]
}
Ansibleでの設定管理
# playbook.yml - サーバー設定自動化
---
- name: Configure web servers
hosts: webservers
become: yes
vars:
nginx_port: 80
app_user: webapp
tasks:
- name: Install nginx
package:
name: nginx
state: present
- name: Start and enable nginx
systemd:
name: nginx
state: started
enabled: yes
- name: Deploy application
template:
src: nginx.conf.j2
dest: /etc/nginx/sites-available/default
notify: restart nginx
- name: Install monitoring agent
pip:
name:
- prometheus-client
- psutil
handlers:
- name: restart nginx
systemd:
name: nginx
state: restarted
2. GitOpsの実装
Argo CDによるGitOpsセットアップ
# argocd-application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: web-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/company/web-app-config
targetRevision: main
path: k8s/production
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
retry:
limit: 5
backoff:
duration: 5s
factor: 2
maxDuration: 3m
---
# kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
- ingress.yaml
images:
- name: web-app
newTag: v1.2.3
commonLabels:
app: web-app
version: v1.2.3
configMapGenerator:
- name: app-config
files:
- config.properties
3. 観測可能性の実装
Prometheusとgrafanaによる監視システム
# prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- "alert_rules.yml"
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
scrape_configs:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100']
- job_name: 'application-metrics'
static_configs:
- targets: ['app:8080']
OpenTelemetryを使った分散トレーシング
# Python アプリケーションでのOpenTelemetry設定
from opentelemetry import trace
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.instrumentation.flask import FlaskInstrumentor
from opentelemetry.instrumentation.requests import RequestsInstrumentor
# トレーサープロバイダーの設定
trace.set_tracer_provider(TracerProvider())
tracer = trace.get_tracer(__name__)
# Jaegerエクスポーターの設定
jaeger_exporter = JaegerExporter(
agent_host_name="jaeger-agent",
agent_port=6831,
)
span_processor = BatchSpanProcessor(jaeger_exporter)
trace.get_tracer_provider().add_span_processor(span_processor)
# Flaskアプリケーションの自動インストルメンテーション
app = Flask(__name__)
FlaskInstrumentor().instrument_app(app)
RequestsInstrumentor().instrument()
@app.route('/api/users/')
def get_user(user_id):
with tracer.start_as_current_span("get_user_operation") as span:
span.set_attribute("user.id", user_id)
# データベース呼び出し
with tracer.start_as_current_span("database_query") as db_span:
db_span.set_attribute("db.operation", "SELECT")
user = database.get_user(user_id)
return jsonify(user)
4. CI/CDパイプラインの構築
GitHub Actionsによる自動化
# .github/workflows/ci-cd.yml
name: CI/CD Pipeline
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install -r requirements.txt
pip install pytest pytest-cov
- name: Run tests
run: |
pytest --cov=src tests/
- name: Security scan
run: |
pip install bandit
bandit -r src/
build-and-push:
needs: test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Log in to Container Registry
uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: |
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
deploy:
needs: build-and-push
runs-on: ubuntu-latest
environment: production
steps:
- name: Deploy to Kubernetes
run: |
echo "${{ secrets.KUBECONFIG }}" | base64 -d > kubeconfig
export KUBECONFIG=kubeconfig
kubectl set image deployment/web-app web-app=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
kubectl rollout status deployment/web-app
5. Daprを使ったマイクロサービス実装
Daprサービス間通信の実装
# Python でのDaprサービス実装
from dapr.clients import DaprClient
from dapr.ext.grpc import App
import json
# サービスA(呼び出し側)
class OrderService:
def __init__(self):
self.dapr_client = DaprClient()
def create_order(self, order_data):
# Daprを通じて他のサービスを呼び出し
result = self.dapr_client.invoke_method(
app_id="inventory-service",
method_name="check_inventory",
data=json.dumps(order_data),
http_verb="POST"
)
if result.data:
# 在庫確認OK → 注文処理
self.process_order(order_data)
# 状態管理(Dapr State Store)
self.dapr_client.save_state(
store_name="statestore",
key=f"order-{order_data['id']}",
value=order_data
)
# イベント発行(Dapr Pub/Sub)
self.dapr_client.publish_event(
pubsub_name="messagebus",
topic_name="order-created",
data=order_data
)
# サービスB(提供側)
app = App()
@app.method(name='check_inventory')
def check_inventory(request):
# リクエストデータの処理
order_data = json.loads(request.data)
# 在庫チェックロジック
if inventory_available(order_data['product_id'], order_data['quantity']):
return {"available": True}
else:
return {"available": False, "reason": "Out of stock"}
KubernetesでのDapr設定
# k8s/order-service.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-service
labels:
app: order-service
spec:
replicas: 3
selector:
matchLabels:
app: order-service
template:
metadata:
labels:
app: order-service
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "order-service"
dapr.io/app-port: "8080"
dapr.io/config: "tracing"
spec:
containers:
- name: order-service
image: order-service:latest
ports:
- containerPort: 8080
env:
- name: DAPR_GRPC_PORT
value: "50001"
---
# dapr-components/statestore.yaml
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: statestore
spec:
type: state.redis
version: v1
metadata:
- name: redisHost
value: redis:6379
- name: redisPassword
secretKeyRef:
name: redis-secret
key: password
---
# dapr-components/messagebus.yaml
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: messagebus
spec:
type: pubsub.nats
version: v1
metadata:
- name: natsURL
value: nats://nats:4222
実践的な運用コマンド集
# Terraformでのインフラ管理
terraform init
terraform plan -var-file="production.tfvars"
terraform apply -var-file="production.tfvars"
terraform destroy -target=aws_instance.web
# Kubernetesリソース管理
kubectl apply -f k8s/
kubectl get pods -l app=web-service
kubectl logs -f deployment/web-service
kubectl describe pod web-service-xxx
# ArgoCD操作
argocd app create web-app --repo https://github.com/company/config --path k8s/production --dest-server https://kubernetes.default.svc --dest-namespace production
argocd app sync web-app
argocd app history web-app
# Dapr操作
dapr run --app-id order-service --app-port 8080 python app.py
dapr list
dapr logs --app-id order-service
# 監視とトラブルシューティング
# Prometheusメトリクス確認
curl http://localhost:9090/api/v1/query?query=up
# Jaegerでトレース確認
curl http://jaeger:16686/api/traces?service=order-service
# GitOps同期状態確認
kubectl get applications -n argocd
kubectl describe application web-app -n argocd
まとめ
2025年のDevOps技術は、AI、security automation、observability、infrastructure as code が次世代の変革を推進している。DevOpsは単なるツールやプラクティスではなく、組織と人を変えていく取り組み であることが改めて強調されており、技術的な側面と文化的な側面の両方が重要である。
特に注目すべきは、2025年はAI-infused、security-first approach へのシフトと、infrastructure service catalog による開発者体験の向上である。これらの技術を適切に組み合わせることで、より効率的で、スケーラブルで、セキュアなソフトウェアシステム の構築が可能になる。
本記事で紹介した7つの技術領域は相互に補完し合い、現代のソフトウェア開発ライフサイクル全体を支える重要な要素となっている。継続的な学習と実践を通じて、これらの技術を効果的に活用していくことが、今後のDevOpsエンジニアには求められるだろう。
最後に
DevOps技術の進化は止まることなく、2025 is shaping up to be a transformative year for IaC と言われるように、変革の年となっている。技術を超えて、文化を設計する という視点から、単に技術を導入するだけでなく、組織全体での文化的な変革も同時に進めていく必要がある。
今後、AIとDevOpsの融合はさらに加速し、proper observability processes, tools and practices to analyze it all がますます重要になるだろう。技術の進歩に合わせて、私たち開発者・運用者も継続的に学習し、適応していくことが成功の鍵となる。現場での実践を通じて、これらの技術の真価を体感し、より良いソフトウェア開発・運用文化の構築に貢献していただきたい。
コメント