🐡

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

2023/12/11に公開

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-devpostgresql-clientなど。
  3. アプリケーションソースのコピー:アプリケーションのソースコードをイメージにコピーします。
  4. Composerの使用:PHPの依存関係管理ツールであるComposerを使用して、必要なライブラリをインストールします。
  5. ポートの公開:アプリケーションが外部からアクセスできるようにポートを公開します(例:EXPOSE 80 443)。
  6. 実行コマンドの指定:コンテナが起動時に実行するコマンドを定義します。

Dockerfileの実装例

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

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に配置します。

deploy.yml
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つの手段になるのではないでしょうか。

Discussion