見出し画像

AWS LightsailとGitHub Actionsを活用してCI/CD環境構築してみた

AWS LightsailとGitHub Actionsの概要

AWS Lightsailについて

AWS Lightsailは、小規模なビジネスや個人開発者に最適なクラウドプラットフォームです。使いやすく、低コストで、インスタンス、コンテナサービス、データベースなどを手軽に利用できます。特に、LightsailのコンテナサービスはDockerコンテナの簡単なデプロイと管理を実現し、柔軟なスケーリングが可能です。

GitHub Actionsとの連携

GitHub Actionsは、コードの変更に基づく自動ビルドやデプロイを行うCI/CDツールです。GitHubと直接統合されており、開発プロセスを効率的かつ迅速に自動化することが可能です。

どんなプロジェクトに最適か?

  1. スタートアップや小規模ビジネス:低コストで手軽に始められ、成長に合わせて簡単にスケールアップできるため。

  2. リソースが限られたプロジェクト:費用対効果が高く、最小限のリソースで効率的な開発を実現できるため。

  3. 迅速な開発とリリースが求められるプロジェクト:GitHub Actionsによる自動ビルドとデプロイで、開発サイクルを短縮できるため。

  4. クラウド技術に慣れていない開発者:直感的な操作でインフラストラクチャを管理でき、技術的な障壁が低いため。

環境設定

AWS Lightsailでのコンテナサービスのセットアップ

  1. Lightsailダッシュボードにアクセス

  2. コンテナサービスの作成:「コンテナ」タブから新しいコンテナサービスを作成。

  3. イメージとデプロイメントの設定:Dockerイメージを選択し、必要に応じて環境変数やポート設定を行う。

  4. サービスのデプロイ:設定を確認し、サービスをデプロイ。

Lightsailデータベース(PostgreSQL)の構成

  1. データベースの作成:Lightsailダッシュボードで「データベース」タブから新しいデータベースを作成。

  2. データベースの設定:インスタンスのサイズ、リージョン、データベース名などを設定。

  3. アクセス制御の設定:セキュリティグループを設定してアクセス制御を行う。

  4. データベースの接続と使用:提供される接続情報を使用してデータベースにアクセスし、アプリケーションに統合。

Dockerfileの構成

概要

  1. ベースイメージの選択:PHPを実行するための基本イメージ(例:`php:8.1-apache`)を指定します。

  2. 依存関係のインストール:必要なパッケージや拡張機能をインストールします。例えば、`libpq-dev`や`postgresql-client`など。

  3. アプリケーションソースのコピー:アプリケーションのソースコードをイメージにコピーします。

  4. Composerの使用:PHPの依存関係管理ツールであるComposerを使用して、必要なライブラリをインストールします。

  5. ポートの公開:アプリケーションが外部からアクセスできるようにポートを公開します(例:`EXPOSE 80 443`)。

  6. 実行コマンドの指定:コンテナが起動時に実行するコマンドを定義します。

Dockerfileの実装例

以下は、PHPとApacheを使用するアプリケーションのためのDockerfileの実装例です。

# ベースイメージの指定
FROM php:8.1-apache

# 必要なパッケージのインストール
RUN apt-get update && apt-get install -y \
    libpq-dev \
    postgresql-client \
    locales \
    git \
    && docker-php-ext-install pdo pdo_pgsql \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Composerのインストール
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
    && php composer-setup.php --install-dir=/usr/local/bin --filename=composer \
    && php -r "unlink('composer-setup.php');"

# アプリケーションソースのコピー
COPY . /var/www/html/

# Composerを使用して依存関係をインストール
RUN composer install --working-dir=/var/www/html

# ポートの公開
EXPOSE 80 443

# コンテナ起動時のコマンド(Apacheを前景で実行)
CMD ["apache2-foreground"]

このDockerfileは、PHPの拡張機能のインストール、Composerによる依存関係の管理、アプリケーションソースのコピーなど、基本的なステップを含んでいます。また、80番ポートと443番ポートを公開し、Apacheサーバーを前景で実行するように設定しています。

