Contents
AWS環境におけるCI/CD自動化の概要
AWS環境での継続的インテグレーション・デリバリー(CI/CD)は、開発から運用までのプロセスを効率化するための重要な技術です。Jenkinsを活用することで、コード変更時の自動テストやデプロイを実現し、人為的なミスを削減できます。本記事では、AWS EC2へのJenkins導入やCodePipelineとの連携といった具体的な手順をステップバイステップで解説します。対象となる主な作業は以下の通りです。
- JenkinsサーバーのEC2インスタンス構築
- CodePipelineとJenkinsジョブの統合設計
- S3バケットとALBを介したアプリケーションデプロイフロー構築
- GitHubリポジトリ連携時のイベント自動起動設定
- セキュリティグループの適切なポート開放方法
AWS EC2インスタンスへのJenkins導入手順
JenkinsをAWSで利用するには、まずEC2インスタンス上に導入する必要があります。以下の手順に従うことで、開発環境を整えられます。
EC2インスタンスの事前準備
- AMI選定:
AmazonLinux2023やUbuntu Server 22.04 LTSなど、Jenkinsが動作するOSイメージを選択します。 - セキュリティグループ設定:SSH接続用にポート22を開放し、JenkinsのWebインターフェースアクセスに使用するポート(通常8080)も許可します。
- キーペア作成:SSH接続時に必要となるため、事前にAWSマネジメントコンソールから生成してください。
Jenkinsのインストールと初期設定
-
EC2インスタンスにSSHで接続後、Java環境を確認・導入します。以下のようにコマンドを実行します:
bash
sudo yum install -y java-17-openjdk-devel -
Jenkinsのリポジトリ登録とパッケージインストールを行います:
bash
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
sudo yum install -y jenkins -
Jenkinsサービスを起動し、初期設定でアクセス権を許可します。
セキュリティグループの適切なポート開放
- SSH(22):リモート接続用に必須です。
- Jenkins Webインターフェース(8080):ブラウザからアクセスするため、このポートを許可します。
- VPC内での通信制限:他のAWSサービスとやり取りする際は、セキュリティグループで最小限の通信範囲に限定しましょう。
CodePipelineとの連携設定方法
JenkinsとAWS CodePipelineを連携させることで、開発ライフサイクル全体を自動化できます。以下の手順に従って統合フローを作成します。
CodePipelineアカウントの作成
- AWSコンソールからCodePipelineサービスを開き、「新規パイプライン」を選択します。
- Source(ソース)ステージではGitHubリポジトリを指定し、Build(ビルド)ではJenkinsジョブを参照するように設定します。
Jenkinsジョブとの統合フロー設計
- JenkinsジョブはCodePipelineからスクリプト形式で呼び出されるため、
Jenkinsfile内にpipelineブロックを記述し、ステージごとに処理を分離します。 - Test(テスト)ステージでは、ユニットテストや静的解析を行うツール(例:JUnit、SonarQube)を利用します。
ステージごとのビルド・テスト・デプロイの設定
| ステージ | 説明 | 必要なリソース |
|---|---|---|
| Source | GitHubからコードを取得する | Gitリポジトリ、SSHキーペア |
| Build | Jenkinsでビルド処理を実行 | ビルドスクリプト(Mavenなど) |
| Deploy | AWS CodeDeployにデプロイする | CodeDeployアプリケーション設定 |
S3バケットとALBの統合デプロイフロー
S3とApplication Load Balancer(ALB)を連携させることで、ロードバランサー経由でのデプロイフローを構築できます。
S3へのアーカイブ構成
- バージョン管理付きのS3バケットを作成し、ビルド成果物を格納します。
- Jenkinsジョブ内では
aws s3 cpコマンドで成果物をアップロードさせます。
Application Load Balancerの初期設定
- ALBに「HTTPSリスナー」を設定し、証明書(AWS Certificate Manager)を取得・割り当てます。
- ターゲットグループとしてEC2インスタンスやFargateコンテナを選択し、ヘルスチェックを構成します。
JenkinsからALBへの自動リダイレクト処理
- デプロイステージでは、S3にアップロードされたファイルをAWS CLI経由でALBのターゲットグループへ配信させます。
- ALBは自動的に最新バージョンのアプリケーションを提供します。
GitHubリポジトリ連携時のイベントトリガー設定
GitHubからのプッシュやプルリクエスト時に自動ビルドを実行するには、Webhookの設定が必要です。
WebhookのURL生成と認証
- Jenkinsで「Manage Jenkins」→「Configure System」からGitHubプラグインを有効化します。
- Webhook URLは、
https://<Jenkinsホスト>:8080/github-webhook/形式になります。
プッシュ・プルリクエストイベントの指定
- GitHubリポジトリ内の「Settings」→「Webhooks」にURLを登録します。
- Payload URLとContent type(JSON)を入力し、Push eventsやPull request eventsを選択します。
JenkinsでのGitクローン処理の最適化
Jenkinsfile内にcheckout scmコマンドを使用することで、リポジトリから最新コードを取得できます。- セキュリティ上は、Personal Access Tokenで認証を行うことを推奨します。
セキュリティグループ・ポート設定のベストプラクティス
セキュリティグループの適切な設定はインフラの安全性に直結するため、以下のように設計する必要があります。
Jenkinsサーバー用セキュリティグループ設計
- 入力ルール:SSH(22)、Jenkins Webインターフェース(8080)を許可し、Source IP範囲は最小限に設定します。
- 出力ルール:S3やCodePipelineとの通信に必要なポート(443など)を開放するのみとします。
必要なポートと外部アクセス制限
| ポート | 説明 | 有効範囲 |
|---|---|---|
| 22 | SSH接続用 | 開発者IP限定 |
| 8080 | Jenkins UIアクセス | 内部ネットワーク限定 |
| 443 | HTTPS通信(S3/CodePipeline) | 外部から許可 |
定期的なポリシー見直し手順
- 月1回のセキュリティレビューで、不要なポート開放やIP範囲を削除します。
- VPC内での通信経路最適化を実施し、EC2間での暗号化通信(TLS)を強制する設定も検討しましょう。
- Jenkins CI/CDの導入とAWS環境構築は、以下の順序で進めます:
- EC2インスタンスの準備 → Jenkinsインストール → CodePipelineとの連携 → S3・ALB統合デプロイ → GitHubイベントトリガー設定 → セキュリティグループ最適化
- 具体的な手順と設定値は、AWSマネジメントコンソールやJenkins Webインターフェースで確認可能です。
- 設定ミスを防ぐために、各ステップのテスト実行(例:手動デプロイ→自動デプロイ)を行いましょう。