AWS LightsailとGitHub Actionsを活用してCI/CD環境構築してみた
AWS LightsailとGitHub Actionsの概要
AWS Lightsailについて
AWS Lightsailは、小規模なビジネスや個人開発者に最適なクラウドプラットフォームです。使いやすく、低コストで、インスタンス、コンテナサービス、データベースなどを手軽に利用できます。特に、LightsailのコンテナサービスはDockerコンテナの簡単なデプロイと管理を実現し、柔軟なスケーリングが可能です。
GitHub Actionsとの連携
GitHub Actionsは、コードの変更に基づく自動ビルドやデプロイを行うCI/CDツールです。GitHubと直接統合されており、開発プロセスを効率的かつ迅速に自動化することが可能です。
どんなプロジェクトに最適か?
- スタートアップや小規模ビジネス:低コストで手軽に始められ、成長に合わせて簡単にスケールアップできるため。
- リソースが限られたプロジェクト:費用対効果が高く、最小限のリソースで効率的な開発を実現できるため。
- 迅速な開発とリリースが求められるプロジェクト:GitHub Actionsによる自動ビルドとデプロイで、開発サイクルを短縮できるため。
- クラウド技術に慣れていない開発者:直感的な操作でインフラストラクチャを管理でき、技術的な障壁が低いため。
環境設定
AWS Lightsailでのコンテナサービスのセットアップ
- Lightsailダッシュボードにアクセス
- コンテナサービスの作成:「コンテナ」タブから新しいコンテナサービスを作成。
- イメージとデプロイメントの設定:Dockerイメージを選択し、必要に応じて環境変数やポート設定を行う。
- サービスのデプロイ:設定を確認し、サービスをデプロイ。
Lightsailデータベース(PostgreSQL)の構成
- データベースの作成:Lightsailダッシュボードで「データベース」タブから新しいデータベースを作成。
- データベースの設定:インスタンスのサイズ、リージョン、データベース名などを設定。
- アクセス制御の設定:セキュリティグループを設定してアクセス制御を行う。
- データベースの接続と使用:提供される接続情報を使用してデータベースにアクセスし、アプリケーションに統合。
Dockerfileの構成
概要
-
ベースイメージの選択:PHPを実行するための基本イメージ(例:
php:8.1-apache
)を指定します。 -
依存関係のインストール:必要なパッケージや拡張機能をインストールします。例えば、
libpq-dev
やpostgresql-client
など。 - アプリケーションソースのコピー:アプリケーションのソースコードをイメージにコピーします。
- Composerの使用:PHPの依存関係管理ツールであるComposerを使用して、必要なライブラリをインストールします。
-
ポートの公開:アプリケーションが外部からアクセスできるようにポートを公開します(例:
EXPOSE 80 443
)。 - 実行コマンドの指定:コンテナが起動時に実行するコマンドを定義します。
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
-
ステップ:
- リポジトリのチェックアウト: GitHubリポジトリからコードを取得。
-
Dockerイメージのビルド:
myapplication:latest
としてDockerイメージをビルド。 - AWS認証設定: AWSの認証情報をセットアップ。
- DockerイメージのLightsailへのプッシュ: ビルドしたイメージをAWS Lightsailにプッシュ。
- 最新イメージタグの取得: Lightsailにプッシュした最新のイメージタグを取得。
- 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にイメージをプッシュする際に使用されます。これにより、安全かつ効率的にアプリケーションのデプロイメントを自動化することが可能です。
設定手順
- GitHubリポジトリへアクセス:GitHubで対象のリポジトリを開きます。
- 設定に移動:リポジトリページの上部にある「Settings」タブをクリックします。
- シークレットへ移動:左側のサイドバーから「Secrets」を選択し、「New repository secret」ボタンをクリックします。
- シークレットの作成:シークレットの名前を入力し、値に機密情報(例:AWSのアクセスキー)を入力します。
- 保存:「Add secret」ボタンをクリックしてシークレットを保存します。
この手順により、GitHubワークフロー内で安全に機密情報を使用することができます。シークレットはワークフロー内で環境変数として参照され、CI/CDプロセスに安全に組み込まれます。
まとめ
この記事では、AWS LightsailとGitHub Actionsを使用したCI/CD環境構築のプロセスを詳細に解説しました。AWS Lightsailでのコンテナサービスとデータベースのセットアップ、Dockerfileの構成、そしてGitHub Actionsのワークフローの実装とGitHubシークレットの利用方法について具体的な手順を紹介しました。特に、スタートアップや小規模ビジネス、リソースに制限のあるプロジェクトにとって、これらのツールはコスト効率と迅速な開発サイクルを実現する1つの手段になるのではないでしょうか。
Discussion