【AWS SAP】AWS CodePipelineとは

# AWS CodePipelineとは
- ソフトウェアリリースの自動化を支援するCI/CDサービス
- コードの**ビルド**、**テスト**、**デプロイメント**を自動化
- GitHubやS3などのソースリポジトリ、CodeBuildやCodeDeployなどと連携

## **ビルド**、**テスト**、**デプロイメント**とは？
- **ビルド**
    - コードをコンパイルして実行可能な形式に
- **テスト**
    - 自動化されたスクリプトで品質を確認
- **デプロイ**
    - 問題がないコードを本番環境にリリース

## CodePipelineがないと何が大変なのか
### 1. ビルド（手動の場合）
開発者がローカル環境やサーバー上で手動でソースコードをコンパイルする必要がある。
必要な依存関係を手動でインストールし、ビルドツール（例: Maven、Gradle、npmなど）を利用してアプリケーションを作成する。成果物を適切なディレクトリに配置し、確認する必要がある。例えば、mvn clean installを手動で実行し、結果を確認。

### 2. テスト（手動の場合）
ローカルまたは特定のサーバーでテストスクリプトを手動で実行する必要がある。
例えば、pytestやnpm testコマンドを使用してユニットテストや統合テストを確認。また、テスト結果を一つ一つチェックし、失敗したケースがあれば修正を繰り返す。自動化ツールがない場合、手動でエンドツーエンドテストを行うことも。

### 3. デプロイ（手動の場合）
ビルド済みの成果物（例: .jar, .zipファイル）を手動でFTPやSSHでターゲットサーバーにアップロードする必要がある。
サーバーに適切に配置した後、設定ファイルを調整し、必要なサービスを再起動。クラウド環境ではAWS管理コンソールで手作業で設定やデプロイを行う場合も多い。

## CodePipelineがあると自動化できる？
できます。それぞれの解説は以下の通り。

### 1. ビルドの自動化
- 手動の問題
    - コマンド実行や環境設定が必要で、手間がかかる
- 自動化
    - CodePipelineは**CodeBuild**と統合してビルドプロセスを自動化。**必要な依存関係を自動的に取得**し、定義済みのビルドスクリプトに基づいてコードをコンパイルする
- 効果
    - 一貫性のある成果物が迅速に生成され、手動ミスが排除される

### 2. テストの自動化
- 手動の問題
    - テストスクリプトの実行や結果確認を手動で行うため、時間がかかりエラーが見落とされる可能性がある
- 自動化
    - CodePipelineはビルドステージ後にテストを自動実行可能。例えば、CodeBuildでテストスクリプトを定義し、結果を自動収集
- 効果
    - テスト結果を迅速に確認でき、バグの早期発見が可能
### 3. デプロイの自動化
- 手動の問題
    - 成果物のアップロード、設定変更、デプロイ手順をすべて手作業で行う必要がある
- 自動化
    - CodePipelineはCodeDeployや他のサービスと連携して、ステージング環境や本番環境へのデプロイを自動化
- 効果
    - ダウンタイムを最小化し、安定したリリースが可能

## 全体の流れ
1. コードの変更がリポジトリにプッシュされると自動でパイプラインが起動
2. ビルド、テスト、デプロイが順に実行され、失敗時は通知が送信される
3. 成功時には新しいバージョンが本番環境で稼働

```mermaid
flowchart TD
    A[コードの変更<br>（GitHub/S3）] -->|トリガー| B[CodePipeline開始]
    B --> C[ビルドステージ<br>（CodeBuild）]
    C -->|成功| D[テストステージ<br>（CodeBuild/カスタムスクリプト）]
    D -->|成功| E[デプロイステージ<br>（CodeDeploy）]
    E -->|成功| F[リリース完了<br>（本番環境）]
    C -->|失敗| G[ビルド失敗通知<br>（SNS/CloudWatch）]
    D -->|失敗| H[テスト失敗通知<br>（SNS/CloudWatch）]
    E -->|失敗| I[デプロイ失敗通知<br>（SNS/CloudWatch）]

    style A fill:#ffcc99,stroke:#333,stroke-width:2px
    style B fill:#f9f,stroke:#333,stroke-width:2px
    style F fill:#99ccff,stroke:#333,stroke-width:2px
```


