1. ホーム
  2. 記事一覧
  3. AWS CodePipelineとGitHubで実現するCICDハンズオン

2024.04.22

AWS CodePipelineとGitHubで実現するCICDハンズオン

このハンズオンでは、AWS CodePipelineとGitHub、Elastic Beanstalkを使って、簡単なWebアプリケーションのCI/CDパイプラインを構築する方法を学びます。CI/CDの自動化により、開発プロセスの効率化と高速なリリースを実現することができます。

CI/CDの基本とAWS CodePipelineとGitHubの統合

CI/CDの基本概念とその利点

CI/CDは、ソフトウェア開発プロセスにおいて重要な役割を担っています。CI(Continuous Integration)は、開発プロセス中にコード変更を頻繁に統合するプラクティスです。これにより、ソフトウェアの品質が向上し、バグが早期に発見されやすくなります。CD(Continuous DeliveryまたはContinuous Deployment)は、ソフトウェアを継続的にデリバリーまたはデプロイするプロセスです。これにより、新しい機能や修正が迅速にリリースされるため、変化が早い市場への対応速度が向上します。

詳しくはこちらを参照してください。

https://envader.plus/article/44

CI:こまめにコードを統合して、問題を早期発見

CI(Continuous Integration)は、開発者がこまめにコードを統合することを指します。

  • 開発者たちは、それぞれ担当する部分のコードを作成
  • その後、コードをまとめて統合し、問題がないか確認
  • 問題があれば、原因を探して修正

これらにより、小さなバグを早期に発見し、最高のアプリに仕上げることができます。

CD:完成したアプリを、継続的にリリース

CD(Continuous Delivery/Deployment)は、完成したアプリを継続的にリリースすることを指します。

  • 統合で問題がなければ、すぐにアプリをリリース
  • ユーザーからの感想を聞きながら、さらに改良

こうすることで、常に最新で最高のアプリをユーザーに届け続けることができます。

CICDの利点

  • 品質の向上

    頻繁な統合が問題を早期に発見し、修正を促進。

  • リリースプロセスの加速

    自動化により、手動プロセスに比べてリリースまでの時間が短縮。

  • 透明性とコラボレーションの向上

    チーム内での変更が透明になり、コラボレーションが促進される。

  • リスクの軽減

    小さな変更を頻繁にリリースすることで、一度に多くの変更を行うリスクを回避。

AWS CodePipelineとGitHubの統合の概要と目標

AWS CodePipelineは、継続的インテグレーションと継続的デリバリーのサービスを提供するAWSのツールです。GitHubとの統合を利用することで、ソースコードの変更を自動的に検出し、ビルド、テスト、デプロイの各ステップを自動で実行するパイプラインを構築できます。

このハンズオンの目標は、みなさんがAWS CodePipelineとGitHubを使用して、基本的なCI/CDパイプラインを自分のプロジェクトに統合する方法を理解し、実践することです。具体的には、GitHubにプッシュされたコードの変更が自動的にAWSにデプロイされるプロセスを実施します。

プロジェクトの準備

ここでは、Node.js を使用したサンプルアプリケーションの基本的なセットアップを説明します。

プロジェクトディレクトリの作成

まず、適当な場所にプロジェクトのルートディレクトリを作成します。

# プロジェクトのディレクトリを作成
mkdir my-nodejs-app
# ディレクトリに移動
cd my-nodejs-app

package.json ファイルの初期化

Node.jsプロジェクトでは、package.json ファイルがプロジェクトの構成を管理します。このファイルを自動で生成するために、npm init コマンドを使用します。対話式のプロンプトに従って情報を入力するか、npm init -y を使用してすべてのデフォルト値でファイルを生成します。

# package.jsonを初期化
npm init -y

必要な依存関係のインストール

この例では、Express.js(Webアプリケーションフレームワーク)をインストールします。Expressは、Node.jsで最も人気のあるWebサーバーフレームワークの一つです。

# Express.jsをインストール
npm install express
# macやLinuxなどsudoが必要な場合
sudo npm install express

