AWS CodeDeploy とは?初心者でもわかる基礎知識
AWS CodeDeployは、Amazon Web Services(AWS)が提供する完全マネージド型のデプロイサービスです。EC2インスタンス、オンプレミスサーバー、Lambda関数、ECSサービスなど、様々なコンピューティングサービスへのアプリケーションデプロイを自動化できます。
CodeDeploy が解決するデプロイの課題とは
従来のデプロイプロセスには、以下のような課題が存在していました:
課題 | CodeDeployによる解決策 |
---|---|
手動デプロイによるヒューマンエラー | デプロイプロセスの完全自動化 |
大規模環境での展開の複雑さ | 数千台規模のサーバーに同時デプロイ可能 |
ダウンタイムの発生 | ブルー/グリーンデプロイによる無停止更新 |
ロールバックの困難さ | 自動ロールバック機能での素早い復旧 |
デプロイの進捗把握が困難 | リアルタイムモニタリングと詳細なログ |
CodeDeploy の主要な機能と特徴を詳しく解説
- デプロイメント設定の柔軟性
- インプレース更新とブルー/グリーンデプロイの選択
- カナリアデプロイによる段階的なリリース
- カスタマイズ可能なデプロイライフサイクル
- 高度な自動化機能
- デプロイトリガーの自動検知
- 条件に基づく自動ロールバック
- デプロイ履歴の自動記録
- 堅牢なセキュリティ
- IAMロールベースのアクセス制御
- 暗号化されたアプリケーションの展開
- AWS KMSとの統合
他のAWSサービスとの連携で広がる可能性
CodeDeployは、AWS環境内の様々なサービスと緊密に連携します:
- 開発ライフサイクルの統合
- CodeCommit: ソースコード管理
- CodeBuild: ビルド・テスト自動化
- CodePipeline: パイプライン構築
- 監視・ロギング
- CloudWatch: メトリクス監視
- CloudTrail: API活動ログ
- SNS: 通知連携
- インフラストラクチャ
- Auto Scaling: 自動スケーリング連携
- Elastic Load Balancing: トラフィック制御
- Systems Manager: サーバー管理
このように、AWS CodeDeployは単なるデプロイツールではなく、モダンなDevOpsプラクティスを実現するための重要な基盤となります。次のセクションでは、実際のCodeDeploy環境構築手順について詳しく解説していきます。
CodeDeploy環境構築の具体的な手順
CodeDeployの環境構築は、適切なIAM設定から始まり、アプリケーションの設定、そしてデプロイ設定ファイルの作成へと進みます。ここでは、実践的な手順を詳しく解説します。
必要なIAMロールと権限設定を理解する
CodeDeployを利用するには、主に2つのIAMロールが必要です:
- CodeDeployサービスロール
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:CompleteLifecycleAction", "autoscaling:DeleteLifecycleHook", "autoscaling:DescribeAutoScalingGroups", "autoscaling:DescribeLifecycleHooks", "autoscaling:PutLifecycleHook", "autoscaling:RecordLifecycleActionHeartbeat", "ec2:DescribeInstances", "ec2:DescribeInstanceStatus", "tag:GetTags", "tag:GetResources" ], "Resource": "*" } ] }
- EC2インスタンスロール
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::your-deployment-bucket/*", "arn:aws:s3:::aws-codedeploy-*" ] } ] }
アプリケーションとデプロイメントグループの作成方法
- アプリケーションの作成
# AWS CLIを使用したアプリケーション作成 aws deploy create-application \ --application-name MyApplication \ --compute-platform Server # デプロイメントグループの作成 aws deploy create-deployment-group \ --application-name MyApplication \ --deployment-group-name MyDeploymentGroup \ --service-role-arn arn:aws:iam::account-id:role/CodeDeployServiceRole \ --deployment-style deploymentType=IN_PLACE,deploymentOption=WITH_TRAFFIC_CONTROL \ --ec2-tag-set Key=Environment,Value=Production
- デプロイメントグループの設定項目
- デプロイメント設定(AllAtOnce/OneAtATime/HalfAtATime)
- 環境タグ指定
- Auto Scalingグループの関連付け
- デプロイメントスタイルの選択
- アラーム設定
- トリガー設定
appspec.yml ファイルの設定例と解説
appspec.ymlは、デプロイメントプロセスを制御する重要な設定ファイルです。
version: 0.0 os: linux files: - source: / destination: /var/www/html/ hooks: BeforeInstall: - location: scripts/before_install.sh timeout: 300 runas: root AfterInstall: - location: scripts/after_install.sh timeout: 300 runas: root ApplicationStart: - location: scripts/start_application.sh timeout: 300 runas: root ValidateService: - location: scripts/validate_service.sh timeout: 300 runas: root
主要なライフサイクルイベント説明:
イベント名 | 実行タイミング | 主な用途 |
---|---|---|
BeforeInstall | ファイルコピー前 | 事前準備、クリーンアップ |
AfterInstall | ファイルコピー後 | 設定ファイル配置、権限設定 |
ApplicationStart | アプリ起動時 | サービス起動、プロセス開始 |
ValidateService | デプロイ完了時 | ヘルスチェック、検証 |
スクリプト例(before_install.sh):
#!/bin/bash # アプリケーションディレクトリの準備 if [ -d /var/www/html ]; then rm -rf /var/www/html/* else mkdir -p /var/www/html fi # 必要なパッケージのインストール yum update -y yum install -y httpd
この環境構築手順を実行することで、CodeDeployを使用した基本的なデプロイ環境が整います。次のセクションでは、この環境を活用した様々なデプロイメント戦略について解説していきます。
デプロイメント戦略の選択と実装方法
CodeDeployは複数のデプロイメント戦略をサポートしており、システムの要件や運用方針に応じて最適な方法を選択できます。各戦略の特徴と実装方法を詳しく解説します。
インプレースデプロイメントのメリットと実装
インプレースデプロイメントは、既存のインスタンス上で直接アプリケーションを更新する方式です。
メリット:
- リソース消費が少ない
- 設定がシンプル
- デプロイ時間が短い
- コスト効率が良い
実装例:
# インプレースデプロイメント用のappspec.yml version: 0.0 os: linux files: - source: / destination: /var/www/html/ hooks: ApplicationStop: - location: scripts/stop_application.sh timeout: 300 runas: root BeforeInstall: - location: scripts/backup_existing.sh timeout: 300 runas: root AfterInstall: - location: scripts/restore_configs.sh timeout: 300 runas: root ApplicationStart: - location: scripts/start_application.sh timeout: 300 runas: root
デプロイメント設定:
aws deploy create-deployment-config \ --deployment-config-name custom-deployment-config \ --minimum-healthy-hosts type=HOST_COUNT,value=2
ブルー/グリーンデプロイメントで実現する無停止デプロイ
ブルー/グリーンデプロイメントは、新環境を別途作成し、トラフィックを切り替える方式です。
主な特徴:
項目 | 内容 |
---|---|
ダウンタイム | 実質ゼロ |
リソース要件 | 2倍必要 |
ロールバック | 即時可能 |
コスト | 一時的に増加 |
信頼性 | 非常に高い |
実装手順:
- 新環境(グリーン)の準備
# Auto Scalingグループの作成 aws autoscaling create-auto-scaling-group \ --auto-scaling-group-name green-environment \ --launch-template LaunchTemplateId=lt-0123456789abcdef0 \ --min-size 2 \ --max-size 4 \ --target-group-arns arn:aws:elasticloadbalancing:region:account-id:targetgroup/green-tg/1234567890
- デプロイ設定
# ブルー/グリーンデプロイメント用のappspec.yml version: 0.0 os: linux files: - source: / destination: /var/www/html/ hooks: BeforeAllowTraffic: - location: scripts/health_check.sh timeout: 300 runas: root AfterAllowTraffic: - location: scripts/smoke_test.sh timeout: 300 runas: root
カナリアデプロイメントによる段階的なリリース
カナリアデプロイメントは、新バージョンを段階的に展開する方式です。
実装ステップ:
- 初期設定(トラフィックの10%を新バージョンへ)
aws deploy create-deployment \ --application-name MyApp \ --deployment-group-name MyDeploymentGroup \ --deployment-config-name CodeDeployDefault.ECSCanary10Percent5Minutes
- モニタリング設定
{ "alarm-configurations": { "enabled": true, "ignorePollAlarmFailure": false, "alarms": [ { "name": "CanaryErrorRate", "namespace": "AWS/ApplicationELB", "metricName": "HTTPCode_Target_5XX_Count", "comparison": "GreaterThanThreshold", "threshold": 10 } ] } }
デプロイメントフェーズ:
フェーズ | トラフィック比率 | 観察時間 | 判断基準 |
---|---|---|---|
Phase 1 | 10% | 15分 | エラー率<1% |
Phase 2 | 30% | 15分 | レイテンシ<200ms |
Phase 3 | 60% | 15分 | CPU使用率<80% |
Phase 4 | 100% | 15分 | 全メトリクス正常 |
このように、各デプロイメント戦略には独自の特徴があり、以下の要素を考慮して選択します:
- システムの可用性要件
- リソースコスト
- リスク許容度
- 運用チームの経験
- アプリケーションのアーキテクチャ
適切な戦略を選択し、正しく実装することで、安全で効率的なデプロイメントプロセスを実現できます。
実践的なCodeDeployの運用ノウハウ
実運用におけるCodeDeployの効果的な活用方法と、安定運用のためのベストプラクティスを解説します。
デプロイ失敗時のロールバック戦略
デプロイ失敗時の迅速な復旧は、システムの信頼性維持に不可欠です。
自動ロールバックの設定例:
{ "deploymentStyle": { "deploymentOption": "WITH_TRAFFIC_CONTROL", "deploymentType": "IN_PLACE" }, "autoRollbackConfiguration": { "enabled": true, "events": [ "DEPLOYMENT_FAILURE", "DEPLOYMENT_STOP_ON_ALARM" ] }, "alarmConfiguration": { "enabled": true, "alarms": [ { "name": "HighErrorRate", "namespace": "AWS/ApplicationELB", "metricName": "HTTPCode_Target_5XX_Count", "comparison": "GreaterThanThreshold", "threshold": 10, "period": 60, "evaluationPeriods": 3 } ] } }
ロールバック手順のベストプラクティス:
- 事前準備
- デプロイ前のスナップショット作成
- 設定ファイルのバックアップ
- データベーススキーマの version 管理
- 障害検知の仕組み
- ヘルスチェックエンドポイントの実装
- カスタムメトリクスの設定
- ログ監視の自動化
- 復旧手順の自動化
#!/bin/bash # ロールバックスクリプトの例 if [ "$DEPLOYMENT_STATUS" = "FAILED" ]; then # 前回の正常バージョンを取得 LAST_SUCCESSFUL_DEPLOYMENT=$(aws deploy list-deployments \ --application-name MyApp \ --deployment-group-name MyDeployGroup \ --include-only-statuses Succeeded \ --max-items 1 \ --query 'deployments[0]' \ --output text) # ロールバックデプロイの実行 aws deploy create-deployment \ --application-name MyApp \ --deployment-group-name MyDeployGroup \ --deployment-config-name CodeDeployDefault.AllAtOnce \ --revision revisionType=S3,s3Location="{bucket=my-bucket,key=archives/$LAST_SUCCESSFUL_DEPLOYMENT.zip,bundleType=zip}" fi
CloudWatchと連携したモニタリング設定
効果的なモニタリングは、問題の早期発見と対応に不可欠です。
主要モニタリング指標:
メトリクス | 説明 | 閾値設定例 |
---|---|---|
DeploymentSuccess | デプロイ成功率 | <98% |
InstanceHealth | インスタンス正常性 | <100% |
DeploymentTime | デプロイ所要時間 | >10分 |
ErrorRate | エラー発生率 | >1% |
ResponseTime | アプリケーション応答時間 | >2秒 |
CloudWatchダッシュボード設定:
{ "widgets": [ { "type": "metric", "properties": { "metrics": [ ["AWS/CodeDeploy", "DeploymentSuccess", "Application", "MyApp"], [".", "InstanceHealth", ".", "."] ], "period": 300, "stat": "Average", "region": "ap-northeast-1", "title": "Deployment Health" } } ] }
大規模システムでの運用ベストプラクティス
- デプロイメントの段階化
- リージョン別のデプロイ
- 環境別の展開順序
- トラフィック量による制御
- パフォーマンス最適化
# 大規模環境向けappspec.yml設定 version: 0.0 os: linux files: - source: / destination: /var/www/html/ file_exists_behavior: OVERWRITE hooks: BeforeInstall: - location: scripts/cleanup.sh timeout: 600 runas: root AfterInstall: - location: scripts/optimize_cache.sh timeout: 600 runas: root ApplicationStart: - location: scripts/graceful_start.sh timeout: 900 runas: root
- 運用効率化のポイント
- バッチデプロイの活用
# 複数アプリケーションの一括デプロイ for app in $(cat apps.txt); do aws deploy create-deployment \ --application-name $app \ --deployment-group-name Production \ --deployment-config-name CodeDeployDefault.OneAtATime \ --s3-location bucket=deploy-bucket,key=$app/latest.zip,bundleType=zip done
- デプロイ前チェックリストの自動化
#!/bin/bash # プリデプロイチェックスクリプト check_prerequisites() { # ディスク容量チェック DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | cut -d'%' -f1) if [ $DISK_USAGE -gt 80 ]; then echo "警告: ディスク使用率が80%を超えています" exit 1 fi # メモリ使用率チェック MEM_AVAILABLE=$(free | awk '/Mem:/ {print $7}') if [ $MEM_AVAILABLE -lt 1048576 ]; then echo "警告: 利用可能メモリが1GB未満です" exit 1 fi }
これらの運用ノウハウを適切に実装することで、大規模システムでも安定したデプロイメント運用が可能になります。
CodeDeploy のトラブルシューティング完全ガイド
CodeDeployの運用で発生する可能性のある問題とその解決方法を、実践的な視点から解説します。
よくある導入時のエラーと解決方法
- IAM権限関連のエラー
# エラーメッセージ例 An error occurred (AccessDeniedException) when calling the PutLifecycleHook operation: User: arn:aws:iam::123456789012:user/deployer is not authorized to perform: autoscaling:PutLifecycleHook on resource: arn:aws:autoscaling:*:*:*
解決手順:
# IAMポリシーの修正例 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:*", "ec2:*", "s3:*", "cloudwatch:*" ], "Resource": "*" } ] }
- エージェント接続エラー
エラーログの確認方法:
# Linux環境での確認 sudo cat /var/log/aws/codedeploy-agent/codedeploy-agent.log # Windows環境での確認 type C:\ProgramData\Amazon\CodeDeploy\log\codedeploy-agent-log.txt
一般的な解決手順:
# エージェントの再インストール sudo yum remove codedeploy-agent sudo yum install codedeploy-agent # サービスの再起動 sudo service codedeploy-agent restart # ステータス確認 sudo service codedeploy-agent status
デプロイ失敗時の原因特定と対処法
エラータイプ | 主な原因 | 対処方法 |
---|---|---|
DOWNLOAD_BUNDLE_FAILURE | S3アクセス権限不足 | IAMロールの確認と修正 |
INSTALL_RUNTIME_FAILURE | 依存関係の不足 | 必要パッケージの追加 |
SCRIPT_TIMEOUT | スクリプト実行時間超過 | タイムアウト値の調整 |
HEALTH_CONSTRAINTS | ヘルスチェック失敗 | アプリケーション状態確認 |
デバッグ用スクリプト例:
#!/bin/bash # デプロイ失敗診断スクリプト # システムリソースチェック check_system_resources() { echo "=== システムリソース状態 ===" df -h free -m top -b -n 1 } # ネットワーク接続確認 check_network() { echo "=== ネットワーク状態 ===" curl -I https://s3.amazonaws.com netstat -an | grep LISTEN } # CodeDeployエージェントログ確認 check_agent_logs() { echo "=== CodeDeployエージェントログ ===" tail -n 100 /var/log/aws/codedeploy-agent/codedeploy-agent.log } # メイン実行 check_system_resources check_network check_agent_logs
パフォーマンス最適化のためのチューニングポイント
- デプロイタイムアウトの最適化
# appspec.yml hooks: BeforeInstall: - location: scripts/before_install.sh timeout: 600 # 十分な余裕を持った設定 runas: root
- キャッシュ管理の改善
# キャッシュクリーンアップスクリプト #!/bin/bash find /tmp/codedeploy* -mtime +7 -type f -delete find /opt/codedeploy-agent/deployment-root/deployment-instructions -mtime +7 -type f -delete
- リソース使用量の最適化
# CloudWatchアラーム設定 { "MetricAlarms": [ { "AlarmName": "HighCPUUsage", "MetricName": "CPUUtilization", "Namespace": "AWS/EC2", "Period": 300, "EvaluationPeriods": 2, "Threshold": 80, "ComparisonOperator": "GreaterThanThreshold", "AlarmActions": [ "arn:aws:sns:region:account-id:NotificationTopic" ] } ] }
パフォーマンス改善チェックリスト:
- デプロイ前の最適化
- 不要なファイルの除外
- アーカイブサイズの最小化
- 依存関係の最適化
- 実行時の最適化
- 並列実行の活用
- リソース使用量の監視
- キャッシュの効果的な利用
- 監視と分析
- メトリクスの継続的な収集
- ボトルネックの特定
- 傾向分析による予防的対応
これらのトラブルシューティング手法を理解し、適切に実践することで、CodeDeployの安定運用が実現できます。
CodeDeploy を使った継続的なデプロイメントの実現
CodeDeployを中心とした継続的デプロイメントパイプラインの構築方法と、実践的な自動化の実現方法を解説します。
CodePipeline との連携による自動化の実現
CodePipelineを使用して、ソースコードの変更から本番環境へのデプロイまでを完全自動化できます。
パイプライン設定例:
{ "pipeline": { "name": "MyAppPipeline", "roleArn": "arn:aws:iam::account-id:role/CodePipelineServiceRole", "stages": [ { "name": "Source", "actions": [ { "name": "Source", "actionTypeId": { "category": "Source", "owner": "AWS", "provider": "CodeCommit", "version": "1" }, "configuration": { "RepositoryName": "MyAppRepo", "BranchName": "main" } } ] }, { "name": "Build", "actions": [ { "name": "Build", "actionTypeId": { "category": "Build", "owner": "AWS", "provider": "CodeBuild", "version": "1" }, "configuration": { "ProjectName": "MyAppBuild" } } ] }, { "name": "Deploy", "actions": [ { "name": "Deploy", "actionTypeId": { "category": "Deploy", "owner": "AWS", "provider": "CodeDeploy", "version": "1" }, "configuration": { "ApplicationName": "MyApp", "DeploymentGroupName": "Production" } } ] } ] } }
buildspec.yml の設定例:
version: 0.2 phases: install: runtime-versions: nodejs: 18 pre_build: commands: - npm install - npm test build: commands: - npm run build post_build: commands: - aws deploy push --application-name MyApp --s3-location s3://my-bucket/app.zip --ignore-hidden-files artifacts: files: - '**/*' base-directory: 'dist'
GitHub アクションズとの統合方法
GitHub ActionsからCodeDeployを活用する方法を解説します。
.github/workflows/deploy.yml の例:
name: Deploy to AWS on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ap-northeast-1 - name: Create deployment package run: | zip -r deploy.zip . -x "*.git*" - name: Upload to S3 run: | aws s3 cp deploy.zip s3://my-deployment-bucket/ - name: Create CodeDeploy Deployment run: | aws deploy create-deployment \ --application-name MyApp \ --deployment-group-name Production \ --s3-location bucket=my-deployment-bucket,key=deploy.zip,bundleType=zip
セキュリティベストプラクティスの実装
- シークレット管理
# AWS Systems Managerパラメータストアの利用 aws ssm put-parameter \ --name "/myapp/database/password" \ --value "MySecurePassword" \ --type SecureString # デプロイスクリプトでの参照 PASSWORD=$(aws ssm get-parameter \ --name "/myapp/database/password" \ --with-decryption \ --query Parameter.Value \ --output text)
- セキュリティスキャンの自動化
# CodeBuildでのセキュリティスキャン組み込み version: 0.2 phases: install: commands: - npm install - npm install snyk -g pre_build: commands: - snyk test - snyk code test build: commands: - npm run build - npm audit
- デプロイ時の権限管理
フェーズ | 必要な権限 | 制限事項 |
---|---|---|
ビルド | CodeBuildサービスロール | S3書き込み, ECR push |
デプロイ | CodeDeployサービスロール | EC2アクセス, ELB制御 |
実行時 | EC2インスタンスロール | S3読み取り, SSM参照 |
IAMポリシーの最小権限の例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": [ "arn:aws:s3:::my-deployment-bucket/*" ] }, { "Effect": "Allow", "Action": [ "ssm:GetParameter", "ssm:GetParameters" ], "Resource": [ "arn:aws:ssm:region:account-id:parameter/myapp/*" ] } ] }
これらの実装により、セキュアで効率的な継続的デプロイメントパイプラインを構築できます。