こんにちは!開発チームのインフラ周りを支える先輩エンジニアです。
毎回のデプロイで「本番環境に手動でファイルをアップロードして、サービスを再起動して……」なんて、胃が痛くなるような作業をしていませんか?そして、夜中に「デプロイ失敗しました」なんてアラートが鳴り響く悪夢……もう終わりにしましょう。
今回は、「Jenkins」と「AWS」を組み合わせて、クラウドネイティブな最強のCI/CD(継続的インテグレーション/継続的デリバリー)基盤を構築する方法を解説します。
これをマスターすれば、コードをGitにプッシュするだけで、テストからAWSへのデプロイまでが全自動で行われるようになります。毎日の作業が劇的に楽になりますよ!さあ、一緒にモダンな自動化の世界へ足を踏み入れましょう。
—
1. そもそも今回作るアーキテクチャの全体像
まずは、これから私たちが構築するシステムの全体像を頭に描いてみましょう。
1. 開発者がコードをGitHubなどのリポジトリにプッシュする。
2. Jenkins(AWS EC2上で稼働)がそれを検知して自動ビルド・テストを開始。
3. ビルド成果物をAmazon S3(ストレージ)に安全に保管。
4. AWS CodeDeployがS3から成果物を受け取り、本番用EC2インスタンスへゼロダウンタイムでデプロイ。
この構成の美しいところは、Jenkinsにすべての重い処理やデプロイを直接やらせるのではなく、AWSのマネージドサービス(S3やCodeDeploy)と適切に役割分担をしている点です。これにより、将来的にシステムが巨大化しても耐えられる「スケーラブルな基盤」になります。
—
2. AWS EC2上へのJenkinsデプロイと初期セットアップ
まずは、CI/CDの心臓部となるJenkinsをAWSのEC2(仮想サーバー)上に構築します。
① EC2インスタンスの準備
- AMI: Amazon Linux 2023 または Ubuntu 22.04 LTS(今回は安定のUbuntuを想定)
- インスタンスタイプ: `t3.medium` 推奨(ビルドにはメモリとCPUが必要です。『t3.micro』だとJenkinsが起動途中に息絶えることがあるので注意!)
- セキュリティグループ:
- Port `22` (SSH: あなたのIPからのみ)
- Port `8080` (JenkinsのWebUI: 社内IPや踏み台経由に制限するのがセキュア)
② Jenkinsのインストール(Ubuntuの場合)
SSHでEC2にログインし、以下の魔法の呪文(コマンド)を順番に流し込みます。JavaのインストールからJenkinsの起動までを一気に行います。
!/bin/bash
1. Java (OpenJDK 17) のインストール
sudo apt update
sudo apt install -y fontconfig openjdk-17-jre
2. Jenkins公式リポジトリのキーとリストを追加
sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/ \
| sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null
3. Jenkinsのインストールと起動
sudo apt update
sudo apt install -y jenkins
sudo systemctl enable jenkins
sudo systemctl start jenkins
4. 初回ロック解除パスワードの表示
echo “=== 初回パスワードはこちらです ===”
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
ブラウザで `http://<あなたのEC2のパブリックIP>:8080` にアクセスし、画面の指示に従って上記のパスワードを入力し、推奨プラグインをインストールすれば初期セットアップは完了です!
—
3. S3とCodeDeploy連携のキモ(IAM権限と設定)
JenkinsがAWSリソース(S3やCodeDeploy)を操作するためには、「権限」が必要です。ここでつまずく初心者が多いので、丁寧にいきましょう。
① IAMロールの設計
EC2上で動くJenkinsに直接「AWSの権限」を持たせるために、IAMロールを作成し、Jenkinsを動かしているEC2インスタンスにアタッチ(紐付け)します。
必要な権限(ポリシー)のイメージ:
- `AmazonS3FullAccess` (学習用として。本番ではバケットを絞りましょう)
- `AWSCodeDeployFullAccess`
これで、Jenkinsはパスワードやシークレットキーをコードに書くことなく、安全にAWS APIを叩けるようになります。
—
4. 精度高い「Hello World」的パイプラインの構築
さあ、ここからが本番です!Jenkinsの「Pipeline(パイプライン)」機能を使って、コードのチェックアウトからS3アップロード、CodeDeploy実行までの流れをコード化(Infrastructure as Code)します。
Jenkinsの管理画面から「新規ジョブ作成」>「パイプライン」を選択し、以下のスクリプトを「Pipeline」の入力欄に貼り付けてみてください。
これが、今回の記事の最も美味しい部分です。しっかりコメントを入れました。
pipeline {
agent any // どのエージェント(実行環境)でも実行可能
environment {
AWS_REGION = ‘ap-northeast-1’
S3_BUCKET = ‘my-awesome-deploy-bucket-xyz’ // ご自身のS3バケット名に変更してください
APP_NAME = ‘my-web-app’
DEPLOY_GROUP = ‘my-web-app-deployment-group’
}
stages {
// ステージ1: コードの取得(今回はダミーのHTMLを作成します)
stage(‘Checkout / Prepare’) {
steps {
echo ‘=== 1. デプロイ用ファイルの準備中… ===’
sh ‘mkdir -p build_artifact’
sh ‘echo “
Hello World from Jenkins & AWS Cloud Native CI/CD!
” > build_artifact/index.html’
// CodeDeploy用の設定ファイル appspec.yml も一緒に固める
sh ‘echo “version: 0.0” > build_artifact/appspec.yml’
}
}
// ステージ2: アーティファクトのパッケージングとS3へのアップロード
stage(‘Upload to S3’) {
steps {
echo ‘=== 2. アーティファクトをZIPに圧縮してS3へアップロード ===’
sh ‘cd build_artifact && zip -r ../app.zip ‘
// AWS CLIを使ってS3にアップロード
sh “aws s3 cp app.zip s3://${S3_BUCKET}/artifacts/app_${BUILD_NUMBER}.zip”
}
}
// ステージ3: AWS CodeDeployへのデプロイ指示
stage(‘Deploy via CodeDeploy’) {
steps {
echo ‘=== 3. CodeDeployにデプロイをトリガー ===’
// S3上のZIPを指定して、CodeDeployのデプロイメントをアタッチ
sh “””
aws deploy create-deployment \
–application-name ${APP_NAME} \
–deployment-group-name ${DEPLOY_GROUP} \
–s3-location bucket=${S3_BUCKET},bundleType=zip,key=artifacts/app_${BUILD_NUMBER}.zip \
–region ${AWS_REGION}
“””
}
}
}
post {
success {
echo ‘🎉 おめでとうございます!ビルドからデプロイまでのパイプラインが完璧に成功しました!’
}
failure {
echo ‘😢 どこかでエラーが発生しました。ログを確認してください。’
}
}
}
—
5. スケーラブルな環境構築に向けたアーキテクチャの思考法
「ひとまず動いた!」ところで、プロの視点からワンランク上のアドバイスをさせてください。
今回構築した「単体のEC2でJenkinsを動かす構成」は、学習や小規模なプロジェクトには最適ですが、チームが拡大し、同時に何十個ものビルドが走るようになると、EC2のCPUやメモリが枯渇してJenkinsがフリーズします。
将来的に真のクラウドネイティブなCI/CD基盤へとスケールさせるためのステップを記しておきます。
1. Jenkins Agentの動的プロビジョニング(Docker / Kubernetes)
- 重いビルド処理をJenkinsマスター自身にやらせず、プラグイン(Docker PluginやKubernetes Plugin)を使って、「ビルドの瞬間だけ立ち上がり、終わったら消える使い捨てのコンテナ(Agent)」に処理を投げましょう。これにより、リソースの無駄遣いがなくなり、並列実行数が劇的に向上します。
2. ストレージとデータベースの外部化
- Jenkinsのビルド履歴や設定ファイルは、Amazon EFS(NFSストレージ)などに保存するように構成すると、万が一EC2インスタンスがクラッシュしても、すぐに別のインスタンスでJenkinsを復活させることができます(ステートレス化)。
—
おわりに
お疲れ様でした!今回は「Jenkins × AWS」をテーマに、EC2へのデプロイからS3、CodeDeployを繋いだモダンなパイプラインの構築までを駆け足で解説しました。
最初は覚えることが多くて難しく感じるかもしれませんが、一度この「自動化されたパイプライン」の便利さを知ってしまうと、もう手動でのデプロイには絶対に戻れなくなります。というか、戻りたくなくなります(笑)。
ぜひご自身のAWS環境で手を動かして試してみてください。あなたの開発ライフが、もっと快適でエキサイティングなものになりますように!質問があれば、いつでもコメント欄でお待ちしています。