【保存版】AWS CodeDeployで実現する自動デプロイ環境構築の完全ガイド2024 -導入から運用まで解説

AWS CodeDeploy とは?初心者でもわかる基礎知識

AWS CodeDeployは、Amazon Web Services(AWS)が提供する完全マネージド型のデプロイサービスです。EC2インスタンス、オンプレミスサーバー、Lambda関数、ECSサービスなど、様々なコンピューティングサービスへのアプリケーションデプロイを自動化できます。

CodeDeploy が解決するデプロイの課題とは

従来のデプロイプロセスには、以下のような課題が存在していました:

課題CodeDeployによる解決策
手動デプロイによるヒューマンエラーデプロイプロセスの完全自動化
大規模環境での展開の複雑さ数千台規模のサーバーに同時デプロイ可能
ダウンタイムの発生ブルー/グリーンデプロイによる無停止更新
ロールバックの困難さ自動ロールバック機能での素早い復旧
デプロイの進捗把握が困難リアルタイムモニタリングと詳細なログ

CodeDeploy の主要な機能と特徴を詳しく解説

  1. デプロイメント設定の柔軟性
  • インプレース更新とブルー/グリーンデプロイの選択
  • カナリアデプロイによる段階的なリリース
  • カスタマイズ可能なデプロイライフサイクル
  1. 高度な自動化機能
  • デプロイトリガーの自動検知
  • 条件に基づく自動ロールバック
  • デプロイ履歴の自動記録
  1. 堅牢なセキュリティ
  • IAMロールベースのアクセス制御
  • 暗号化されたアプリケーションの展開
  • AWS KMSとの統合

他のAWSサービスとの連携で広がる可能性

CodeDeployは、AWS環境内の様々なサービスと緊密に連携します:

  1. 開発ライフサイクルの統合
  • CodeCommit: ソースコード管理
  • CodeBuild: ビルド・テスト自動化
  • CodePipeline: パイプライン構築
  1. 監視・ロギング
  • CloudWatch: メトリクス監視
  • CloudTrail: API活動ログ
  • SNS: 通知連携
  1. インフラストラクチャ
  • Auto Scaling: 自動スケーリング連携
  • Elastic Load Balancing: トラフィック制御
  • Systems Manager: サーバー管理

このように、AWS CodeDeployは単なるデプロイツールではなく、モダンなDevOpsプラクティスを実現するための重要な基盤となります。次のセクションでは、実際のCodeDeploy環境構築手順について詳しく解説していきます。

CodeDeploy環境構築の具体的な手順

CodeDeployの環境構築は、適切なIAM設定から始まり、アプリケーションの設定、そしてデプロイ設定ファイルの作成へと進みます。ここでは、実践的な手順を詳しく解説します。

必要なIAMロールと権限設定を理解する

CodeDeployを利用するには、主に2つのIAMロールが必要です:

  1. 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": "*"
        }
    ]
}
  1. 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-*"
            ]
        }
    ]
}

アプリケーションとデプロイメントグループの作成方法

  1. アプリケーションの作成
# 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
  1. デプロイメントグループの設定項目
  • デプロイメント設定(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倍必要
ロールバック即時可能
コスト一時的に増加
信頼性非常に高い

実装手順:

  1. 新環境(グリーン)の準備
# 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
  1. デプロイ設定
# ブルー/グリーンデプロイメント用の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

カナリアデプロイメントによる段階的なリリース

カナリアデプロイメントは、新バージョンを段階的に展開する方式です。

実装ステップ:

  1. 初期設定(トラフィックの10%を新バージョンへ)
aws deploy create-deployment \
    --application-name MyApp \
    --deployment-group-name MyDeploymentGroup \
    --deployment-config-name CodeDeployDefault.ECSCanary10Percent5Minutes
  1. モニタリング設定
{
    "alarm-configurations": {
        "enabled": true,
        "ignorePollAlarmFailure": false,
        "alarms": [
            {
                "name": "CanaryErrorRate",
                "namespace": "AWS/ApplicationELB",
                "metricName": "HTTPCode_Target_5XX_Count",
                "comparison": "GreaterThanThreshold",
                "threshold": 10
            }
        ]
    }
}

デプロイメントフェーズ:

フェーズトラフィック比率観察時間判断基準
Phase 110%15分エラー率<1%
Phase 230%15分レイテンシ<200ms
Phase 360%15分CPU使用率<80%
Phase 4100%15分全メトリクス正常

このように、各デプロイメント戦略には独自の特徴があり、以下の要素を考慮して選択します:

  1. システムの可用性要件
  2. リソースコスト
  3. リスク許容度
  4. 運用チームの経験
  5. アプリケーションのアーキテクチャ

適切な戦略を選択し、正しく実装することで、安全で効率的なデプロイメントプロセスを実現できます。

実践的な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
            }
        ]
    }
}

ロールバック手順のベストプラクティス:

  1. 事前準備
  • デプロイ前のスナップショット作成
  • 設定ファイルのバックアップ
  • データベーススキーマの version 管理
  1. 障害検知の仕組み
  • ヘルスチェックエンドポイントの実装
  • カスタムメトリクスの設定
  • ログ監視の自動化
  1. 復旧手順の自動化
#!/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"
            }
        }
    ]
}

大規模システムでの運用ベストプラクティス

  1. デプロイメントの段階化
  • リージョン別のデプロイ
  • 環境別の展開順序
  • トラフィック量による制御
  1. パフォーマンス最適化
# 大規模環境向け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
  1. 運用効率化のポイント
  • バッチデプロイの活用
# 複数アプリケーションの一括デプロイ
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の運用で発生する可能性のある問題とその解決方法を、実践的な視点から解説します。

よくある導入時のエラーと解決方法

  1. 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": "*"
        }
    ]
}
  1. エージェント接続エラー

エラーログの確認方法:

# 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_FAILURES3アクセス権限不足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

パフォーマンス最適化のためのチューニングポイント

  1. デプロイタイムアウトの最適化
# appspec.yml
hooks:
  BeforeInstall:
    - location: scripts/before_install.sh
      timeout: 600  # 十分な余裕を持った設定
      runas: root
  1. キャッシュ管理の改善
# キャッシュクリーンアップスクリプト
#!/bin/bash
find /tmp/codedeploy* -mtime +7 -type f -delete
find /opt/codedeploy-agent/deployment-root/deployment-instructions -mtime +7 -type f -delete
  1. リソース使用量の最適化
# 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"
            ]
        }
    ]
}

パフォーマンス改善チェックリスト:

  1. デプロイ前の最適化
  • 不要なファイルの除外
  • アーカイブサイズの最小化
  • 依存関係の最適化
  1. 実行時の最適化
  • 並列実行の活用
  • リソース使用量の監視
  • キャッシュの効果的な利用
  1. 監視と分析
  • メトリクスの継続的な収集
  • ボトルネックの特定
  • 傾向分析による予防的対応

これらのトラブルシューティング手法を理解し、適切に実践することで、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

セキュリティベストプラクティスの実装

  1. シークレット管理
# 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)
  1. セキュリティスキャンの自動化
# 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
  1. デプロイ時の権限管理
フェーズ必要な権限制限事項
ビルド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/*"
            ]
        }
    ]
}

これらの実装により、セキュアで効率的な継続的デプロイメントパイプラインを構築できます。