## AWS CodePipelineにおける各ステージと連携サービス
## 1. ビルド
### 目的
ソースコードを実行可能な形式に変換。

### 連携可能なサービス
- **AWS CodeBuild**: メインのビルドサービス。依存関係の解決やコンパイルを自動化
- **サードパーティツール**: JenkinsやTeamCityなど、CodePipelineに統合してビルドを実行可能
- **S3**: ビルド後の成果物を一時保存
- **ECR (Elastic Container Registry)**: Dockerイメージの作成・保存

### 具体例
ソースコードをCodeCommitやGitHubから取得し、CodeBuildでコンパイルしてS3に成果物を保存。

## 2. テスト
### 目的
コードの品質と機能を検証。

### 連携可能なサービス
- **AWS CodeBuild**: テストスクリプトを実行し、結果を取得
- **CloudWatch Logs**: テスト結果をログとして保存
- **Third-party CI/CDツール**: JenkinsやGitLab CI/CDでカスタムテスト
- **Lambda**: カスタムロジックでテストを実行
- **Device Farm**: モバイルアプリのテストに利用

### 具体例
CodeBuildでユニットテストを実行し、結果をCloudWatch Logsに記録して可視化。

## 3. デプロイ
### 目的
本番環境やステージング環境に成果物を配置。

### 連携可能なサービス
- **AWS CodeDeploy**: EC2、ECS、Lambdaなどに自動デプロイ
- **Amazon ECS**: コンテナベースのアプリケーションをデプロイ
- **CloudFormation**: インフラストラクチャをコードとしてデプロイ
- **S3**: 静的ウェブサイトのホスティングに利用
- **Elastic Beanstalk**: フルマネージド環境にアプリケーションを展開
- **AWS App Runner**: コンテナアプリケーションの簡単デプロイ

### 具体例
ビルド済みアプリケーションをCodeDeployでECSにデプロイし、サービスを更新

## 全体の連携例
1. **ビルド**: CodeBuildでコードをコンパイルし、成果物をS3またはECRに保存。
2. **テスト**: CodeBuildでテストスクリプトを実行し、結果をCloudWatchに記録。
3. **デプロイ**: CodeDeployを使ってEC2またはECSに成果物を自動配置。

## まとめ

| ステージ | 目的 | 連携可能なサービス | 具体例 | 補足 |
|----------|------|--------------------|---------|------|
| ビルド   | ソースコードを実行可能な形式に変換 | - **AWS CodeBuild**: メインのビルドサービス。依存関係の解決やコンパイルを自動化。<br>- **サードパーティツール**: JenkinsやTeamCityなど。<br>- **S3**: ビルド後の成果物を一時保存。<br>- **ECR (Elastic Container Registry)**: Dockerイメージの作成・保存。 | ソースコードをCodeCommitやGitHubから取得し、CodeBuildでコンパイルしてS3に成果物を保存。 | |
| テスト   | コードの品質と機能を検証 | - **AWS CodeBuild**: テストスクリプトを実行し、結果を取得。<br>- **CloudWatch Logs**: テスト結果をログとして保存。<br>- **Third-party CI/CDツール**: JenkinsやGitLab CI/CDでカスタムテスト。<br>- **Lambda**: カスタムロジックでテストを実行。<br>- **Device Farm**: モバイルアプリのテストに利用。 | CodeBuildでユニットテストを実行し、結果をCloudWatch Logsに記録して可視化。 | |
| デプロイ | 本番環境やステージング環境に成果物を配置 | - **AWS CodeDeploy**: EC2、ECS、Lambdaなどに自動デプロイ。<br>- **Amazon ECS**: コンテナベースのアプリケーションをデプロイ。<br>- **CloudFormation**: インフラストラクチャをコードとしてデプロイ。<br>- **S3**: 静的ウェブサイトのホスティングに利用。<br>- **Elastic Beanstalk**: フルマネージド環境にアプリケーションを展開。<br>- **AWS App Runner**: コンテナアプリケーションの簡単デプロイ。 | ビルド済みアプリケーションをCodeDeployでECSにデプロイし、サービスを更新。 | |