CI/CD環境の構築

GitHubワークフローとは?

GitHub Workflowは、GitHub Actionsを使用して自動化されたプロセスを構築するための仕組みです。これにより、コードのビルド、テスト、デプロイなどの一連の作業を自動的に実行できます。ワークフローはYAMLファイルで定義し、GitHubリポジトリ内に保存します。トリガー(例えば、プッシュやプルリクエスト)が発生すると、定義されたジョブやステップが順番に実行され、ビルドやテスト、デプロイまで自動で実行されます。

ワークフローの実装例

ワークフローの概要

  • トリガー: `main`ブランチに対する`push`イベント。

  • 環境: Ubuntu

  • ステップ:

    1. リポジトリのチェックアウト: GitHubリポジトリからコードを取得。

    2. Dockerイメージのビルド: `myapplication:latest`としてDockerイメージをビルド。

    3. AWS認証設定: AWSの認証情報をセットアップ。

    4. DockerイメージのLightsailへのプッシュ: ビルドしたイメージをAWS Lightsailにプッシュ。

    5. 最新イメージタグの取得: Lightsailにプッシュした最新のイメージタグを取得。

    6. Lightsailコンテナサービスへのデプロイ: 取得したイメージタグを使って、指定されたポートとヘルスチェック設定でLightsailコンテナサービスにデプロイ。

実装例

以下のファイルをリポジトリの`.github/workflows`に配置します。

name: Deploy to MyApplication

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repository
      uses: actions/checkout@v2

    - name: Build Docker image
      run: |
        docker build -t myapplication:latest .

    - name: AWS credentials setup
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ap-northeast-1

    - name: Push Docker image to Lightsail
      run: |
        aws lightsail push-container-image --service-name myapplication-service --label app --image myapplication:latest

    - name: Retrieve latest image tag
      run: |
        echo "IMAGE_TAG=$(aws lightsail get-container-images --service-name myapplication-service --query 'containerImages[0].image' --output text)" >> $GITHUB_ENV

    - name: Deploy to Lightsail Container Service
      run: |
        aws lightsail create-container-service-deployment --service-name myapplication-service --containers '{"app-container":{"image":"${{ env.IMAGE_TAG }}"}}' --public-endpoint '{"containerName":"app-container","containerPort":80,"healthCheck":{"path":"/"}}'

GitHubシークレットについて

GitHubシークレットとは

GitHubワークフローでは、GitHubのシークレットを使用して機密情報を管理し、セキュアにCI/CDプロセスを実行できます。このワークフローではAWSの認証情報はGitHubシークレットを介して提供され、Lightsailにイメージをプッシュする際に使用されます。これにより、安全かつ効率的にアプリケーションのデプロイメントを自動化することが可能です。

設定手順

  1. GitHubリポジトリへアクセス:GitHubで対象のリポジトリを開きます。

  2. 設定に移動:リポジトリページの上部にある「Settings」タブをクリックします。

  3. シークレットへ移動:左側のサイドバーから「Secrets」を選択し、「New repository secret」ボタンをクリックします。

  4. シークレットの作成:シークレットの名前を入力し、値に機密情報(例:AWSのアクセスキー)を入力します。

  5. 保存:「Add secret」ボタンをクリックしてシークレットを保存します。

この手順により、GitHubワークフロー内で安全に機密情報を使用することができます。シークレットはワークフロー内で環境変数として参照され、CI/CDプロセスに組み込まれます。

まとめ

AWS LightsailとGitHub Actionsを使用したCI/CD環境構築のプロセスを詳細に解説しました。AWS Lightsailでのコンテナサービスとデータベースのセットアップ、Dockerfileの構成、そしてGitHub Actionsのワークフローの実装とGitHubシークレットの利用方法について紹介しました。スタートアップやスモールビジネス、リソースに制限のあるプロジェクトにとっては、コスト効率と高速な開発サイクルを実現する手段の1つになるのではないでしょうか。

この記事が気に入ったらサポートをしてみませんか?