Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Day 52: CI/CD pipeline on AWS pt 3

2025年09月19日に「Dev.to」が公開したITニュース「Day 52: CI/CD pipeline on AWS pt 3」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

AWS CodeDeployは、EC2などの環境へアプリケーションのデプロイを自動化するサービスだ。`appspec.yml`ファイルでデプロイ手順を定義し、EC2準備やエージェント導入後、変更をCodeCommitにプッシュすれば、設定に基づき自動的に更新が反映される。

出典: Day 52: CI/CD pipeline on AWS pt 3 | Dev.to公開日:

ITニュース解説

AWS CodeDeployは、アプリケーションのデプロイ作業を自動化するためのAWSサービスだ。システムエンジニアが開発したアプリケーションを、テスト環境や本番環境のサーバーへ手作業で展開するのは時間も手間もかかり、ミスも発生しやすい。CodeDeployはこのようなデプロイ作業を自動化し、効率的かつ安全にアプリケーションを配布する手助けをする。CodeDeployは、Amazon EC2インスタンス、オンプレミスサーバー、AWS Lambda関数、Amazon ECSサービスといった様々な環境にアプリケーションを展開できる。また、アプリケーションのコードがAmazon S3、GitHub、Bitbucket、AWS CodeCommitといった様々なコードリポジトリに保存されていても対応可能だ。このサービス最大の利点の一つは、既存のアプリケーションコードに手を加える必要がないことだ。CodeDeployがデプロイに必要な一連のステップを自動で管理してくれるため、開発者はアプリケーションの中身に集中できる。

CodeDeployがアプリケーションをどのようにデプロイすればよいかを指示するために、「appspec.yml」という設定ファイルを使用する。このファイルは、アプリケーションのソースコードと一緒にリポジトリに保存され、CodeDeployに「どのファイルをどこにコピーするか」「インストール後にどんなコマンドを実行するか」といった具体的な手順を伝える重要な役割を持つ。appspec.ymlの典型的な構造は、まず「version」でファイルのバージョンを指定し、「os」でターゲットとするオペレーティングシステム(例えばLinux)を指定する。次に「files」セクションでは、デプロイするファイルの「source」(リポジトリ内の場所)と、ターゲットサーバー上の「destination」(コピー先の場所)を指定する。例えば、index.htmlというファイルをサーバーの/usr/share/nginx/html/というディレクトリにコピーするように指定できる。そして、「hooks」セクションがCodeDeployの強力な機能の一つだ。これは、デプロイの各段階(例えば、ファイルがインストールされた後や、アプリケーションが起動する前など)で特定のスクリプトを実行するように指示する場所だ。記事の例では、「AfterInstall」というフックが使われている。これはファイルがサーバーにコピーされた後に実行されることを意味する。このフックの下には、「location」で実行するスクリプトのパス(例:scripts/restart_nginx.sh)、「timeout」でスクリプトの最大実行時間、「runas」でスクリプトを実行するユーザー(例:root)を指定する。このrestart_nginx.shスクリプトがNginxというWebサーバーを再起動する役割を担い、新しいindex.htmlが確実にWebブラウザに表示されるようにする。つまり、appspec.ymlはCodeDeployにとっての「デプロイ手順書」と言える。

CodeDeployを使ってアプリケーションをデプロイする前に、デプロイ先のサーバーとなるEC2インスタンスを準備する必要がある。EC2インスタンスはAWS上で利用できる仮想サーバーのことで、Amazon Linux 2というOSが推奨されている。このインスタンスには、まずWebサーバーソフトウェアであるNginxをインストールする。具体的には、sudo yum update -yでシステムを最新の状態にし、sudo amazon-linux-extras install nginx1 -yでNginxをインストールする。その後、sudo systemctl start nginxでNginxサービスを起動し、sudo systemctl enable nginxでサーバーが再起動した際にもNginxが自動的に起動するように設定する。これにより、EC2インスタンスがWebサーバーとして機能する準備が整う。

EC2インスタンスがCodeDeployからの指示を受け取ってデプロイを実行するためには、「CodeDeployエージェント」という特別なソフトウェアをインストールする必要がある。このエージェントはEC2インスタンス上で動作し、CodeDeployサービスと通信してデプロイコマンドを受信し、appspec.ymlで定義された手順を実行する。エージェントのインストール手順は以下の通りだ。まず、sudo yum update -yで再度システムを最新の状態にする。次に、sudo yum install ruby wget -yで、エージェントのインストールに必要なRubyとwgetというツールをインストールする。その後、/home/ec2-userディレクトリに移動し、wget https://aws-codedeploy-<region>.s3.<region>.amazonaws.com/latest/installコマンドを使って、AWSのS3バケットからインストールスクリプトをダウンロードする。<region>の部分は、利用しているAWSリージョン(例えばus-east-1など)に置き換える必要がある。ダウンロードしたスクリプトは実行権限がないため、chmod +x ./installで実行権限を付与し、sudo ./install autoコマンドでエージェントをインストールする。最後に、sudo systemctl start codedeploy-agentでCodeDeployエージェントサービスを起動し、sudo systemctl enable codedeploy-agentでNginxと同様にサーバー起動時に自動的にエージェントも起動するように設定する。これでEC2インスタンスがCodeDeployの指示を受けてデプロイを実行できる状態になる。

準備が整ったら、いよいよ実際のデプロイ作業に移る。まず、アプリケーションのソースコードが保存されているCodeCommitリポジトリに、先に説明したappspec.ymlファイルと、Nginxを再起動するためのrestart_nginx.shスクリプトをscripts/ディレクトリ内に作成し、追加する。restart_nginx.shの中身は#!/bin/bashでシェルスクリプトであることを宣言し、systemctl restart nginxと記述するだけのシンプルなものだ。これらのファイルをリポジトリに追加したら、git addgit commitgit pushコマンドを使って、変更内容をCodeCommitにアップロードする。

次に、AWSマネジメントコンソールにログインし、CodeDeployサービスを開く。ここで、まず「アプリケーション」を作成する。アプリケーションはデプロイ対象となるソフトウェアを意味し、デプロイタイプとして「EC2/オンプレミス」を選択する。次に、そのアプリケーションの下に「デプロイグループ」を作成する。デプロイグループでは、実際にデプロイを行うターゲットとなるEC2インスタンスを指定し、CodeDeployがAWSリソースを操作するための権限を持つ「サービスロール」を選択する。アプリケーションとデプロイグループが作成できたら、いよいよ「デプロイ」を開始する。デプロイ作成時には、先ほど更新したCodeCommitリポジトリと、デプロイ対象のブランチ(通常はmainなど)を指定する。デプロイを開始すると、CodeDeployはCodeCommitから最新のコード(appspec.ymlindex.htmlを含む)を取得し、デプロイグループで指定されたEC2インスタンスへファイルをコピーし始める。appspec.ymlの指示に従い、index.html/usr/share/nginx/html/にコピーされ、AfterInstallフックで指定されたscripts/restart_nginx.shが実行され、Nginxが再起動される。デプロイが完了したら、WebブラウザでEC2インスタンスのパブリックIPアドレスまたはDNS名にアクセスして、index.htmlの内容が正しく表示されるかを確認する。これで、CodeDeployによる自動デプロイパイプラインの一部分が正常に機能したことを確認できる。この一連のプロセスは、アプリケーションのリリース作業を大幅に簡素化し、人的ミスを減らし、開発者がより多くの時間を新しい機能の開発に費やせるようにするものだ。