Node.jsプロジェクトのセットアップ

  1. package.json の作成: package.jsonはプロジェクトの依存関係とスクリプトを管理するファイルです。以下はその基本的な内容です。babelをインストールした後内容は更新されます。

    {
      "name": "sample-nodejs-app",
      "version": "1.0.0",
      "description": "A simple Node.js application",
      "main": "server.js",
      "scripts": {
        "start": "node server.js",
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "dependencies": {
        "express": "^4.19.2"
      },
      "author": "",
      "license": "ISC"
    }

    このファイルを作成し、プロジェクトディレクトリのルートに保存します。

  2. server.js の作成: server.jsはExpressベースのWebサーバーを定義します。以下はそのサンプルコードです。srcディレクトリの配下に作成します。

    const express = require('express');
    const app = express();
    
    app.get('/', (req, res) => {
      res.send('Hello World!');
    });
    
    const port = process.env.PORT || 3000;
    app.listen(port, () => {
      console.log(`Server running on http://localhost:${port}`);
    });

    このスクリプトは、ルートURLにアクセスした際に "Hello World!" を表示するシンプルなHTTPサーバーを起動します。

  3. buildspec.yml の作成: buildspec.ymlはAWS CodeBuildで使用されるビルド仕様を定義します。以下はその例です。ルートディレクトリにbuildディレクトリを作成しておいてください。

    version: 0.2
    phases:
    install:
        runtime-versions:
        nodejs: 14
        commands:
        - echo Installing source NPM dependencies...
        - npm install
    build:
        commands:
        - echo Build started on `date`
        - echo Running build...
        - npm run build
    artifacts:
    files:
        - '**/*'
    base-directory: 'build'

    このファイルはビルドの各フェーズで実行するコマンドを定義します。install フェーズで依存関係がインストールされ、build フェーズでアプリケーションがテストされ、起動されます。

Babelの設定

Babelをインストールして設定するプロセスは、プロジェクトで最新のJavaScript (ES6+) 機能を使用し、古いブラウザーや環境でも動作するようにトランスパイルするために重要です。以下は、Babelをインストールし、基本的な設定を行うためのステップです。

Babelのインストール手順

  1. 必要なパッケージのインストール

    Babelを使うためには、まずは基本的なパッケージをインストールする必要があります。これには@babel/core@babel/cli、および環境に応じたプリセットが含まれます。

    npm install --save-dev @babel/core @babel/cli @babel/preset-env
  2. Babelの設定ファイルの作成

    Babelを適切に動作させるためには、プロジェクトのルートに.babelrcファイルまたはbabel.config.jsonファイルを作成し、そこに設定を記述します。一般的には.babelrcが使われます。

    .babelrcの例:

    {
      "presets": ["@babel/preset-env"]
    }

    この設定は、最新のJavaScriptを自動的にトランスパイルするための環境設定をBabelに指示します。

  3. Babelを使用したビルドスクリプトの設定

    package.jsonscriptsセクションにビルドスクリプトを追加します。このスクリプトは、ソースファイルをBabelを通じてトランスパイルし、出力を指定されたディレクトリに保存します。

    "scripts": {
      "build": "babel src -d build"
    }

    このコマンドはsrcディレクトリ内のJavaScriptファイルをトランスパイルし、結果をbuildディレクトリに保存します。

  4. ビルドの実行

    設定が完了したら、以下のコマンドを実行してJavaScriptファイルをトランスパイルできます。

    npm run build

これで、Babelがプロジェクトにインストールされ、基本的な設定が行われ、ソースコードのトランスパイルが可能になります。これにより、ES6+ のコードを古いJavaScript環境でも動作するように変換できます。

ディレクトリ構成

/my-nodejs-app/
├── src/
│   └── server.js       # サーバーのメインファイル
├── node_modules/       # npmによってインストールされる依存関係のディレクトリ
├── build/              # buildのアーティファクトが出力されるディレクトリ
├── .gitignore          # Gitの追跡から除外するファイル/ディレクトリを指定
├── package.json        # プロジェクトの依存関係とスクリプトを定義
├── package-lock.json   # 実際の依存関係のツリーを記録したファイル(npmが自動生成)
└── buildspec.yml       # AWS CodeBuildのビルド仕様を定義

これらのファイルをプロジェクトディレクトリに配置し、GitHubにプッシュすることでAWS CodePipelineでの自動ビルドとデプロイの基盤が整います。

GitHubとAWSの基本設定

ここでは、CI/CDパイプラインを構築するために必要なGitHubのリポジトリ準備とAWS CodePipelineの基本設定を説明します。事前準備として、GitHubアカウントとAWSアカウントが必要です。また、AWS CLIがローカルシステムにインストールされ、適切に設定されていることを確認してください。

GitHub リポジトリの準備

  1. リポジトリの作成

    GitHubにログインし、新しいリポジトリを作成します。リポジトリ名は分かりやすい名前を選びましょう(例:my-ci-cd-project)。

    リポジトリの公開設定を選択します。プライベートリポジトリの場合はアクセス権を持っているユーザーのみが閲覧できますが、公開リポジトリの場合は誰でもアクセス可能です。

    リポジトリを作成後、提供されるURLを使ってローカル環境にクローンします(例:git clone https://github.com/your-username/my-ci-cd-project.git)。

  2. サンプルアプリケーションのプッシュ

    クローンしたリポジトリディレクトリに移動し、サンプルアプリケーションのファイルを追加します。これは任意の簡単なWebアプリケーションやハローワールドプログラムでも構いません。

    サンプルアプリケーションのコードをリポジトリに追加し、コミットしてGitHubにプッシュします。

    git add .
    git commit -m "Initial commit of sample application"
    git push origin main

AWS Elastic Beanstalk 環境のセットアップ

  • Elastic Beanstalk アプリケーションの作成
    • AWS Management Consoleにログイン
    • 「Services」から「Elastic Beanstalk」を選択
    • 「アプリケーションを作成」をクリックし、アプリケーション名を入力(例:MyNodeJsApp)
  • 環境情報
    • 環境名その他はデフォルトのまま
  • プラットフォーム
    • プラットフォームとして「Node.js」を選択
    • アプリケーションコードのソースオプションで「Sample application」を選択して環境を作成 これは、初期セットアップのために便利です。後で自分のアプリケーションコードに置き換えることができます。

AWS CodePipeline の基本設定

  1. AWS CLIの設定

    AWS CLIがまだインストールされていない場合は、AWSの公式サイトからダウンロードしてインストールし、aws configureコマンドを使用してAWSの認証情報を設定します。

    必要な情報は、AWSアクセスキーID、シークレットアクセスキー、リージョン、出力フォーマットです。

  2. CodePipelineの設定

    • AWS Management Consoleにログインし、CodePipelineサービスを開く
    • 「パイプラインを作成」を選択し、パイプライン名を入力
    • ソースプロバイダーとして「GitHub」を選択し、GitHubアカウントとの接続を設定
      • GitHubのリポジトリとブランチを指定して、ソースステージを設定

ビルドステージとデプロイステージの設定は後のセクションで詳しく説明します。

AWS CodePipeline の構築

GitHub リポジトリの接続

  • パイプラインの設定
    • AWS Management Consoleにログインし、「CodePipeline」サービスにアクセス。
    • 「パイプラインの作成」をクリックし、パイプライン名を入力(例: NodeJSAppPipeline)。
    • 新しいサービスロールを作成するか、既存のロールを選択し、次へ進みます。
  • ソースプロバイダの選択
    • ソースプロバイダとして「GitHub (Version 2)」を選択。
    • 「接続を作成」をクリックし、GitHubとの接続を設定。これにはGitHubアカウントの認証が必要です。
    • 接続が完了したら、対象のGitHubリポジトリとブランチを選択し、「次へ」をクリックします。

AWS CodeBuild を使用したビルドプロジェクトの設定

  • ビルドプロジェクトの作成
    • ビルドプロバイダとして「AWS CodeBuild」を選択。
    • 「新しいビルドプロジェクトを作成」を選択し、プロジェクト名(例: NodeJSAppBuild)、ビルド環境(例: 標準イメージ、Node.jsランタイム)、およびビルド仕様として先に作成した buildspec.yml を指定します。
  • ビルド仕様の設定
    • buildspec.yml はビルドコマンドとアーティファクトの設定を含みます。テストとビルドプロセスが含まれています。
    • ビルドプロジェクトの詳細を設定し、「次へ」をクリックします。

AWS Elastic Beanstalkへのデプロイメント設定

  • デプロイプロバイダの選択
    • デプロイプロバイダとして「AWS Elastic Beanstalk」を選択します。
    • Elastic Beanstalkのアプリケーション名と環境名を指定します。これらはAWS Elastic Beanstalkで事前に設定するか、新規に作成する必要があります。
  • デプロイプロセスの設定
    • Elastic Beanstalkにデプロイするための設定を完了し、アーティファクトが正しくデプロイされるようにします。
    • パイプラインの全ステージの設定をレビューし、「パイプラインの作成」をクリックします。

これで、GitHubからのソースコードの変更が自動的にAWS CodePipelineを通じてビルドされ、さらにテストされ、AWS Elastic Beanstalkにデプロイされるプロセスが完全に設定されます。パイプラインが正しく設定されていれば、GitHubに新しいコードがプッシュされるたびに自動的にビルドからデプロイまでのプロセスが進行することができます。これにより、開発サイクルが大幅に効率化され、ソフトウェアのリリースプロセスが加速されます。

パイプラインの動作確認

  • 動作テスト

    パイプラインが正しく設定された後、GitHubリポジトリに小さな変更をプッシュして、パイプラインが期待通りに動作するかテストします。例えば、server.jsに新しいHTTPエンドポイントを追加し、変更をコミットしてプッシュします。

    AWS CodePipelineがこの変更を検出し、ビルドとデプロイのプロセスを自動的に開始するはずです。

  • モニタリングとログ

    AWS Management ConsoleからCodePipelineの進行状況をモニタリングできます。各ステージ(ソース、ビルド、デプロイ)での実行状態や、エラーが発生した場合の詳細情報を確認することができます。

    AWS CloudWatchを利用して、ビルドプロセスやデプロイプロセス中のログを詳細に追跡することもできます。これはデバッグ時や、パフォーマンスの監視に非常に役立ちます。

パイプラインの維持と改善

  • パイプラインの更新

    パイプラインを定期的に見直し、必要に応じて更新することが重要です。新しいライブラリの導入、ビルドプロセスの最適化、セキュリティパッチの適用など、プロジェクトの進展に合わせてパイプラインを調整する必要があります。

  • セキュリティとコンプライアンス

    ソフトウェア開発におけるセキュリティは極めて重要です。AWS CodePipelineやElastic Beanstalkの設定を定期的に見直し、不要なアクセス権限がないか、適切なセキュリティグループが設定されているか確認しましょう。

このように、AWS CodePipelineを使用することで、コードの変更からビルド、テスト、デプロイメントまでの全プロセスを自動化し、継続的なデリバリーを効率的に実現することができます。

学んだことと参考資料

以上を通じて、AWSのさまざまなサービスを使用してアプリケーションのデプロイメントを行う方法について学びました。具体的には、AWS CodePipelineを使ってCI/CDプロセスを構築し、AWS Elastic BeanstalkおよびAWS EC2でアプリケーションをデプロイする手順を詳しく解説しました。

主な学びのポイント

  1. AWS CodePipelineの設定

    CodePipelineを使用して、ソースコードの変更が自動的に検出され、ビルドおよびデプロイメントプロセスがトリガーされるように設定しました。

  2. AWS Elastic Beanstalkの利用

    管理が容易で、スケーリング機能を備えたElastic Beanstalkを使用してアプリケーションを簡単にデプロイしました。

  3. AWS EC2へのデプロイメント

    よりカスタマイズ可能なEC2インスタンスを使用して、特定のニーズに合わせてアプリケーションを設定し、デプロイする方法を学びました。

  4. Babelの導入

    モダンなJavaScriptを使用しながらも、古いブラウザーや環境で問題なく動作するように、Babelを用いてコードをトランスパイルする方法を説明しました。

参考リソース

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事