Day 22: CI/CDパイプラインを構築する:GitHub ActionsとAWS CodePipeline 🚀
皆さん、こんにちは!30日集中講座、Day 22へようこそ。
これまでの講座で、ローカル開発からクラウドデプロイまでを手動で行う方法を学びました。しかし、実際の開発現場では、コードの変更を自動的に検知し、テスト、ビルド、デプロイまでを一貫して自動化する仕組みが必要です。これが、 CI/CD (Continuous Integration/Continuous Delivery) パイプラインです。
今日は、CI/CDの概念を理解し、代表的なツールであるGitHub Actionsを使って、ECRへのイメージプッシュを自動化するパイプラインを構築する方法を学びます。
1. CI/CDパイプラインとは?
CI/CDパイプラインは、ソフトウェア開発における以下のプロセスを自動化するワークフローです。
- CI (継続的インテグレーション): 開発者がコードをリポジトリにプッシュするたびに、自動的にテストとビルドを実行するプロセスです。
- CD (継続的デリバリー/デプロイメント): CIが完了したビルド成果物を、自動でステージング環境や本番環境にデプロイするプロセスです。
CI/CDパイプラインを構築することで、開発者はデプロイの複雑さから解放され、より多くの時間を機能開発に集中できるようになります。
2. CI/CDツール:GitHub Actions vs AWS CodePipeline
コンテナデプロイメントのCI/CDパイプラインを構築する際に、よく使われるツールを比較してみましょう。
項目 | GitHub Actions | AWS CodePipeline |
---|---|---|
中心となるプラットフォーム | GitHub | AWS |
主なユースケース | GitHubリポジトリを起点とした柔軟なワークフロー | AWSサービス(CodeBuild, CodeDeployなど)をフル活用したパイプライン |
パイプラインの定義 |
.github/workflows/ 下のYAMLファイル |
AWSコンソールまたはCloudFormation/CDK |
今回は、GitHubリポジトリを起点とするGitHub Actionsを使って、ECRへのイメージプッシュを自動化するワークフローを構築します。
3. GitHub Actionsでコンテナパイプラインを構築する
前提条件と準備
この演習を始める前に、以下の準備が完了していることを確認してください。
- Day 6で作成したPythonアプリケーションのコードがGitHubリポジトリにプッシュされていること。
- AWS ECRリポジトリが事前に作成されていること。
ECRリポジトリがまだ作成されていない場合は、以下のコマンドで作成しておきましょう。
# ECRリポジトリの作成(AWS CLI)
aws ecr create-repository --repository-name my-web-app --region ap-northeast-1
ステップ1: GitHubシークレットの設定
AWSの認証情報をGitHubに安全に保管するため、リポジトリの「Settings」→「Secrets and variables」→「Actions」で、以下のシークレットを設定します。
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_REGION
-
ECR_REPOSITORY
(my-web-app
のようにECRで作成したリポジトリ名と一致させてください)
💡 セキュリティの注意点
ECRへのイメージプッシュにはAdministratorAccess
のような広範な権限は不要です。 AmazonEC2ContainerRegistryFullAccess
など、必要最小限の権限を持つ専用IAMユーザーを作成して使用しましょう。
ステップ2: GitHub Actionsワークフローの作成
リポジトリのルートディレクトリに、.github/workflows/ci.yml
というファイルを作成し、以下の内容を記述します。
name: CI to ECR
on:
push:
branches:
- main
pull_request:
branches:
- main
workflow_dispatch:
jobs:
build_and_push:
name: Build and Push to ECR
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Run tests (if available)
run: |
if [ -f "requirements.txt" ]; then
pip install -r requirements.txt
fi
if [ -f "requirements-dev.txt" ]; then
pip install -r requirements-dev.txt
python -m pytest tests/ || echo "No tests found or tests failed, but continuing..."
else
echo "No test dependencies found, skipping tests"
fi
- name: Build, tag, and push image to Amazon ECR
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}
IMAGE_TAG: ${{ github.sha }}
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
このワークフローは、以下のタイミングで実行されます:
-
push
:main
ブランチへのプッシュ時(テスト + ビルド + プッシュ) -
pull_request
:main
ブランチへのプルリクエスト時(テストのみ実行) -
workflow_dispatch
: GitHubのUIから手動で実行可能
4. 動作確認と検証
ステップ3: 動作確認
ワークフローが正常に動作したかを確認しましょう。
- GitHub Actionsの確認: GitHubリポジトリの「Actions」タブでワークフローの実行状況を確認。緑のチェックマークが表示されれば成功です。
-
ECRでのイメージ確認: AWS CLIでイメージを確認します。
aws ecr list-images --repository-name my-web-app
latest
と<commit-sha>
の2つのタグが付いたイメージが確認できるはずです。 -
ローカルでのテスト(オプション)
プッシュされたイメージをローカルで実行し、正しく動作するか確認できます。※aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com docker run -p 8080:8080 <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/my-web-app:latest
<account-id>
は実際のAWSアカウントIDに置き換えてください。
5. トラブルシューティング
💡 よくある問題と解決方法
-
権限エラー:
Error: Cannot perform an interactive login from a non TTY device
-
解決方法: IAMユーザーに
AmazonEC2ContainerRegistryFullAccess
権限が付与されているか確認。
-
解決方法: IAMユーザーに
-
リポジトリが見つからない:
Error: The repository with name 'my-web-app' does not exist
-
解決方法: ECRリポジトリ名とワークフロー内の
ECR_REPOSITORY
が一致しているか確認。
-
解決方法: ECRリポジトリ名とワークフロー内の
-
Dockerfileが見つからない:
Error: unable to prepare context: unable to evaluate symlinks in Dockerfile path
- 解決方法: Dockerfileがリポジトリのルートディレクトリに存在するか確認。
6. ベストプラクティスと次へのステップ
🚀 実践のベストプラクティス
- IAM権限の最小化: ECR専用のIAMポリシーを作成し、必要最小限の権限のみを付与。
-
ブランチ戦略:
develop
ブランチでのテスト →main
ブランチでの本番デプロイという流れを検討。 - シークレットの管理: AWS認証情報は定期的にローテーションしましょう。
📚 用語集
- ワークフロー: GitHubで実行される一連の自動化されたプロセス(YAMLファイルで定義)。
- ジョブ: ワークフロー内の実行単位(通常は1つの仮想マシン上で実行)。
- ステップ: ジョブ内の個別のタスク。
-
アクション: 再利用可能なコードの単位(
uses
で呼び出し)。 - シークレット: GitHubに暗号化して保存される機密情報。
これで、皆さんはCI/CDの基本を学び、ローカルのコード変更が自動でクラウドに反映される仕組みを構築する第一歩を踏み出しました。明日は、この自動化されたデプロイメントを監視し、問題を早期発見するためのモニタリング手法を学びます。
次回の予告
Day 23: コンテナのモニタリングとログ管理:Amazon CloudWatchとPrometheus
それでは、また明日お会いしましょう!